Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Android: как найти диапазон широты и долготы с расположением широты и долготы в качестве центра?

Автор вопроса: DiëgoОтветов: 3

У меня есть набор данных о разных местах, и я хочу показать ближайшие места (в пределах 5 км).

Как я могу определить минимум/максимум широты и долготы?

ф.э.: Мне нужно заправить машину, и я ищу все заправочные станции в моем районе, чтобы добраться до ближайшей. Как это сделать на телефоне Android?

Я также хотел бы избежать перебора всех локаций, потому что у меня около 2500 локаций и их количество растет. Любые предложения по этому поводу?

Ребята, заранее спасибо за советы по этому поводу!

Обновление: спасибо за отзыв, который вы мне дали. Я решил свою проблему, перебрав все местоположения на сервере и используя Google Distance Matrix API для расчета расстояний: http://code.google.com/intl/nl/apis/maps/documentation/distancematrix/

geolocation

Ответы

Ответ 1 · рейтинг 2 · m0skit0

Упрощенно, широта - это угол над/под экватором, долгота - это угол вправо/влево от гринвичского меридиана.

Таким образом, чтобы рассчитать (в среднем), сколько, например, 1° широты, вы конвертируете его в радианы (умножьте на PI/ 180), а затем умножить на средний радиус Земли (6 371,0 км).

Для вашего вопроса процесс обратный: возьмите 5 км и переведите их в градусы:

  1. Разделите его на радиус Земли.
  2. Умножить на 180/PI

Таким образом, вы получите дельта градусов, то есть сколько градусов составляют 5 км (в среднем, если вам нужна точность, вам потребуются точные перепады радиуса Земли на этих 5 км), с помощью которых вы можете построить круг вокруг заданного местоположения (так же, как компас).

Ответ 2 · Dampsquid

Все расчеты и методы являются приблизительными, но находятся в пределах допусков для того, что вам нужно.

Окружность Земли составляет примерно 40076000 метров.

пройденное расстояние на градус широты всегда одинаково и представляет собой просто пропорцию земного круга.

однако расстояние, проходимое на градус долготы, меняется в зависимости от вашей широты (эти кольца на глоде становятся меньше ближе к полюсам).

поэтому для заданного расстояния m соответствующие значения широты и долготы равны

earthcirc = 40076000;
// at Lat and Lon for distance m (in meters)
LatDelta = (m * 360) / earthcirc;
LonDelta = (m * 360) / abs(eathcirc*cos(lat));

Это дает вам ваши квадратные дельты широты и долготы для простого поиска ваших данных. но, найдя кандидата, вам следует выполнить расчет полного расстояния, так как угол квадрата находится на расстоянии более 5 км.

расстояние между 2 широтами/долгами

distLat = (lat1-lat2) * earthcirc) / 360;
distLong = (long1-long2) * earthcirc * cos((lat1+lat2)/2) / 360;
dist = sqrt( sqr(distLat) + sqr(distLong) );

Я знаю, что большинство компиляторов/языков используют радианы для функций cos/sin, но их легко объяснить в градусах.

что касается поиска ваших данных, самый простой способ - заказать их либо по широте, либо по долготе, тогда вы можете выполнить двоичный поиск, чтобы найти возможное место для проверки вместо полного сканирования. Есть лучшие способы упорядочить данные (квадраты), но для 2500 записей я бы не стал беспокоиться

Ответ 3 · user1139880

Здесь есть две проблемы: 1) как рассчитать расстояние между двумя парами широты и долготы и 2) как найти точку с кратчайшим расстоянием до заданной точки.

  1. В сети есть формулы, некоторые более точные, чем другие, например http://www.movable-type.co.uk/scripts/latlong.html

  2. Это проблема (гео) пространственной индексации (http://en.wikipedia.org/wiki/Spatial_index#Spatial_Index). Вы можете использовать, например, четырехугольное дерево с широтой/долготой как X/Y (я предполагаю, что ваши точки не слишком близки к полярам, ​​что усложняет ситуацию, но все же выполнимо). Дерево квадрантов позволяет вам найти в логарифмическом (N) времени окрестность вашего автомобиля без необходимости перебирать все точки.

Не точный код, но, надеюсь, это поможет.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы