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

Posted

技术标签:

【中文标题】如何获取 v2 android 地图的地图中心?【英文标题】:How to get center of map for v2 android maps? 【发布时间】:2012-12-03 23:29:43 【问题描述】:

在 Google Maps for android v1 中,MapView 有一个方便的方法: getMapCenter()。现在我无法弄清楚如何使用此 api 的 v2 获取地图中心。我仔细阅读了 API 文档,但没有提到这样的功能。请指教。

谢谢, 伊戈尔

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。看来您可以通过这种方式获得中心:

mMap.getCameraPosition().target

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

请注意,GeoPoint 类不再可用。

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

target 是“相机指向的位置”。 (我用示例代码对其进行了测试,对我来说效果很好)

【讨论】:

谢谢,我没有意识到 GeoPoint 在 v2 中不可用。我打算使用 VisibleRegion 对象来计算地图显示四个角之间的中点。 @Radu Comaneci 如何对 html javascript 做同样的事情?任何想法 很好的答案,但是如果我使用填充例如移动版权谷歌标志,这会受到影响,所以地图的中心也会得到这个填充值【参考方案2】:

我找到了两种方法:

1) 最简单的,首先是在Map的CameraPosition Object中使用target属性

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

【讨论】:

选项 2 给我的答案与选项 1 完全不同。也许是因为我有一个透明的工具栏?感谢您的提示! 那么哪种方法准确呢? @shontauro 如何对 html javascript 做同样的事情?任何想法 javascript 不知道。【参考方案3】:

你可以使用:

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

【讨论】:

使用此解决方案获得准确性【参考方案4】:

为了获取地图中心,我在活动中使用了 onMapReady() 方法,然后使用了googleMap.setOnCameraChangeListener() method to get position of Came

@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】:

如果您只想获得位置一次(例如,在用户停止平移地图之后),请使用setOnCameraIdleListener

https://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 注册的侦听器会被多次调用,正如documentation 所述:

这可能每帧调用一次,并且不应执行昂贵的操作。

【讨论】:

【参考方案6】:

使用 cameraPosition 的最佳方式

java:

LatLng centerMap = googleMap.getCameraPosition().target;

科特林:

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

【讨论】:

以上是关于如何获取 v2 android 地图的地图中心?的主要内容,如果未能解决你的问题,请参考以下文章

如何从谷歌地图v2 android中的标记获取屏幕坐标

如何使用适用于 Android V2 的 Google Maps 处理地图移动端?

地图没有进入模拟器android api v2

百度android地图如何获取地图中心点的经纬坐标

Google Maps Android API v2 - 检测地图上的触摸

android 百度地图上marker点移动要怎么处理