Java 如何检查用户是否在Google maps v2的圆圈内
我的地图上有一个圆圈。现在我想检测用户(或我)是否在圆圈内Java 如何检查用户是否在Google maps v2的圆圈内,java,android,google-maps,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(Co
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();
}
如果I参数insidedistanceBetween
是标记的坐标,则它可以正常工作,但是,即使我的位置在半径内,土司也会显示outer
有没有正确的方法?请帮忙。谢谢
编辑
我发现了一些奇怪的东西
在图片上,你可以看到我有一个文本视图,上面有5个数字(圆圈纬度、圆圈经度、索引0处的距离、索引1处的距离、距离)distance
是一个浮点数组,用于存储圆心与用户位置之间的距离。我将半径设置为100,我认为单位是米,但是,正如您所看到的,距离
数组中的值是:1.334880E7,-81.253089090478516,-10696092987060547。计算距离的公式是什么?而且,1.10乘以7等于1300万,实际上大于100。请帮帮忙,现在真的很混乱。根据圆的文档(圆的半径,以米为单位。它应该是零或更大)和distanceBetween(计算两个位置之间的近似距离,以米为单位),所以我不知道为什么会出现这种结果
使用而不是
LocationManager
。这样,您将获得与蓝点位置相同的位置;dr-查看您的控制台输出
基本上有两种方法可以做到这一点:
检查用户的(标记)是否在圆边界内
计算用户与圆心之间的距离。然后检查它是否等于或小于圆半径。此解决方案需要球形
库才能工作
圆边界
只需添加一个圆圈:
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 ) );
乍一看,你可能会认为这是可行的。但事实并非如此。在背景中,google(仍然)使用矩形,因此矩形边界框内的所有内容,但圆外的内容都将被识别为在latLng边界内。这是错误的,也是一个众所周知的问题,但谷歌似乎并不在意
如果你现在认为它可以使用矩形边界,那么你错了。那些也不行
球面距离
最简单也是最好的方法是测量距离。通过将&library=spherical
附加到您的google maps脚本调用,包括球形库。那就去吧
google.maps.geometry.spherical.computeDistanceBetween(
new google.maps.LatLng( 100, 20 ),
new google.maps.LatLng( 101, 21 )
) <= 2000;
google.maps.geometry.spheremic.ComputedDistanceBeween(
新的google.maps.LatLng(100,20),
新google.maps.LatLng(101,21)
)我知道这个问题一年多前就有人问过了,但我已经问过了
使用定位的distance-between
静态功能修复了相同的问题
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
}
float[]距离=新的float[2];
位置.distanceBetween(latLng.latitude,latLng.longitude,circle.getCenter().纬度,circle.getCenter().经度,距离);
如果(距离[0])计算到圆心的距离以及从圆边界到圆心的距离(半径单位为kn/英里),并检查它是否与半径一致?很可能您在地图上的位置不是从您的位置客户端返回的位置,而是map.setOnMyLocationChange(OnMyLocationChangeListener)
已被弃用?@MiguelRivera是的,它是这样记录的,但我认为这是一个错误,应该予以恢复。您可以了解为什么不应弃用它。您是否仍在使用GoogleMap。setOnMyLocationChange(OnMyLocationChangeListener)
?仍在外部显示:(@MiguelRivera您发送到distance-between
的lat和long值是多少?这将是完美的,但这是为javascript@MiguelRiveraIIRC底层API应该是相同的。你必须找到合适的等价物,但除此之外…:)这是javascript,不是java。