我希望像雷达屏幕一样,以用户所在的位置为中心,同时缩放到足以包含v2 api的目标点。现在我正在使用
bounds = new LatLngBounds.Builder().include(destPos)
.include(yourPos).build();
map.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 50));
但是这个中心位于两点之间的某个点上并且缩放以包括两者。有没有像我这样容易做的事情?或者我是否需要或多或少从头开始并进行一些数学运算(例如,计算两点之间的距离,计算LatLngBounds的lat / lng,以便用户位于定义的矩形的中心,矩形的边缘包括目的地 - 考虑地图/屏幕尺寸)?
这就是我所拥有的:
这就是我想要的:
答案 0 :(得分:4)
你自己的答案过于复杂。
您需要计算位置另一侧的点,并将其包含在LatLngBounds
中。
LatLng otherSidePos = new LatLng(2 * yourPos.latitude - destPos.latitude, 2 * yourPos.longitude - destPos.longitude);
bounds = new LatLngBounds.Builder().include(destPos)
.include(otherSidePos).build();
map.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, padding));
注意:您不希望将50像素硬编码为填充。它在不同设备上看起来会有所不同。改为使用与密度无关的像素。
答案 1 :(得分:1)
用于缩放以包括所有标记而不更改相机目标(地图中心)。
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : markers) {
builder.include(marker.getPosition());
}
LatLngBounds bounds = builder.build();
LatLng currentLoc = _googleMapView.getCameraPosition().target;
//make sure that centre location doesn't change
double deltaLat = Math.max(Math.abs(bounds.southwest.latitude - currentLoc.latitude),
Math.abs(bounds.northeast.latitude - currentLoc.latitude));
double deltaLon = Math.max(Math.abs(bounds.southwest.longitude - currentLoc.longitude),
Math.abs(bounds.northeast.longitude - currentLoc.longitude));
LatLngBounds.Builder displayBuilder = new LatLngBounds.Builder();
displayBuilder.include(currentLoc); //not necessary but hey
displayBuilder.include(new LatLng(currentLoc.latitude + deltaLat, currentLoc.longitude + deltaLon));
displayBuilder.include(new LatLng(currentLoc.latitude - deltaLat, currentLoc.longitude - deltaLon));
_googleMapView.moveCamera(CameraUpdateFactory.newLatLngBounds(displayBuilder.build(), 0));
答案 2 :(得分:0)
我想出了如何以上面给出的方式做到这一点。我为LatLngBounds设置了一个方形区域,以简化轴承编号(只要它适合屏幕,我就可以了:你可以弄清楚轴承从中心到非方形矩形的角落是什么有一些更多的trig)。我还添加了一些填充,因为点之间的距离将与从中心到东北角的对角线相同,并且这将大于从中心到顶部边缘的距离,这意味着第二个点可以在顶部边缘上方并且不可见(如果它是,例如,正北)。我从http://www.movable-type.co.uk/scripts/latlong.html和calculating Lat and Long from Bearing and Distance,
大量借用这是获取LatLngBounds的方法:
public LatLngBounds getBounds(double lat1, double lng1, double lat2,
double lng2) {
// defines a square area with point lat1,lng1 at center and includes
// point
// lat2, long2 with a buffer between edge and second point
// get distance between two points
float[] results = new float[1];
Location.distanceBetween(lat1, lng1, lat2, lng2, results);
double d = results[0];
d = (d * 1.5); // add padding. The shortest distance to an edge of the
//square box is d * cos(45 degrees). Thus it's possible that the second point will be out of the box. To compensate I make the radius larger (d * 1/cos(45) = d * 1.41). I put a bit extra so that the second point isn't right on the edge of the screen.
long R = 6371000; // distance of earth's radius in meters
d = d /(double) R;
lat1 = Math.toRadians(lat1); // Current lat point converted to radians
lng1 = Math.toRadians(lng1); // Current long point converted to radians
// calculate northeast corner of LatLngBounds
double brng = Math.toRadians(45); // bearing from center to northeast in
// radians
double resultLat1 = Math.asin(Math.sin(lat1) * Math.cos(d)
+ Math.cos(lat1) * Math.sin(d) * Math.cos(brng));
double resultLng1 = lng1
+ Math.atan2(Math.sin(brng) * Math.sin(d) * Math.cos(lat1),
Math.cos(d) - Math.sin(lat1) * Math.sin(resultLat1));
resultLat1 = Math.toDegrees(resultLat1);
resultLng1 = Math.toDegrees(resultLng1);
Log.i("My Code", "resultLat1: " + resultLat1 + " resultLng1: " + resultLng1);
LatLng northEast = new LatLng(resultLat1, resultLng1);
// calculate southwest corner of LatLngBounds. Everything is the same
// except the bearing value
brng = Math.toRadians(225); // bearing from center to southwest corner
// in radians
double resultLat2 = Math.asin(Math.sin(lat1) * Math.cos(d)
+ Math.cos(lat1) * Math.sin(d) * Math.cos(brng));
double resultLng2 = lng1
+ Math.atan2(Math.sin(brng) * Math.sin(d) * Math.cos(lat1),
Math.cos(d) - Math.sin(lat1) * Math.sin(resultLat2));
resultLat2 = Math.toDegrees(resultLat2);
resultLng2 = Math.toDegrees(resultLng2);
Log.i("My Code", "resultLat2: " + resultLat2 + " resultLng2: " + resultLng2);
LatLng southWest = new LatLng(resultLat2, resultLng2);
LatLngBounds bounds = new LatLngBounds(southWest, northEast);
return bounds;
}