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

Jeo*_*ebs 10 java android google-maps

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

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

我有这个代码:

 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();
            }
Run Code Online (Sandbox Code Playgroud)

在myLocationListener上我有这个:

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

        }
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

编辑

我发现了一些奇怪的事

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

在此输入图像描述

kai*_*ser 5

tl; drjsFiddle在这里 -查看您的控制台输出。

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

  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
    } )
Run Code Online (Sandbox Code Playgroud)

然后检查标记是否在其中:

circle.getBounds().contains( new google.maps.LatLng( 101, 21 ) );
Run Code Online (Sandbox Code Playgroud)

乍一看,您可能会认为这可行。但事实并非如此。在背景谷歌(静止)使用的矩形,所以一切矩形边框内,但外侧的圆将被识别为内部的经纬度范围。这是错误的,也是已知的问题,但Google似乎不在乎。

如果您现在认为它可以在矩形范围内工作,那么您错了。那些也不起作用。

球面距离

最简单,最好的方法是测量距离。通过附加&library=spherical到您的Google Maps脚本调用来包括球形库。然后去

google.maps.geometry.spherical.computeDistanceBetween( 
    new google.maps.LatLng( 100, 20 ),
    new google.maps.LatLng( 101, 21 )
) <= 2000;
Run Code Online (Sandbox Code Playgroud)

  • 这将是完美的,但这是针对javascript的 (2认同)

Mac*_*ski 0

使用GoogleMap.setOnMyLocationChange(OnMyLocationChangeListener)而不是LocationManager. 这样您将获得Location与蓝点位置相同的 s。