Получить расстояние между двумя точками гео
Я хочу сделать приложения, которые проверяют, какое ближайшее место от того, где находится пользователь. Я легко могу получить местоположение пользователя и у меня есть список мест с широтой и долготой.
Что было бы лучшим способом узнать ближайшее место списка против текущей позиции.
Я не смог найти ничего в API google.
Я беспокоюсь, что мне нужно прибегнуть к моему вычислению и сделать математику, чтобы вычислить его.
Что делать вы, ребята, думаете ?
ура и спасибо за чтение или ответа.
8 ответов:
Location loc1 = new Location(""); loc1.setLatitude(lat1); loc1.setLongitude(lon1); Location loc2 = new Location(""); loc2.setLatitude(lat2); loc2.setLongitude(lon2); float distanceInMeters = loc1.distanceTo(loc2);
http://developer.android.com/reference/android/location/Location.html
посмотрите в distanceTo или distanceBetween. Вы можете создать объект местоположения из широты и долготы:
Location location = new Location(""); location.setLatitude(lat); location.setLongitude(lon);
приближенное решение (на основе равноугольной проекции),быстрее (для этого требуется только 1 триггер и 1 квадратный корень).
этот метод актуален, если ваши точки не слишком далеко друг от друга. Это будет всегда переоценивают по сравнению с реальным расстоянием haversine. Например, он добавит не более 0.05382 % на реальное расстояние, если дельта широты или долготы между двумя точками не превышает 4 десятичных Градусы.
стандартная формула (Haversine) является точно один (то есть он работает для любой пары долготы/широты на земле), но это гораздо медленнее как это нужно 7 тригонометрических и 2 квадратных корней. Если ваша пара точек не слишком далеко друг от друга, и абсолютная точность не имеет первостепенного значения, вы можете использовать эту приблизительную версию (Equirectangular), которая намного быстрее, поскольку она использует только один тригонометрический и один квадрат корень.
// Approximate Equirectangular -- works if (lat1,lon1) ~ (lat2,lon2) int R = 6371; // km double x = (lon2 - lon1) * Math.cos((lat1 + lat2) / 2); double y = (lat2 - lat1); double distance = Math.sqrt(x * x + y * y) * R;вы можете оптимизируйте это дальше либо:
- извлечение квадратного корня Если вы просто сравниваете расстояние с другим (в этом случае сравните оба квадрата расстояния);
- разложение на множители Косинуса Если вы вычисляете расстояние от одной основной точки до многих других (в этом случае вы делаете равноугольную проекцию, центрированную на основной точке, поэтому вы можете вычислить Косинус один раз для все сравнения.)
для получения дополнительной информации см.:http://www.movable-type.co.uk/scripts/latlong.html
существует хорошая справочная реализация формулы Haversine на нескольких языках по адресу: http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe
есть несколько методов, которые вы могли бы использовать, но чтобы определить, какой из них лучше всего, нам сначала нужно знать, знаете ли вы высоту пользователя, а также высоту других точек?
в зависимости от уровня точности вы после того, как, вы можете посмотреть в формулах Haversine или Vincenty...
эти страницы подробно описывают формулы, а для менее математически склонных также дают объяснение того, как их реализовать в сценарий!
Формула Haversine:http://www.movable-type.co.uk/scripts/latlong.html
Формула Vincenty: http://www.movable-type.co.uk/scripts/latlong-vincenty.html
Если у вас возникли проблемы с любым из значений в формулах, просто комментарий и я постараюсь на них ответить :)
есть два способа получить расстояние между LatLng.
public static void distanceBetween (double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results)и второй
public float distanceTo (Location dest)как ответил Правин.
просто используйте следующий метод, передайте его lat и long и получите расстояние в метре:
private static double distance_in_meter(final double lat1, final double lon1, final double lat2, final double lon2) { double R = 6371000f; // Radius of the earth in m double dLat = (lat1 - lat2) * Math.PI / 180f; double dLon = (lon1 - lon2) * Math.PI / 180f; double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(latlong1.latitude * Math.PI / 180f) * Math.cos(latlong2.latitude * Math.PI / 180f) * Math.sin(dLon/2) * Math.sin(dLon/2); double c = 2f * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); double d = R * c; return d; }
private float getDistance(double lat1, double lon1, double lat2, double lon2) { float[] distance = new float[2]; Location.distanceBetween(lat1, lon1, lat2, lon2, distance); return distance[0]; }
вы можете получить расстояние и время с помощью Google Map API Google Map API
просто передать загрузить JSON в этот метод, вы получите реальное расстояние и время между двумя latlong по
void parseJSONForDurationAndKMS(String json) throws JSONException { Log.d(TAG, "called parseJSONForDurationAndKMS"); JSONObject jsonObject = new JSONObject(json); String distance; String duration; distance = jsonObject.getJSONArray("routes").getJSONObject(0).getJSONArray("legs").getJSONObject(0).getJSONObject("distance").getString("text"); duration = jsonObject.getJSONArray("routes").getJSONObject(0).getJSONArray("legs").getJSONObject(0).getJSONObject("duration").getString("text"); Log.d(TAG, "distance : " + distance); Log.d(TAG, "duration : " + duration); distanceBWLats.setText("Distance : " + distance + "\n" + "Duration : " + duration); }
Comments