检查一个经纬度是否在圆形区域内

38

看这张图示:

输入图片描述

我想知道以下内容:

  1. 如何在给出纬度、经度和距离(10千米)时创建一个区域(圆)
  2. 如何检查(计算)纬度和经度是否在该区域内或外

我希望您能为我提供Java或特别是基于Google Maps API V2的Android代码示例。


1
就第二个问题而言,圆形只是一组距离中心点相同的点集。如果它在圆内部,则意味着它离中心更近(距离更短);如果在圆外,则距离大于半径。在你的示例中,半径我想是10公里。 - dkasipovic
8个回答

46

你所需要的基本上就是地图上两点之间的距离:

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)如何检查(计算)给定的纬度和经度是否在区域内或外 - Mangesh Mandavgane
@MangeshMandavgane,你只需要复制名为“computeDistanceAndBearing”和“distanceBetween”的两个函数即可。https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/location/java/android/location/Location.java - Flo354
@Flo354,感谢您的回复。我已经检查了您建议的URL代码。这是非常有用的代码,但是我在4个月前已经实现了它,我参考了这个链接https://dev59.com/-3VD5IYBdhLWcg3wAWkO。 - Mangesh Mandavgane
大家好!我应该在我的Java应用程序中包含哪个jar文件才能使用“Location.distanceBetween()”方法? - srihari
2
我有一个问题。这个距离是包括到达目的地的路径长度还是仅指两点之间的距离。 - Ajinkya

2

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 作为输入。

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];
}

您好,我是新手使用Google地图。我有多个圆圈,有没有办法找到我的当前位置在哪个圆圈中? - Aravindhan Gs

1

如果有人正在使用 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,
  });

这与问题有点无关,但这帮助我完成了接下来想做的事情!所以谢谢! :) - Keval Langalia

1

请参见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公里。兴趣区域和当前位置之间的距离是连接圆心和当前位置的直线。 - Android Newbie

1

你是否了解新的地理围栏 API。它应该会对你有所帮助。正常的实现需要很长时间。这个应该可以帮助你轻松地实现它。


1

位置服务对我没用,这是我所做的。

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));
}

然后,只需检查该距离是否大于(外部)或小于(内部)您的半径(以公里为单位)。


0

如果你的意思是“如何创建一个区域”,即想在地图上绘制该区域,那么在地图 V2 的参考文档中 找到了 Circle 类的文档 中有一个示例。

为了检查圆心和您的点之间的距离是否大于 10 公里,我建议使用静态方法Location.distanceBetween(...),因为它避免了不必要的对象创建。

另请参见此处链接(答案末尾), 以获取多边形而非圆形区域的代码示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接