在Android中获取可见地图的半径

时间:2015-03-24 00:23:28

标签: android google-maps location

有没有办法从中间点找到可见地图的半径?

Google Map

我希望从API获取靠近地图中心点的近处,并且该API需要lat,lng和radius。我能够从中心点获得lat和lng,但无法找到获得半径的方法。

感谢

5 个答案:

答案 0 :(得分:18)

对于Google Maps Android API,您可以通过...

获取界限

从地图参考中,Projection获取getProjection()。和,

  

投影用于在屏幕位置和地理坐标之间进行转换..

因此,从投影中,我们可以使用getVisibleRegion(),并获取地图的VisibleRegion,其中包含LatLngBounds,这是一个包含2 {{1}的类变量,一个用于边界的东北角,一个用于西南角。

所以代码看起来应该是这样的:

LatLng

= - = - = - = - = - = 编辑:

可能我太天真了,只考虑NE和SW可以解决这个问题,但仅限于用户没有旋转地图或向上倾斜3D地图的特殊情况。

相反,您可以抓住 googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { @Override public void onCameraChange(CameraPosition position) { LatLngBounds bounds = googleMap.getProjection().getVisibleRegion().latLngBounds; LatLng northeast = bounds.northeast; LatLng southwest = bounds.southwest; Context context = getApplicationContext(); CharSequence text = "ne:"+northeast+" sw:"+southwest; int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(context, text, duration); toast.show(); } }); ,它提供了4个变量,farRight,farLeft,nearRight,nearLeft,每个代表该区域的4个连接器。

然后我们可以计算该4个点的区域的宽度和高度,并选择较小的一个(好吧,有时宽度可能比我猜的高度。)

为了计算,我们可以使用VisibleRegion函数...

使代码如下所示:

Location.distanceBetween(x1,y1,x2,y2,result)

答案 1 :(得分:7)

非常感谢你的答案 @kaho ,它帮了我很多(甚至你以同样的方式计算了distanceWidth和distanceHeight)。

澄清:

  • farLeft LatLng对象,用于定义摄像机的左上角

  • farRight LatLng对象,用于定义相机的右上角

  • nearLeft LatLng对象,用于定义摄像机的左下角

  • nearRight LatLng对象,用于定义相机的右下角

已编辑:我不知道为什么我们进行简单的计算会变得有点复杂,可见半径只是 A HALF OF VISIBLE DIAGONAL LINE , #39;全部!

enter image description here

private double getMapVisibleRadius() {
        VisibleRegion visibleRegion = map.getProjection().getVisibleRegion();

        float[] diagonalDistance = new float[1];

        LatLng farLeft = visibleRegion.farLeft;
        LatLng nearRight = visibleRegion.nearRight;

        Location.distanceBetween(
                farLeft.latitude,
                farLeft.longitude,
                nearRight.latitude,
                nearRight.longitude,
                diagonalDistance
        );

        return diagonalDistance[0] / 2;
    }

我还记录了我的搜索结果,以便与@ jossef-harush的搜索结果进行比较,大致如下:

enter image description here

答案 2 :(得分:2)

全区域,甚至是角落!

我没有看到其他答案涵盖整个地图区域;

见下面的图片,为了测试它我绘制了一个圆形覆盖图来查看计算半径的边界,它不会覆盖整个地图区域。

我的修改很简单,我已经使用Pythagorean theorem找到合适的半径来包含地图"矩形"。


enter image description here


private double getMapVisibleRadius() {
    VisibleRegion visibleRegion = googleMap.getProjection().getVisibleRegion();

    float[] distanceWidth = new float[1];
    float[] distanceHeight = new float[1];

    LatLng farRight = visibleRegion.farRight;
    LatLng farLeft = visibleRegion.farLeft;
    LatLng nearRight = visibleRegion.nearRight;
    LatLng nearLeft = visibleRegion.nearLeft;

    Location.distanceBetween(
            (farLeft.latitude + nearLeft.latitude) / 2,
            farLeft.longitude,
            (farRight.latitude + nearRight.latitude) / 2,
            farRight.longitude,
            distanceWidth
    );

    Location.distanceBetween(
            farRight.latitude,
            (farRight.longitude + farLeft.longitude) / 2,
            nearRight.latitude,
            (nearRight.longitude + nearLeft.longitude) / 2,
            distanceHeight
    );

    double radiusInMeters = Math.sqrt(Math.pow(distanceWidth[0], 2) + Math.pow(distanceHeight[0], 2)) / 2;
    return radiusInMeters;
}

答案 3 :(得分:1)

对于Kotlin用户,请从setOnCameraIdleListener调用此函数

private fun getMapVisibleRadius(): Double {
    val visibleRegion: VisibleRegion? = mMap?.projection?.visibleRegion

    val distanceWidth = FloatArray(1)
    val distanceHeight = FloatArray(1)

    val farRight: LatLng? = visibleRegion?.farRight
    val farLeft: LatLng? = visibleRegion?.farLeft
    val nearRight: LatLng? = visibleRegion?.nearRight
    val nearLeft: LatLng? = visibleRegion?.nearLeft

    Location.distanceBetween((farLeft!!.latitude + nearLeft!!.latitude) / 2,
            farLeft.longitude,
            (farRight!!.latitude + nearRight!!.latitude) / 2,
            farRight.longitude, distanceWidth)

    Location.distanceBetween(farRight.latitude,
            (farRight.longitude + farLeft.longitude) / 2,
            nearRight.latitude,
            (nearRight.longitude + nearLeft.longitude) / 2,
            distanceHeight)

    return Math.sqrt((Math.pow(distanceWidth[0].toString().toDouble(), 2.0))
            + Math.pow(distanceHeight[0].toString().toDouble(), 2.0)) / 2
}

答案 4 :(得分:0)

编辑:以下答案适用于Google Maps JavaScript API v3
= - = - = - = - = - = - =

我认为答案是:是的,你可以。

根据documentation,您可以按以下方式计算2点之间的距离:computeDistanceBetween(LatLngFrom, LatLngTo)

您也可以使用getBounds()中的{{1}}方法获取地图的边界。