如何检查用户是否在Circle Google maps v2中

时间:2013-11-18 09:20:24

标签: java android google-maps

我的地图上有一个圆圈。现在我想检测用户(或我)是否在圈内。

 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();
            }

在myLocationListener上我有这个:

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

        }

如果distanceBetween内的参数是标记的坐标,它可以正常工作,但是,即使我的位置在半径范围内,吐司也会显示外部

enter image description here

任何想法如何正确地做到这一点?请帮忙。谢谢!

修改

我发现了一些奇怪的东西。

在图片上,您可以看到我上面有一个textView,其中包含5个数字(圆纬度,圆经度,索引0处的距离,索引1处的距离,距离2)。 distance是一个浮点数组,用于存储圆心和用户位置之间的距离。我将半径设置为100,我认为单位是米,但是,如您所见,distance数组的值为: 1.334880E7 -81.25308990478516 < / strong>, -10696092987060547 。计算距离的公式是什么?而且,1。10次增加到7的次数约为1300万次,真的大于100次。请立即帮助它真正令人困惑。根据Circle的文档(圆的半径,以米为单位。它应该为零或更大。)和distanceBetween(计算两个位置之间的大致距离,以米为单位),所以我不知道为什么这是结果。< / p>

enter image description here

3 个答案:

答案 0 :(得分:4)

<强> TL;博士 jsFiddle here - 查看您的控制台输出。

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

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

    只需添加一个圆圈:

    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边界。这是错误的,也是一个众所周知的问题,但谷歌似乎并不关心。

    如果您现在认为它适用于矩形边界,那么您错了。那些也不起作用。

    球面距离

    最简单,最好的方法是测量距离。将&library=spherical附加到您的Google地图脚本调用中,以包含球形库。然后去

    google.maps.geometry.spherical.computeDistanceBetween( 
        new google.maps.LatLng( 100, 20 ),
        new google.maps.LatLng( 101, 21 )
    ) <= 2000;
    

答案 1 :(得分:1)

我知道这个问题已经被问过一年多了,但我有 同样的问题,并使用位置的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
}

答案 2 :(得分:0)

使用GoogleMap.setOnMyLocationChange(OnMyLocationChangeListener)代替LocationManager。这样,您将获得与蓝点位置相同的Location