18

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

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

在此处输入图像描述

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

4

3 回答 3

46

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

于 2013-04-17T16:04:19.893 回答
12

我从几个回复中找到了 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;

    @覆盖
    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。通过屏幕的最大边和两个点,我们可以得到地图中心的半径。

    @覆盖
    公共无效 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。

我希望会有用!

于 2013-10-21T15:44:10.933 回答
3

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

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 ;
}
于 2018-03-21T17:36:11.050 回答