如何检查用户是否在Google地图v2中的圆形内

11

我在地图上画了一个圆,现在我想检测用户(或者我自己)是否在圆内。

 Circle circle = map.addCircle(new CircleOptions()
     .center(new LatLng(14.635594, 121.032962))
     .radius(55)
     .strokeColor(Color.RED)
     );

我有这段代码:

 LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    LocationListener ll = new myLocationListener();
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,ll);



     Location.distanceBetween( pLat,pLong,
                circle.getCenter().latitude, circle.getCenter().longitude, distance);

            if( distance[0] > circle.getRadius()  ){
                Toast.makeText(getBaseContext(), "Outside", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(getBaseContext(), "Inside", Toast.LENGTH_LONG).show();
            }

在我的LocationListener中,我有以下内容:

public void onLocationChanged(Location location) {
            // TODO Auto-generated method stub
             pLong  = location.getLongitude();
             pLat = location.getLatitude();

        }
如果我在distanceBetween函数中传入标记的坐标,则它的工作是正确的,但是即使我的位置在半径内,也会显示“外部”。您有什么正确的解决方法吗?请帮忙。谢谢!在图片上可以看到一个文本视图,其中有5个数字(圆形纬度、圆形经度、距离索引0处的距离、距离索引1处的距离、距离2)。 distance 是一个浮点数组,用于存储圆的中心与用户位置之间的距离。我将半径设置为100,单位应该是米,但是如您所见,在distance数组的值为: 1.334880E7 , -81.25308990478516 , -10696092987060547 。计算距离的公式是什么?此外,10的1次幂乘以1.多一些约等于1300万,比100要大得多。根据Circle的文档(圆的半径,以米为单位指定。应为0或更大。)和distanceBetween (计算两个地点之间的近似距离,以米为单位),我不知道为什么会得到这个结果。请帮忙解释一下,非常感谢!

2
计算到圆心的距离和从圆边到圆心的距离(半径以公里/英里为单位),并检查是否在半径内? - A.S.
很有可能,您在地图上的位置并不是从您的位置客户端返回的位置。 - tyczj
3个回答

4

简而言之? jsFiddle 这里 - 查看您的控制台输出。

基本上有两种方法可以做到这一点:

  1. 检查用户是否在圆形范围内(标记)
  2. 计算用户与圆心之间的距离。然后检查它是否等于或小于圆半径。此解决方案需要使用 spherical 库才能工作。

圆形边界

只需添加一个圆:

circle = new google.maps.Circle( {
        map           : map,
        center        : new google.maps.LatLng( 100, 20 ),
        radius        : 2000,
        strokeColor   : '#FF0099',
        strokeOpacity : 1,
        strokeWeight  : 2,
        fillColor     : '#009ee0',
        fillOpacity   : 0.2
    } )

然后检查标记是否在内部:

circle.getBounds().contains( new google.maps.LatLng( 101, 21 ) );

一开始,您可能会认为这样做是可行的。但事实并非如此。在后台中,谷歌仍然使用一个矩形,因此矩形边界框内的所有内容,但在圆形外部的内容将被识别为LatLng范围内的“内部”。这是错误的已知问题,但似乎谷歌并不关心。
如果您现在认为使用矩形范围会有效,则您是错误的。这些也不起作用。
球面距离
最简单和最好的方法是测量距离。通过在google地图脚本调用中添加&library=spherical来包含球体库。然后按照以下方式操作:
google.maps.geometry.spherical.computeDistanceBetween( 
    new google.maps.LatLng( 100, 20 ),
    new google.maps.LatLng( 101, 21 )
) <= 2000;

2
这很完美,但这是针对JavaScript的。 - Jeongbebs
如果我没记错的话,底层API应该是相同的。你需要找到相应的等价物,除此之外就没什么问题了... :) - kaiser
这是 JavaScript,不是 Java。 - MrUpsidown

3

我知道这个问题已经被问了一年多,但我有同样的问题,并且使用Location的distanceBetween静态函数进行了修复。

float[] distance = new float[2];

Location.distanceBetween(latLng.latitude, latLng.longitude, circle.getCenter().latitude,circle.getCenter().longitude,distance);

if ( distance[0] <= circle.getRadius())
{
    // Inside The Circle
}
else
{
    // Outside The Circle
}

0

但是 map.setOnMyLocationChange(OnMyLocationChangeListener) 已经被弃用了? - Jeongbebs
@MiguelRivera 是的,它被记录为这样,但在我看来这是一个错误,应该被撤销。您可以查看此问题了解为什么不应该弃用它。 - MaciejGórski
你还在使用 GoogleMap.setOnMyLocationChange(OnMyLocationChangeListener) 吗? - Jeongbebs
仍然显示 Outside。 :( - Jeongbebs
@MiguelRivera 你发送到distanceBetween的lats和longs的值是什么? - MaciejGórski
这是我的问题。圆的坐标在那里,我的当前位置在图片上。 - Jeongbebs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接