2009-03-09 3 views
4

В приложении есть требование, в котором указано, что все объекты, которые привязаны к определенной стране и/или городу, отображаются на карте google.Geo Proximity Search

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

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

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

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

+0

Не следует ли представлять Амстердам (или любое другое место) нерегулярным многоугольником, представляющим границы города? –

+0

Бог это напоминает мне мои дни физики: предположим, что Амстердам - ​​это сфера ... – annakata

+0

Разве это не дубликат вашего собственного вопроса: http://stackoverflow.com/questions/610496? – vartec

ответ

2

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

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

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

+0

Это решение может не работать, так как мне нужно изменить схему базы данных или всю базу данных. Есть ли другой способ, например. я могу получить ограничительную рамку, в которой находится Амстердам, и ограничивающий прямоугольник объекта, диапазон обслуживания которого перекрывает ограничивающий прямоугольник Амстедама – Asif

+0

Я не вижу, как это может работать, если у вас нет полигона для Амстердама. –

+0

Хорошо, тогда как я могу получить детали многоугольника, используя google api? – Asif

1

Возможно, вы захотите взглянуть на MySQL spatial extensions.

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

+0

Как я могу вычислить данные полигона на основе точки, которая у меня есть? также использовать пространственное расширение MySQL, есть ли необходимость в изменении структуры базы данных? – Asif

+0

Вы используете функции Polygon, или если это круг, вы можете просто использовать Distance. Да, вам нужно использовать пространственные поля и индексы. –

+0

Да, мне нужно использовать функцию многоугольника, но для использования функции многоугольника мне нужен набор координат, который определяет мою страну или город. Форма, где мы можем это получить? – Asif

1

OK Из того, что я понимаю, вы в основном пытаетесь рассчитать расстояние между 2 лат/длинными точками. Я бы начал с дисконтирования тех, которые находятся вне вашей сферы (скажем) 10 миль. Поэтому из вашей центральной точки вы захотите получить координаты 10 миль, Восток, Запад, Юг и Север. Для этого вам необходимо использовать формулу Great-circle distance.

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

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

Haversine Formula in C# and in SQL

Determine the distance between ZIP codes using C#

Great Circle SQL

Great Circle 2

+0

Thanx для справки. Но это только даст вам расстояние между двумя точками. Также вы предполагаете, что вы собираетесь узнать точки, находящиеся в радиусе 10 миль. – Asif

+0

В моем случае я хочу узнать точки, которые находятся в конкретной стране/городе (независимо от дальности или радиуса), также точки, которые не находятся в этой стране или городе, но в близлежащем регионе, имеющие службу, которая может пересекать границу страны/города – Asif

1

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