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

时间:2014-02-27 09:11:16

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

见下图:

enter image description here

我想知道的是:

  1. 如果给定纬度和经度以及距离(10公里),如何创建区域(圆圈)
  2. 如何检查(计算)纬度和经度是否在区域内或区域外
  3. 如果您可以使用Google Maps API V2为我提供Java代码示例或者专门针对Android的代码示例

8 个答案:

答案 0 :(得分:26)

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

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

答案 1 :(得分:1)

你是否经历了新的GeoFencing API。它应该对你有所帮助。正常实施需要花费很多时间。 This应该可以帮助您轻松实施。

答案 2 :(得分: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);

答案 3 :(得分:0)

如果您的意思是“如何创建区域”,那么您想要在地图上绘制区域,您将在地图V2参考doc for the class Circle中找到一个示例。

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

如果区域是多边形而不是圆形,请参阅here(在答案的最后)以获取代码示例。

答案 4 :(得分:0)

检查:

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

答案 5 :(得分:0)

位置不适合我,这就是我所做的。

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)大(外)或小(内)

答案 6 :(得分:0)

以防万一有人在使用 GoogleMap 并尝试通过 long&lat 应用位置范围。你可以试试google.maps.Circle()

即(mkr 是你的标记)

<块引用>
git push --force

答案 7 :(得分:0)

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

相关问题