我的地图上有一个圆圈。现在我想检测用户(或我)是否在圈内。
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
内的参数是标记的坐标,它可以正常工作,但是,即使我的位置在半径范围内,吐司也会显示外部。
任何想法如何正确地做到这一点?请帮忙。谢谢!
修改
我发现了一些奇怪的东西。
在图片上,您可以看到我上面有一个textView,其中包含5个数字(圆纬度,圆经度,索引0处的距离,索引1处的距离,距离2)。 distance
是一个浮点数组,用于存储圆心和用户位置之间的距离。我将半径设置为100,我认为单位是米,但是,如您所见,distance
数组的值为: 1.334880E7 , -81.25308990478516 < / strong>, -10696092987060547 。计算距离的公式是什么?而且,1。10次增加到7的次数约为1300万次,真的大于100次。请立即帮助它真正令人困惑。根据Circle的文档(圆的半径,以米为单位。它应该为零或更大。)和distanceBetween(计算两个位置之间的大致距离,以米为单位),所以我不知道为什么这是结果。< / p>
答案 0 :(得分:4)
<强> TL;博士强>? jsFiddle here - 查看您的控制台输出。
基本上有两种方法可以做到这一点:
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边界。这是错误的,也是一个众所周知的问题,但谷歌似乎并不关心。
如果您现在认为它适用于矩形边界,那么您错了。那些也不起作用。
最简单,最好的方法是测量距离。将&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
。