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

Posted

技术标签:

【中文标题】如何从谷歌地图v2 android中的标记获取屏幕坐标【英文标题】:How to get screen coordinates from marker in google maps v2 android 【发布时间】:2013-01-03 23:46:21 【问题描述】:

我有一个小的 android 问题(谷歌地图 v2 api)

这是我的代码:

GoogleMaps mMap;
Marker marker =  mMap.addMarker(new MarkerOptions().position(new LatLng(20, 20)));

我正在尝试找到一种方法来获取此标记对象的当前屏幕坐标 (x,y)。

也许有人有想法?我尝试了 getProjection 但它看不到工作。 谢谢! :)

【问题讨论】:

【参考方案1】:

是的,使用Projection 类。更具体地说:

    获取Projection的地图:

    Projection projection = map.getProjection();
    

    获取标记的位置:

    LatLng markerLocation = marker.getPosition();
    

    将位置传递给Projection.toScreenLocation() 方法:

    Point screenPosition = projection.toScreenLocation(markerLocation);
    

就是这样。现在screenPosition 将包含标记相对于整个地图容器左上角的位置:)

编辑

请记住,Projection 对象只会在地图通过布局过程后返回有效值(即它具有有效的widthheight 集)。您可能会收到(0, 0),因为您试图过早地访问标记的位置,就像在这种情况下一样:

    通过扩展 XML 布局文件来创建地图 初始化地图。 向地图添加标记。 查询地图的Projection 以获取屏幕上的标记位置。

这不是一个好主意,因为地图没有设置有效的宽度和高度。您应该等到这些值有效。解决方案之一是将OnGlobalLayoutListener 附加到地图视图并等待布局过程解决。在扩展布局并初始化地图后执行此操作 - 例如在onCreate()

// map is the GoogleMap object
// marker is Marker object
// ! here, map.getProjection().toScreenLocation(marker.getPosition()) will return (0, 0)
// R.id.map is the ID of the MapFragment in the layout XML file
View mapView = getSupportFragmentManager().findFragmentById(R.id.map).getView();
if (mapView.getViewTreeObserver().isAlive()) 
    mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
        @Override
        public void onGlobalLayout() 
            // remove the listener
            // ! before Jelly Bean:
            mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            // ! for Jelly Bean and later:
            //mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            // set map viewport
            // CENTER is LatLng object with the center of the map
            map.moveCamera(CameraUpdateFactory.newLatLngZoom(CENTER, 15));
            // ! you can query Projection object here
            Point markerScreenPosition = map.getProjection().toScreenLocation(marker.getPosition());
            // ! example output in my test code: (356, 483)
            System.out.println(markerScreenPosition);
        
    );

请通读 cmets 了解更多信息。

【讨论】:

这也是我的问题,它总是说 0,0。我地图的当前位置默认为 0,0 latlng。标记在 20,20,所以它应该在 800x400 像素上给我大约 300x 100y。 @andr 非常感谢,它就像一个魅力。您对布局过程的看法是正确的,这就是问题所在。 有时getViewTreeObserver 在侦听器中不存在,即使在addOnGlobalLayoutListener 之前存在。 @IdemaxGreen 假设您在 UI 线程中完成所有操作,如果观察者不存在,则意味着视图已被合并或移动到视图层次结构中。这可能是由您(通过重新设置地图视图)或 UI 框架中的某些逻辑引起的 - 例如 Fragment 相关的东西,如事务或内容可能被交换的东西(或多或少是 ViewPager)。一个简单的解决方案可能是在 Runnable 中查询地图视图,您可以使用以下方法安排地图视图执行:mapView.post(new Runnable public void run() /* your listener code here */); onGlobalLayout 从来没有为我打电话!【参考方案2】:

toScreenLocation 似乎已被 fromLatLngToPoint 取代 用于投影的 gmaps api 文档:https://developers.google.com/maps/documentation/javascript/reference/image-overlay#Projection

【讨论】:

以上是关于如何从谷歌地图v2 android中的标记获取屏幕坐标的主要内容,如果未能解决你的问题,请参考以下文章

从谷歌地图上的标记中获取地名

从谷歌地图 API 的 v2 升级到 v3,建议

从谷歌标记获取纬度/经度

使用标记从谷歌地图获取纬度/经度坐标

试图从谷歌地图获取纬度是通过 Android 中的意图返回 null

如何从angularJS中的谷歌地图标记获取动态位置