Может быть сделано одним оператором выбора, но для производительности ... посмотрите на гистический индекс ваших полигонов.Для простоты, скажем, у меня есть таблица с полигональным полем (тип данных 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.