По заданному набору точек и многоугольников определить, какая точка лежит в каком многоугольнике (или нет) - PullRequest
5 голосов
/ 07 декабря 2011

Мой вопрос почти похож на this . Но в моем случае полигоны не обязательно соприкасаются / перекрывают друг друга. Они присутствуют по всему пространству.

У меня есть большой набор таких полигонов. Точно так же у меня есть огромный набор очков. В настоящее время я использую модуль RoR, который берет 1 точку за раз и проверяет пересечение по 1 многоугольнику за раз. База данных PostGIS. Производительность довольно медленная.

Есть ли более быстрый или оптимальный способ сделать это?

1 Ответ

1 голос
/ 09 декабря 2011

Может быть сделано одним оператором выбора, но для производительности ... посмотрите на гистический индекс ваших полигонов.Для простоты, скажем, у меня есть таблица с полигональным полем (тип данных geom) и точечным полем (тип данных geom).Если вы делаете список точек в списке многоугольников, выполните перекрестное объединение, чтобы сравнить каждый многоугольник и каждую точку.

select *
from t1 inner join t2 on 1=1
where st_contains(t1.poly,t2.point) = 't'

(изменено, чтобы включить пример объединения таблиц. Я используюперекрестное соединение, что означает, что каждый многоугольник будет соединен с каждой точкой и сравнен. Если мы говорим о большом наборе записей, запустите эти индексы дерева ГИС)

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

Может произойти сбой в ожидании типа данных, в которых хранятся ваши точки.Если они находятся в геом поле, все будет хорошо.Если вы используете текстовые значения, вам нужно использовать оператор st.geomfromtext, чтобы превратить ваши символы в точку.Это будет выглядеть примерно так:

st_contains(poly, st_geomfromtext('POINT('||lon||' ' ||lat ||')')) = 't'

Я использовал пример широта / долгота ... Единственное, на что нужно обратить внимание, это то, что geomfromtext требует, чтобы вы создали точку, используя ||создать строку из вашего поля.Дайте мне знать, если вам нужна помощь с концепцией st_geomfromtext.

...