看这张图示:
我想知道以下内容:
- 如何在给出纬度、经度和距离(10千米)时创建一个区域(圆)
- 如何检查(计算)纬度和经度是否在该区域内或外
我希望您能为我提供Java或特别是基于Google Maps API V2的Android代码示例。
看这张图示:
我想知道以下内容:
我希望您能为我提供Java或特别是基于Google Maps API V2的Android代码示例。
你所需要的基本上就是地图上两点之间的距离:
float[] results = new float[1];
Location.distanceBetween(centerLatitude, centerLongitude, testLatitude, testLongitude, results);
float distanceInMeters = results[0];
boolean isWithin10km = distanceInMeters < 10000;
如果您已经有了 Location
对象:
Location center;
Location test;
float distanceInMeters = center.distanceTo(test);
boolean isWithin10km = distanceInMeters < 10000;
这是API中有趣的部分:https://developer.android.com/reference/android/location/Location.html
Kotlin版本
使用实例方法distanceTo
,类似于以下形式的扩展函数:
fun Location.checkIsInBound(radius: Double,center:Location):Boolean
= this.distanceTo(center)<radius
使用示例:
fusedLocationClient.lastLocation
.addOnSuccessListener { location : Location? ->
val isWithin2km = location?.checkIsInBound(2000.0,center) }
distanceTo
或 distanceBetween
,您还可以使用 Google Map Utility Library 的 SphericalUtil
的 computeDistanceBetween
。但是,它需要 LatLng
作为输入。请看这个:
private boolean isMarkerOutsideCircle(LatLng centerLatLng, LatLng draggedLatLng, double radius) {
float[] distances = new float[1];
Location.distanceBetween(centerLatLng.latitude,
centerLatLng.longitude,
draggedLatLng.latitude,
draggedLatLng.longitude, distances);
return radius < distances[0];
}
如果有人正在使用 GoogleMap 并尝试通过经纬度应用位置范围,请尝试 google.maps.Circle()。
例如(mkr是您的标记)
let yourcircle = new google.maps.Circle({
strokeColor: "#0079C3",
strokeOpacity: .8,
strokeWeight: 2,
fillColor: "#0079C3",
fillOpacity: 0.2,
map: this.map,
center: {'lat':your latitude, 'lng':your longitude},
radius: Math.sqrt(your distance range) * 1000,
});
请参见https://developer.android.com/reference/android/location/Location.html
Location areaOfIinterest = new Location;
Location currentPosition = new Location;
areaOfIinterest.setLatitude(aoiLat);
areaOfIinterest.setLongitude(aoiLong);
currentPosition.setLatitude(myLat);
currentPosition.setLongitude(myLong);
float dist = areaOfIinterest.distanceTo(currentPosition);
return (dist < 10000);
位置服务对我没用,这是我所做的。
import 'dart:math' show cos, sqrt, asin;
double calculateDistanceBetweenTwoLatLongsInKm(
double lat1, double lon1, double lat2, double lon2) {
var p = 0.017453292519943295;
var c = cos;
var a = 0.5 -
c((lat2 - lat1) * p) / 2 +
c(lat1 * p) * c(lat2 * p) * (1 - c((lon2 - lon1) * p)) / 2;
return 12742 * asin(sqrt(a));
}
然后,只需检查该距离是否大于(外部)或小于(内部)您的半径(以公里为单位)。
如果你的意思是“如何创建一个区域”,即想在地图上绘制该区域,那么在地图 V2 的参考文档中 找到了 Circle 类的文档 中有一个示例。
为了检查圆心和您的点之间的距离是否大于 10 公里,我建议使用静态方法Location.distanceBetween(...),因为它避免了不必要的对象创建。
另请参见此处链接(答案末尾), 以获取多边形而非圆形区域的代码示例。