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