检查纬度和经度是否在圆圈内

IT小君   2021-11-07T02:04:03

请参阅此插图:

在此处输入图片说明

我想知道的是:

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

我更希望您能提供 Java 代码示例或专门针对带有 Google Maps API V2 的 Android 代码示例

评论(8)
IT小君

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

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

2021-11-07T02:04:03   回复
IT小君

检查这个:

 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];
}
2021-11-07T02:04:03   回复
IT小君

您是否了解过新的GeoFencing API它应该可以帮助你。正常的实施需要很多时间。应该可以帮助您轻松实现它。

2021-11-07T02:04:03   回复
IT小君

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);
2021-11-07T02:04:04   回复
IT小君

以防万一是否有人在使用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,
  });
2021-11-07T02:04:04   回复
IT小君

如果您的意思是“如何创建区域”,即您想在地图上绘制该区域,您将在地图 V2 参考文档中找到 Circle 类的示例

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

另请参见此处(在答案的最后)以获取代码示例,以防该区域是多边形而不是圆形。

2021-11-07T02:04:04   回复
IT小君

位置对我不起作用,这就是我所做的。

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 为单位的半径

2021-11-07T02:04:04   回复
IT小君

科特林版

使用实例方法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) }

除了使用 Location APIdistanceTodistanceBetween如上述答案中所述,您还可以使用Google Map Utility LibrarySphericalUtil's computeDistanceBetween,但它需要LatLng作为输入。

2021-11-07T02:04:05   回复