3

我有一个包含在应用程序中的地图。我需要地图放大标记和用户位置,但保持标记居中。放大效果很好,但当然不会使标记在地图上居中。

@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));


    }
}

将两者都保持在边界内但保持标记居中的最佳方法是什么?我似乎无法在官方文档中找到解决方案。

4

3 回答 3

6

我会调用两个函数,一个用于使标记居中,另一个用于缩放地图,直到您的当前位置仍然可见。

我用 15 缩放级别缩放到一个点的解决方案:

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);

        }
    });

}
于 2013-02-25T09:05:21.310 回答
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 和地理围栏的标记,fenceMarker。

我从 onLocationChanged() 调用这个函数 centerMap(latLng):

@Override
public void onLocationChanged(Location location) {
    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
    centerMap(latLng);
}
于 2013-05-23T16:48:59.013 回答
0

设定界限-

方法的重载newLatLngBounds(boundary, width, height, padding)允许
您指定矩形的宽度和高度(以像素为单位),目的是使
它们对应于地图的尺寸​​。矩形的定位使其中心与地图视图的中心相同(因此,如果指定的尺寸与地图视图的尺寸相同,则矩形与地图视图重合)。返回的 CameraUpdate 将移动相机,以使指定的LatLngBounds 以最大可能的缩放级别在给定矩形内的屏幕上居中,同时考虑到所需的填充。
参考-https://developers.google.com/maps/documentation/android/views#target_location

于 2013-02-22T10:29:49.250 回答