Получите многоугольник близко к лату, долго в MySQL

StackOverflow https://stackoverflow.com/questions/1902287

  •  19-09-2019
  •  | 
  •  

Вопрос

Кто -нибудь знает способ принести все многоугольники в DB MySQL на данном расстоянии от точки? Фактическое расстояние не так важно, поскольку оно рассчитывается для каждого найденного многоугольника позже, но было бы огромной оптимизацией просто сделать этот расчет для полигонов, которые являются «близкими».

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

Какие-либо предложения?

Это было полезно?

Решение

Медленная версия (без пространственных индексов):

SELECT  *
FROM    mytable
WHERE   MBRIntersects(mypolygon, LineString(Point(@X - @distance, @Y - @distance), Point(@X + @distance, @Y + @distance))

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

Затем создайте SPATIAL INDEX на поле, которое содержит координаты вершин и просто выпустите этот запрос:

SELECT  DISTINCT polygon_id
FROM    vertices
WHERE   MBRContains(vertex, LineString(Point(@X - @distance, @Y - @distance), Point(@X + @distance, @Y + @distance))

Все будет намного проще, если вы храните UTM Координирует в вашей базе данных, а не в широте и долготе.

Другие советы

Я не думаю, что есть единственный ответ на это. Как правило, вопрос о том, как организовать ваши данные, чтобы они использовали пространственную местность, присущую вашей проблеме.

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

Проблема с этим подходом заключается в том, что мы говорим, что мы говорим о сферических координатах (LAT, как правило,) являются сингулярными, поскольку сетка «квадраты» становится все более узкой, когда вы приближаетесь к полюсам. Легкий подход к этому ... не помещайте никаких очков близко к столбам ... :)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top