如何在v2 android地图中获取地图中心?

83
在Google Maps for Android v1中,MapView有一个方便的方法:getMapCenter()。现在我无法弄清楚如何使用此API的v2获取地图中心。我已经浏览了API文档,但没有提到这样的功能。请给予建议。
谢谢, Igor
6个回答

202

我有同样的问题。看起来你可以通过以下方式找到中心:

mMap.getCameraPosition().target

mMap是你的活动中GoogleMap实例。这将返回一个LatLng对象,基本上代表地图的中心。

请注意,GeoPoint类不再可用。

根据 http://developer.android.com/reference/com/google/android/gms/maps/model/CameraPosition.html

target是“相机指向的位置”。(我使用示例代码进行了测试,对我来说可以正常工作)


1
谢谢,我没有意识到GeoPoint在v2中不可用。我原本想使用VisibleRegion对象来计算地图显示的四个角之间的中心点。 - IgorGanapolsky
@Radu Comaneci 如何使用HTML JavaScript完成相同的操作?有任何想法吗? - Ankesh kumar Jaisansaria
好的回答,但是如果我使用填充来移动版权谷歌标志,那么地图的中心也会受到这个填充值的影响。 - sdelvalle57

35

我找到了两种方法来做到这个:

1)最简单的方法是使用地图相机位置对象中的目标属性(target property)

 LatLng center = mMap.getCameraPosition().target;

2) 第二种方法是使用VisibleRegion对象:

VisibleRegion visibleRegion = mMap.getProjection()
                    .getVisibleRegion();

Point x = mMap.getProjection().toScreenLocation(
                    visibleRegion.farRight);

Point y = mMap.getProjection().toScreenLocation(
                    visibleRegion.nearLeft);

Point centerPoint = new Point(x.x / 2, y.y / 2);

LatLng centerFromPoint = mMap.getProjection().fromScreenLocation(
                    centerPoint);

我已经比较了两个答案:

Log.d("MapFragment: ", "Center From camera: Long: " + center.longitude
                        + " Lat" + center.latitude);

Log.d("Punto x", "x:" + x.x + "y:" + x.y);
Log.d("Punto y", "y:" + y.x + "y:" + y.y);

Log.d("MapFragment: ", "Center From Point: Long: "
                    + centerFromPoint.longitude + " Lat"
                    + centerFromPoint.latitude);

1
选项2对我来说给出了完全不同的答案,与选项1不同。也许是因为我有一个透明的工具栏?感谢您的提示! - Flyingkiwi
3
哪种方法是准确的? - Abdullah Shoaib
@shontauro 怎样用HTML和JavaScript实现相同的功能?有什么想法吗? - Ankesh kumar Jaisansaria
1
JavaScript 毫无头绪。 - shontauro
选项2提供了更准确的位置。谢谢。 - Amit Arora

15
您可以使用:

latlng=map.getProjection().getVisibleRegion().latLngBounds.getCenter();

使用此解决方案获得准确性。 - VVB

7

为了获取地图的中心点,我在活动中使用了onMapReady()方法,然后使用googleMap.setOnCameraChangeListener()方法来获取摄像机的位置:

@Override
public void onMapReady(GoogleMap googMap) {
    googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
        @Override
        public void onCameraChange(CameraPosition cameraPosition) {

       Log.i("centerLat",cameraPosition.target.latitude);

       Log.i("centerLong",cameraPosition.target.longitude);

        }
    });
}

5
如果您只想获取位置一次(例如,在用户停止移动地图后),请使用setOnCameraIdleListenerhttps://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnCameraIdleListener
mMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() {
    @Override
    public void onCameraIdle() {
        LatLng position = mMap.getCameraPosition().target;
        Log.d("MapActivity", "Position: " + position);
    }
});

或者使用Java 8 lambda表达式:

mMap.setOnCameraIdleListener(() -> {
    LatLng position = mMap.getCameraPosition().target;
    Log.d("MapActivity", "Position: " + position);
});

注意,使用 setOnCameraChangeListener 注册的监听器会被多次调用,正如文档所述:

此方法可能在每帧中都被调用,不应执行昂贵的操作。


3

最佳使用相机位置的方法

Java:

LatLng centerMap = googleMap.getCameraPosition().target;

kotlin:

googleMap?.cameraPosition?.target?.let {
    // it is LatLng center
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接