Для списка точек, точка внутри любого многоугольника или нет - PullRequest
2 голосов
/ 20 января 2020

У меня есть таблица с 200000 точек и еще одна таблица с около 50000 полигонов в PostGIS. Полигоны могут перекрываться друг с другом.

Как я могу запросить PostGIS, чтобы получить флаг для каждой точки, указывающий, пересекает ли он какой-либо полигон или нет? Точка может касаться наложенных на деревья полигонов, но я хочу, чтобы значение true или false, только если касается любого многоугольника в таблице.

Обновлено с примерами данных:

CREATE TABLE poi (id integer,geom GEOMETRY);
INSERT INTO poi VALUES (1,'POINT(28 27)');
INSERT INTO poi VALUES (2,'POINT(12.1321018521888 30.2084895425822)');
INSERT INTO poi VALUES (3,'POINT(24.1330003363259 37.3570074902601)');
INSERT INTO poi VALUES (4,'POINT(41.9053232823 31.3888090347548)');
INSERT INTO poi VALUES (5,'POINT(37.1416078534822 18.033534226006)');
INSERT INTO poi VALUES (6,'POINT(34.3933104907027 18.7290161619684)');

CREATE TABLE poly (geom GEOMETRY);
INSERT INTO poly VALUES ('POLYGON((30 10,40 40,20 40,10 20,30 10))');
INSERT INTO poly VALUES ('POLYGON((35 15,38 30,20 35,35 15))');

enter image description here

Результат, который я хочу:

1   true
2   false
3   true
4   false
5   false
6   true

1 Ответ

3 голосов
/ 20 января 2020

Просто используйте функцию ST_Contains с обеими геометриями. В зависимости от вашего варианта использования отметьте ST_Overlaps, ST_Touches или ST_Intersects

Выберите все точки, содержащиеся в многоугольниках

SELECT ST_AsText(poly.geom), ST_AsText(poi.geom)
FROM poi,poly
WHERE ST_Contains(poly.geom,poi.geom);

                st_astext                 |                st_astext                 
------------------------------------------+------------------------------------------
 POLYGON((30 10,40 40,20 40,10 20,30 10)) | POINT(28 27)
 POLYGON((30 10,40 40,20 40,10 20,30 10)) | POINT(24.1330003363259 37.3570074902601)
 POLYGON((35 15,38 30,20 35,35 15))       | POINT(28 27)
 POLYGON((35 15,38 30,20 35,35 15))       | POINT(34.3933104907027 18.7290161619684)
(4 Zeilen)

Получите логическое значение, указывающее, содержатся ли точки в каком-либо многоугольнике во внешней таблице

SELECT 
  id, 
  EXISTS (SELECT * FROM poly WHERE ST_Contains(poly.geom,p.geom)) 
FROM poi p;

 id | exists 
----+--------
  1 | t
  2 | f
  3 | t
  4 | f
  5 | f
  6 | t
(6 Zeilen)

Дальнейшее чтение:

...