我在应用程序中包含了一个地图。我需要地图放大标记和用户位置,但保持标记居中。放大效果很好,但当然不会将标记置于地图中心。
@Override
public void onLocationChanged(Location location) {
if (mListener != null) {
mListener.onLocationChanged(location);
LatLngBounds bounds = new LatLngBounds.Builder()
.include(new LatLng(location.getLatitude(),location.getLongitude()))
.include((new LatLng(52.3563, 4.8790)))
.build();
mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 35));
}
}
将两者保持在界限内但保持标记居中的最佳方法是什么?我似乎无法在官方文档中找到解决方案。
答案 0 :(得分:6)
我会调用两个函数,一个用于居中标记,另一个用于放大地图,直到您的当前位置仍然可见。
我的缩放比例缩放到点的解决方案:
myMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLngToCenter, 1));
缩放直到所有标记仍然可见(更改代码以适合标记和您的位置):
public void fitZoomAndPositionToMapByMarkers() {
int minLat = Integer.MAX_VALUE;
int maxLat = Integer.MIN_VALUE;
int minLon = Integer.MAX_VALUE;
int maxLon = Integer.MIN_VALUE;
List<MyMapMarker> markersShownOnMap = getMarkersToShow();
for (MyMapMarker item : markersShownOnMap) {
int lat = (int) (item.getLatitude() * 1E6);
int lon = (int) (item.getLongitude() * 1E6);
maxLat = Math.max(lat, maxLat);
minLat = Math.min(lat, minLat);
maxLon = Math.max(lon, maxLon);
minLon = Math.min(lon, minLon);
}
double latitudeToGo = (maxLat + minLat) / 1E6 / 2;
double longitudeToGo = (maxLon + minLon) / 1E6 / 2;
LatLng toCenter = new LatLng(latitudeToGo, longitudeToGo);
centerCameraToProperPosition(toCenter);
LatLng southWestLatLon = new LatLng(minLat / 1E6, minLon / 1E6);
LatLng northEastLatLon = new LatLng(maxLat / 1E6, maxLon / 1E6);
zoomInUntilAllMarkersAreStillVisible(southWestLatLon, northEastLatLon);
}
希望这有帮助!
private void zoomInUntilAllMarkersAreStillVisible(final LatLng southWestLatLon, final LatLng northEastLatLon) {
myMap.setOnCameraChangeListener(new OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition arg0) {
myMap.moveCamera(CameraUpdateFactory.newLatLngBounds(new LatLngBounds(southWestLatLon, northEastLatLon), 50));
myMap.setOnCameraChangeListener(null);
}
});
}
答案 1 :(得分:2)
您好我找到了一个使用LatLngbounds的简单方法:
googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(new LatLngBounds(latlngSW, latlngNE, 50));
这个函数将使用最多的SW点和最多的NE点来创建一个矩形,以50个填充为中心,但你需要首先检查哪一个点应作为第一个或第二个参数给出,这里是我的代码:
public void centerMap(LatLng latLng){
if(fenceMarker != null){
LatLngBounds center;
LatLng fence = fenceMarker.getPosition();
if(fence.latitude < latLng.latitude || fence.longitude < latLng.longitude)
center = new LatLngBounds(fenceMarker.getPosition(), latLng);
else{
center = new LatLngBounds(latLng, fenceMarker.getPosition());
}
googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(center, 50));
}
}
2分是我的位置latLng和我对GeoFence,fenceMarker的标记。
我从onLocationChanged()调用此函数centerMap(latLng):
@Override
public void onLocationChanged(Location location) {
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
centerMap(latLng);
}
答案 2 :(得分:0)
设置边界 -
方法的重载, newLatLngBounds(边界,宽度,高度,填充)允许您为矩形指定宽度和高度(以像素为单位) ,意图是这些对应于地图的尺寸。矩形的位置,其中心与地图视图的中心相同(因此,如果指定的尺寸与地图视图的尺寸相同,则矩形与地图的视图重合) 。返回的CameraUpdate将移动摄像机,使指定的 LatLngBounds在给定矩形内的屏幕中心处于最大可能的缩放级别,同时考虑所需的填充。
参考 - https://developers.google.com/maps/documentation/android/views#target_location