检查纬度和经度是不是在一个圆圈内
Posted
技术标签:
【中文标题】检查纬度和经度是不是在一个圆圈内【英文标题】:Check if a latitude and longitude is within a circle检查纬度和经度是否在一个圆圈内 【发布时间】:2014-03-30 14:33:22 【问题描述】:看这个插图:
我想知道的是:
-
如何在给定经纬度和距离(10 公里)时创建区域(圆)
如何检查(计算)纬度和经度是在区域内还是区域外
如果您可以给我 Java 代码示例或专门针对带有 Google Maps API V2 的 android 代码示例,我更愿意
【问题讨论】:
好吧,就第二个问题而言,圆只是距中心点相同距离的点的集合。如果它在圆内,则意味着它离中心更近(距离更小),如果它在圆外,则距离大于半径。我想你的例子中的半径是 10 公里。 【参考方案1】:你基本上需要的是地图上两点之间的距离:
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
【讨论】:
嗨,我想用java实现同样的功能我想知道的是:1)如何在给定纬度和经度以及距离(以米为单位)时创建一个区域(圆)2 )如何检查(计算)纬度和经度是否在区域内或区域外 @MangeshMandavgane 你只需要复制两个函数“computeDistanceAndBearing”和“distanceBetween”android.googlesource.com/platform/frameworks/base/+/refs/heads/… @Flo354,感谢您的回复我检查了您建议的 URL 代码。这是非常有用的代码,但我在 4 个月前完成了实现,我参考了这个 ***.com/questions/120283/… 大家好!为了使用“Location.distanceBetween()”方法,我应该在我的 Java 应用程序中包含哪个 jar 我有问题。是包括通往某个位置的路径的距离,还是只是两点之间的距离。【参考方案2】:检查一下:
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];
【讨论】:
嗨,先生,我是这个谷歌地图的新手。我有多个圈子。有什么方法可以找到我当前的位置指向哪个圆圈?【参考方案3】:你有没有经历过新的GeoFencing API。它应该可以帮助你。正常实施需要很多时间。 This 应该可以帮助您轻松实现它。
【讨论】:
【参考方案4】:见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);
【讨论】:
???根据定义,圆上的每个点距离中心 10 公里。感兴趣区域到当前位置的距离是圆心到当前位置的连线【参考方案5】:以防万一有人在使用 GoogleMap 并尝试通过 long&lat 应用位置范围。你可以试试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, );
【讨论】:
这与问题有点无关,但这有助于我接下来想做的事情!干杯! :)【参考方案6】:如果您的意思是“如何创建区域”,您想在地图上绘制该区域,您可以在地图 V2 参考doc for the class Circle 中找到一个示例。
为了检查圆心和您的点之间的距离是否大于 10 公里,我建议使用静态方法 Location.distanceBetween(...),因为它可以避免不必要的对象创建。
如果区域是多边形而不是圆形,另请参阅here(在答案的最后)以获取代码示例。
【讨论】:
【参考方案7】:位置不适合我,这就是我所做的。
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));
然后只需检查该距离是大于(外部)还是小于(内部)以 KM 为单位的半径
【讨论】:
【参考方案8】: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)
除了如上述答案中所述使用位置 API 的 distanceTo
或 distanceBetween
之外,您还可以使用 Google Map Utility Library 的 SphericalUtil
的 computeDistanceBetween
,但是它需要 LatLng
作为输入。
【讨论】:
以上是关于检查纬度和经度是不是在一个圆圈内的主要内容,如果未能解决你的问题,请参考以下文章