Отображать в пределах адресов в пределах x миль от географического местоположения с помощью карт Google - PullRequest
4 голосов
/ 14 октября 2010

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

А у меня, например, географическое положение центра города. Я хотел бы отображать на карте Google только те места, которые находятся в пределах X миль от центра города.

Если для работы каждого из этих мест потребуется географическое местоположение, возможно, я мог бы установить скрипт для использования API Google Maps API, чтобы использовать геокодирование, чтобы получить географическое местоположение для всех моих мест и обновить базу данных с помощью lat / LNG. Тогда у меня будет база данных, полная латов и длинных локаций для работы.

Как только все места имеют широту / долготу, возможно, mysql может вернуть адреса в пределах диапазона?

Ответы [ 2 ]

2 голосов
/ 14 октября 2010

Это не сложно, если у вас есть данные широты и долготы, и если кто-то даст вам формулу большого круга в формате mySQL.

@ Мэгги дала хорошую ссылку. Как эффективно найти ближайшие места поблизости от заданного местоположения

Стратегия индексации: имейте в виду, что одна минута широты (1/60 градуса) составляет одну морскую милю или 1,1515 статутных миль (приблизительно) по всему миру. Так что индексируйте столбец широты и выполняйте поиск следующим образом. (Если вы находитесь в той части мира, где используется км, вы можете преобразовать; извините за ответ на вопрос о старой Британской империи, но они определили морскую милю.)

WHERE mylat BETWEEN column.lat-(myradius*1.1515) AND column.lat+(myradius*1.1515)
  AND (the big distance formula) <= myradius

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

Еще одно уточнение: вы также можете индексировать долготу. Проблема в том, что расстояние от земли напрямую не связано с долготой. На экваторе это одна морская миля в минуту, но она становится меньше, а на полюсах есть особенности. Таким образом, вы можете добавить еще один термин в вашем ГДЕ. Это дает правильные результаты, но не так избирательно, как индексирование по широте. Но это все же помогает при поиске индексации, особенно если у вас есть много строк, чтобы просмотреть. Итак, вы получите:

WHERE mylat BETWEEN column.lat-(myradius*1.1515) AND column.lat+(myradius*1.1515)
  AND mylon BETWEEN column.lon-(myradius*1.1515) AND column.lon+(myradius*1.1515)
  AND (the big distance formula) < myradius
0 голосов
/ 15 марта 2011

Скорее всего, вы хотите использовать кривую заполнения пространства или пространственный индекс, чтобы свести вашу двумерную задачу к одномерной. Например, вы можете объединить пару широта / длинная с кривой z или кривой Гильберта. Я использую для себя кривую Гильберта для поиска почтовых индексов. Вы можете найти мое решение на phpclasses.org (кривая Гильберта).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...