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

时间:2013-01-20 22:05:38

标签: android google-maps google-maps-markers

我有一个小的android问题(google maps v2 api)

这是我的代码:

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

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

也许有人有想法?我尝试了getProjection,但它看起来没有用。 谢谢! :)

2 个答案:

答案 0 :(得分:79)

是的,请使用Projection课程。更具体地说:

  1. 获取地图的Projection

    Projection projection = map.getProjection();
    
  2. 获取标记的位置:

    LatLng markerLocation = marker.getPosition();
    
  3. 将位置传递给Projection.toScreenLocation()方法:

    Point screenPosition = projection.toScreenLocation(markerLocation);
    
  4. 这就是全部。现在screenPosition将包含标记相对于整个地图容器左上角的位置:)

    修改

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

    1. 通过膨胀从布局XML文件创建地图
    2. 初始化地图。
    3. 向地图添加标记。
    4. 在地图上查询Projection屏幕上的标记位置。
    5. 这不是一个好主意,因为地图没有设置有效的宽度和高度。您应该等到这些值有效。其中一个解决方案是将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);
              }
          });
      }
      

      请仔细阅读评论以获取更多信息。

答案 1 :(得分:1)

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