Проверьте, находится ли широта и долгота в пределах круга

Смотрите эту иллюстрацию:

enter image description here

Что я хотел бы знать:

  • Как создать область (круг) при задании широты и долготы и расстояния (10 километров).
  • Как проверить (рассчитать), если широта и долгота находятся либо внутри, либо за пределами области.

Я бы предпочел, если вы можете дать мне пример кода на Java или специально для Android с Google Maps API V2

Ответ 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

Ответ 2

Прошел ли вы новый GeoFencing API. Это должно помочь вам. Нормальная реализация занимает много времени. Это должно помочь вам легко реализовать его.

Ответ 3

см. 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);

Ответ 4

Если вы имеете в виду под названием "Как создать область", которую вы хотите нарисовать на карте, вы найдете пример справа на карте. Ссылка на V2 doc для класса Circle.

Для проверки того, будет ли расстояние между центром круга и точкой больше 10 км, я бы предложил использовать статический метод Location.distanceBetween(...), поскольку он избегает ненужных создания объектов.

См. также здесь (в самом конце ответа) для примера кода, если область является полигоном, а не кругом.

Ответ 5

Проверь это:

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