【问题标题】:Check if a latitude and longitude is within a circle检查纬度和经度是否在一个圆圈内
【发布时间】:2014-03-30 14:33:22
【问题描述】:

看这个插图:

我想知道的是:

  1. 如何在给定经纬度和距离(10 公里)时创建区域(圆)
  2. 如何检查(计算)纬度和经度是在区域内还是区域外

如果您可以给我 Java 代码示例或专门针对带有 Google Maps API V2 的 Android 代码示例,我更愿意

【问题讨论】:

  • 好吧,就第二个问题而言,圆只是距中心点相同距离的点的集合。如果它在圆内,则意味着它离中心更近(距离更小),如果它在圆外,则距离大于半径。我想你的例子中的半径是 10 公里。

标签: java android google-maps-android-api-2 latitude-longitude area


【解决方案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 个月前完成了实现,我参考了这个 stackoverflow.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 LibrarySphericalUtilcomputeDistanceBetween,但是它需要 LatLng 作为输入。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-05
          • 2018-12-12
          • 1970-01-01
          • 2015-10-31
          • 2011-03-10
          • 1970-01-01
          相关资源
          最近更新 更多