Geo Proximity Search - PullRequest
       18

Geo Proximity Search

4 голосов
/ 09 марта 2009

В приложении существует требование, согласно которому в карте Google обнаруживаются все объекты, привязанные к определенной стране и / или городу.

У нас есть объекты с соответствующей широтой и долготой, предварительно рассчитанные с помощью API Google Map и сохраненные в базе данных. Иногда эти объекты предоставляют услуги в пределах определенного диапазона / радиуса обслуживания, в пределах которого они могут предоставлять свои услуги.

Например, сейчас ситуация такова, что я хочу выяснить все объекты например, в Амстердаме.

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

Итак, я знаю значения широты и долготы Амстердама, возвращенные Google Map, также объекты, имеющие соответствующие значения lat, lng и Диапазон обслуживания / радиус сохраняется в базе данных. Как я могу сделать это возможным?

Ответы [ 4 ]

2 голосов
/ 09 марта 2009

Вы, вероятно, должны представлять страны / города как полигоны в БД, а затем использовать функции пересечения полигонов в стиле OpenGIS для пересечения.

Но , MySQL не правильно реализует пересечение полигонов (только MBR - минимальный ограничивающий прямоугольник). Таким образом, этот подход, хотя и является правильным в теории, просто не будет работать для вас с MySQL. Возможно, вы захотите переехать в Postgres.

Что вы можете сделать, это использовать возможности пересечения MBR вашей БД и дополнить их собственным кодом, который выполняет пересечение полигонов / точек (вы можете найти библиотеки, которые делают это).

1 голос
/ 09 марта 2009

Вы также можете посмотреть что-то вроде LocalSolr / LocalLucene , если вы хотите оставить механику близости к внешнему сервису.

1 голос
/ 09 марта 2009

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

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

Я вижу, что у вас есть тег PHP, но я включил некоторые формулы и примеры как в SQL (в основном), так и в C #.

Формула Хаверсина в C # и в SQL

Определить расстояние между почтовыми индексами с помощью C #

Большой круг SQL

Большой Круг 2

1 голос
/ 09 марта 2009

Возможно, вы захотите взглянуть на пространственные расширения MySQL .

Вам нужно будет использовать функцию Contains . Однако, как сказал Павел в своем комментарии, регионы должны быть представлены в виде полигонов. Если это не так, то я считаю, что вам лучше всего создать полигон с центром в точке, которую вы уже имеете.

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