Поиск геокодированной информации по расстоянию - PullRequest
3 голосов
/ 16 июня 2009

У меня есть база адресов, все геокодированы.

Каков наилучший способ найти все адреса в нашей базе данных в пределах определенного радиуса заданного широта, lng?

Другими словами, пользователь вводит (lat, lng) местоположения, и мы возвращаем все записи из нашей базы данных, которые находятся в пределах 10, 20, 50 ... и т.д. миль от данного местоположения.

Это не должно быть очень точным.

Я использую MySQL DB в качестве серверной части.

Ответы [ 6 ]

5 голосов
/ 16 июня 2009

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

http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html

Существует множество деталей о том, как выполнить то, что вы просите, в зависимости от того, как ваши пространственные данные представлены в БД.

Другим вариантом является создание функции для расчета расстояния с использованием уже упомянутой формулы Хаверсайна. Математика за этим может быть найдена здесь:

www.movable-type.co.uk / скрипты / latlong.html

Надеюсь, это поможет.

3 голосов
/ 16 июня 2009

Вы не упомянули свою базу данных, но в SQL Server 2008 это так же просто, как при использовании типов данных географии

Это позволит найти все почтовые индексы в пределах 20 миль от почтового индекса 10028

SELECT h.*
FROM zipcodes g
JOIN zipcodes h ON g.zipcode <> h.zipcode
AND g.zipcode = '10028'
AND h.zipcode <> '10028'
WHERE g.GeogCol1.STDistance(h.GeogCol1)<=(20 * 1609.344)

см. Также здесь Близкий поиск SQL Server 2008 с типом данных Geography

Версия SQL Server 2000 находится здесь: S Почтовый индекс QL сервера Поиск широты / долготы на расстоянии

2 голосов
/ 16 июня 2009

Если вы используете базу данных, которая поддерживает пространственные типы, вы можете создать запрос напрямую, и база данных будет обрабатывать его. PostgreSQL, Oracle и последняя версия MS SQL поддерживают это, как и некоторые другие.

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

2 голосов
/ 16 июня 2009

Это типичная проблема пространственного поиска.

1> Какие базы данных вы используете, sql2008, oracle, база геоданных ESRI и postgis - это некоторый пространственный механизм базы данных, который имеет этот функционал. 2> В противном случае, вы, вероятно, ищете некоторую пространственную библиотеку Algo, если хотите этого достичь. Вы можете написать код для себя, но я не буду предлагать, потому что геометрия вычислений - сложная проблема.

1 голос
/ 16 июня 2009

Я не помню уравнения с макушки головы, но формула Хаверсин используется для вычисления расстояний между двумя точками на Земле. Вы можете Google уравнение и посмотреть, если это дает вам какие-либо идеи. Извините, я знаю, что это не сильно поможет, но, возможно, это даст начало.

0 голосов
/ 16 июня 2009

Если он не должен быть очень точным, и я предполагаю, что в вашей таблице есть столбцы x и y, просто выделите все строки в большом ограничивающем прямоугольнике и используйте пифагор (или Haversine), чтобы обрезать результаты в поворотах.

например. выберите * в местах, где (x между xpos-10 милями и xpos + 10 милями) и (y между xpos -10 милями и ypos + 10 милями).

Помните, что пифагор - это sqrt (x_dist ^ 2 + y_dist ^ 2).

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

...