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

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

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

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

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

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

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


person Diëgo    schedule 20.02.2012    source источник


Ответы (3)


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

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

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

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

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

person m0skit0    schedule 20.02.2012
comment
Есть ли способ узнать, каков точный радиус Земли для определенной широты? Сайт или какой-то API? - person Diëgo; 22.02.2012
comment
Вы имеете в виду в конкретном месте (широта/долгота). На самом деле разница может составлять всего +-20 км, что ничтожно мало по сравнению с 6371 км (ошибка +-0,003%...). В любом случае, вы можете проверить параметр высоты, предоставленный GPS, или этим API Google. - person m0skit0; 22.02.2012
comment
Рад, что это сработало. Не забудьте выбрать ответ, который сработал для вас ;) - person m0skit0; 23.02.2012
comment
Обратите внимание, что перемещение по маленькому кругу широты не дает минимальную и максимальную долготу. См. janmatuschek.de/LatitudeLongitudeBoundingCoordinates. - person luxcem; 19.02.2013
comment
@ m0skit0 Я ищу аналогичный pblm, который я хочу найти в районе нескольких x км от заданной позиции. Как настроить таргетинг? любые примеры кода, пожалуйста - person G K; 02.05.2013
comment
Пожалуйста, напишите свой вопрос. - person m0skit0; 04.05.2013

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

Окружность Земли составляет примерно 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 записей я бы не стал беспокоиться

person Dampsquid    schedule 20.02.2012

Здесь есть две проблемы: 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) времени окрестность вашего автомобиля без необходимости перебирать все точки.

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

person user1139880    schedule 20.02.2012