Самый быстрый способ найти местоположение (zip, город, состояние) данный широту/долготу

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

10
задан Ryan Detzel 12 August 2009 в 13:39
поделиться

9 ответов

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

Пожалуйста, прочтите это перед голосованием против : есть способы ускорить перебор, подобный этому, но я обнаружил, что они обычно не стоят того. Я не только использовал этот подход раньше, чтобы найти ближайший почтовый индекс по широте / долготе, я использовал его в приложении Windows Mobile (где вычислительная мощность не слишком высока) и все еще достигал времени поиска менее секунды. Пока вы избегаете использования триггерных функций, это недорогой процесс.

Обновление: вы можете ускорить время поиска, распределив ваши zip-данные по подобластям (например, квадрантам, таким как северо-запад, юго-восток и т. д.) и сохранив идентификатор региона с каждой точкой данных. Таким образом, при поиске вы сначала определяете, в каком регионе находится ваше текущее местоположение, и сравниваете только с этими точками данных.

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

и сравнивайте только с этими точками данных.

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

и сравнивайте только с этими точками данных.

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

9
ответ дан 3 December 2019 в 16:53
поделиться

Используйте kd-tree для ускорения поиска ближайшего соседа. На любой платформе должно быть доступно множество бесплатных реализаций.

3
ответ дан 3 December 2019 в 16:53
поделиться

Это не открытый исходный код, но, возможно, вы могли бы использовать API Карт Google:

Обратное геокодирование

1
ответ дан 3 December 2019 в 16:53
поделиться

вам следует проверить geonames . у них есть API, который возвращает XML и / или JSON. также вы можете добавить их базу данных.

1
ответ дан 3 December 2019 в 16:53
поделиться

Другой поток рекомендует mod_geoip через MaxMind. Он работает на уровне Apache еще до того, как дойдет до PHP / .NET / Java. API геолокации Maxmind: Apache против PHP

0
ответ дан 3 December 2019 в 16:53
поделиться

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

Если вы можете использовать SQL 2008 (стандартный или экспресс), вы можете использовать пространственные данные типы.

0
ответ дан 3 December 2019 в 16:53
поделиться

Программа Yahoo! Placemaker - это бесплатная веб-служба, которая может это сделать. Он может искать названия мест («Нью-Йорк», «Букингемский дворец»), но он также может искать широту и долготу с помощью микроформата Geo .

Для использования службы вы отправляете Запрос POST, и он возвращает XML:

Небольшой пример командной строки (я скрыл свой идентификатор приложения Yahoo!; вам нужно зарегистрировать свой собственный):

$ curl -X POST -ddocumentContent='<div class="geo">GEO: <span class="latitude">37.386013</span>, <span class="longitude">-122.082932</span></div>' -ddocumentType='text/html' -dappid='your_yahoo_app_id' http://wherein.yahooapis.com/v1/document

Это возвращает очень подробный XML-документ, частично из них:

<type>Town</type>
<name><![CDATA[Los Altos, CA, US]]></name>

Он также содержит следующие данные:

<type>Zip</type>
<name><![CDATA[94024, Los Altos, CA, US]]></name>

Я не очень часто использовал Placemaker, но использовал их API геокодирования , и это очень быстро. Добавьте к этому локальный memcached , и пользователи понятия не имеют, что данные не являются локальными.

0
ответ дан 3 December 2019 в 16:53
поделиться

Посмотрите в базе данных geonames.org исходные данные.

Для легкой базы данных sqlite - хороший выбор.

geonames также выполняет веб-сервис, но если вы хотите сделать это самостоятельно без веб-вызова (а это звучит так, как будто вы это делаете), вам понадобится локальный база данных. Затем вам просто нужно выполнить правильные расчеты триггеров, чтобы определить расстояние по большому кругу (Google, которое) между парой точек широты / долготы, а затем упорядочить результаты по расстоянию. Вы также можете использовать ограничивающую рамку или радиус, если хотите ограничить радиус поиска перед выполнением вычислений.

Если ваша локальная база данных может быть основана на SQL (что является sqllite3), тогда все это складывается в SQL-запрос, который добавляет кучу триггерных вычислений для вычисления столбца «расстояние» и, возможно, также аналогичное «где» предложение для ограничения поиска в пределах радиуса или ограничивающей рамки. Вычислив столбец расстояния в вашем запросе, его легко отсортировать по расстоянию и добавить любые другие критерии, которые вам нравятся. Если вы знакомы с ruby ​​/ rails и хотите увидеть хороший пример того, как это делается, посмотрите исходный код плагина GeoKit rails.

0
ответ дан 3 December 2019 в 16:53
поделиться

Как далеко от вашего исходного местоположения вы ожидаете, что ближайший город? 50 миль? 200 миль? 500 миль? Если два города почти равноудалены, имеет ли значение, если ваш алгоритм выберет именно более близкий? Вы можете использовать эту информацию, чтобы ускорить поиск.

Если вы можете разумно предположить, что разница расстояний мала (~ 250 миль или около того, вероятно, достаточно близко, чтобы считаться «малым»), и ваш расчет расстояния может быть немного «нечетким», тогда вы можете оптимизировать ' проверка грубой силы, ограничив пространство поиска до +/- 5 широт от источника (~ 70 миль на шир, так что это дает вам около 350 миль к северу и югу) и +/- 5 длин (при условии, что вы не не ищу города на полюсах, это где-то от ~ 350 миль на экваторе до ~ 100 миль в северной Канаде).

0
ответ дан 3 December 2019 в 16:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: