【问题标题】:Android Google Maps: How to get the area which is currently shown in screen device?Android Google Maps:如何获取屏幕设备中当前显示的区域?
【发布时间】:2013-04-17 09:27:21
【问题描述】:

有没有办法获取当前区域的坐标,显示在设备上?

背景是,我们想要显示“附近”的地方,这些地方存储在我们自己的数据库中。假设用户正在查看以下地图片段:

我们如何获得屏幕的经度/纬度(或者屏幕中间的点和覆盖一切的半径?)。请记住,地图的中心通常不是当前位置,因为用户可以移动卡片的中心!

【问题讨论】:

  • 你用的是哪个api?
  • API 至少支持 API 11,但支持 API 8-10 会很好
  • 我在询问您的地图 api 版本。是 1,2 还是 3
  • 刚刚发布的版本:Google Maps Android API v2

标签: android google-maps coordinates


【解决方案1】:

使用map.getProjection().getVisibleRegion()。从VisibleRegion 你可以得到LatLngBounds,它很容易使用。您也可以直接尝试使用可能是梯形的区域。

【讨论】:

  • 是的!正是我想要的!
【解决方案2】:

我从几个回复中找到了 Google Map API v2 的解决方案:

stackoverflow#1stackoverflow#2

所以,需要从GoogleMap.OnCameraChangeListener接口实现Activity

私有静态最终 int REQUEST_CODE_GOOGLE_PLAY_SERVECES_ERROR = -1; 私有静态最终双 EARTH_RADIOUS = 3958.75; //地球半径; 私有静态最终 int METER_CONVERSION = 1609; 私人谷歌地图 mGoogleMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_layout); int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(mContext); 如果(状态!= ConnectionResult.SUCCESS) { 对话框对话框 = GooglePlayServicesUtil.getErrorDialog(状态,活动, REQUEST_CODE_GOOGLE_PLAY_SERVECES_ERROR); 对话框.show(); mGoogleMap = null; } 别的 { mGoogleMap = ((SupportMapFragment) getFragmentManager().findFragmentById( R.id.fragment_shops_layout_maps_fragment)).getMap(); mGoogleMap.setOnCameraChangeListener(this); } }

监听器,在地图缩放时工作。确定显示在屏幕上的地图左下角、右下角、左上角和右上角的位置为LatLng。通过屏幕的最大边和两个点,我们可以得到地图中心的半径。

@Override 公共无效 onCameraChange(CameraPosition cameraPosition) { // 缩放监听器; 浮动 zoomLevel = cameraPosition.zoom; VisibleRegion visibleRegion = mGoogleMap.getProjection().getVisibleRegion(); LatLng nearLeft = visibleRegion.nearLeft; LatLng nearRight = visibleRegion.nearRight; LatLng farLeft = visibleRegion.farLeft; LatLng farRight = visibleRegion.farRight; double dist_w = distanceFrom(nearLeft.latitude, nearLeft.longitude, nearRight.latitude, nearRight.longitude); double dist_h = distanceFrom(farLeft.latitude, farLeft.longitude, farRight.latitude, farRight.longitude); Log.d("距离:","距离宽度:" + dist_w +" 距离高度:" + dist_h); }

返回 2 点之间的距离,以米为单位存储为 2 对位置;

公共双距离从(双 lat1,双 lng1,双 lat2,双 lng2) { // 返回 2 个点之间的距离,存储为 2 对位置; 双 dLat = Math.toRadians(lat2 - lat1); 双 dLng = Math.toRadians(lng2 - lng1); 双 a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.sin(dLng / 2) * Math.sin(dLng / 2); 双 c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 双距离 = EARTH_RADIOUS * c; return new Double(dist * METER_CONVERSION).floatValue(); }

如果你想得到区域半径,屏幕上显示的区域只需要除以 2。

希望对你有用!

【讨论】:

    【解决方案3】:

    这会根据地图宽度计算以公里为单位的无线电:

    public double calculateVisibleRadius() {
        float[] distanceWidth = new float[1];
        VisibleRegion visibleRegion = map.getProjection().getVisibleRegion();
        LatLng farRight = visibleRegion.farRight;
        LatLng farLeft = visibleRegion.farLeft;
        LatLng nearRight = visibleRegion.nearRight;
        LatLng nearLeft = visibleRegion.nearLeft;
        //calculate the distance between left <-> right of map on screen
        Location.distanceBetween( (farLeft.latitude + nearLeft.latitude) / 2, farLeft.longitude, (farRight.latitude + nearRight.latitude) / 2, farRight.longitude, distanceWidth );
        // visible radius is / 2  and /1000 in Km:
         return distanceWidth[0] / 2 / 1000 ;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-12
      • 2013-01-06
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2017-08-30
      • 2012-07-23
      • 1970-01-01
      相关资源
      最近更新 更多