Поиск соседних полигонов - постгис запрос

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

Теперь я хотел бы выполнить запрос, который находит все "проверенные" полигоны. Что-то вроде:

SELECT * FROM gemstat WHERE spread = 1

и затем я хотел бы установить атрибут "распространения" в "1" в каждом соседнем многоугольнике, который еще не проверен. (Я также хочу установить второй атрибут, но это лишь незначительное дополнение)

Во-первых, давайте начнем с запроса, который выбирает все многоугольники, которые являются соседями многоугольника с расширением = 1

SELECT (b."GEM_NR")
FROM gemstat_simple5 as a
JOIN gemstat_simple5 as b
ON ST_Touches((a.the_geom),b.the_geom)
where a.spread =1;

Этот запрос возвращает все многоугольники, которые являются соседями многоугольника с расширением = 1

Теперь я хочу обновить таблицу на основе результатов этого подзапроса. Это реализуется с помощью этого фрагмента кода, предоставленного Джоном Пауэллом, также известным как Barca (см. Ответ, а также комментарии ниже):

Update gemstat_simple5 gem set spread=1, time=2
FROM (
   SELECT (b."GEM_NR")
   FROM gemstat_simple5 as a,
   gemstat_simple5 as b
   WHERE ST_Touches(a.the_geom, b.the_geom) 
   AND a."GEM_NR" != b."GEM_NR"
   AND a.spread = 1
) as subquery
WHERE gem."GEM_NR" = subquery."GEM_NR"

Запустите этот запрос, и он установит атрибуты распространение 1 и время 2 смежных полигонов, не касаясь исходных полигонов с расширением = 1. Поэтому он представляет собой идеальный ответ на мой вопрос.

2 ответа

Решение

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

Update gemstat_simple5 gem set spread=1, time=2
  FROM (
     SELECT (b."GEM_NR")
       FROM gemstat_simple5 as a,
            gemstat_simple5 as b
       WHERE ST_Touches(a.the_geom, b.the_geom) 
       AND a."GEM_NR" != b."GEM_NR"
       AND a.spread = 1
     ) as subquery
 WHERE gem."GEM_NR" = subquery."GEM_NR"

Обратите внимание, я поставил AND a."GEM_NR"

Прямой ответ

SELECT a.*
FROM polygon1 as a
JOIN polygon1 as b
ON st_intersects((st_buffer(a.the_geom,0.00001)),b.the_geom) 
where b.id = 561334;

Протестировано на моей машине, и оно также дает идентификатор, который вы даете в классе где. Пространственная ссылка моей таблицы полигонов - EPSG:4326...

Другие вопросы по тегам