检查纬度和经度是不是在一个圆圈内

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 的 distanceTodistanceBetween 之外,您还可以使用 Google Map Utility Library 的 SphericalUtilcomputeDistanceBetween,但是它需要 LatLng 作为输入。

【讨论】:

以上是关于检查纬度和经度是不是在一个圆圈内的主要内容,如果未能解决你的问题,请参考以下文章

获取登录用户15英里范围内经纬度的用户数

检查纬度和经度是不是在我的谷歌地图起点和终点范围内

检查纬度经度是不是位于两个坐标之间的线上

检查两条路线(以纬度和经度表示)是不是彼此相对

如何检查选定区域的纬度/经度是不是在使用 Java 的数据库中定义的范围内

纬度和经度精度问题,具体取决于地点