Геометрический поиск

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Великий круг SQL

Великий круг 2

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