#sql #postgresql #qgis #postgresql-triggers
Вопрос:
В QGIS у меня есть таблица точек и таблица областей. Когда я помещаю точку в область, мне нужно, чтобы произошло следующее. Возьмите идентификатор области (называемой plat_page), в которую помещается новая точка. Затем я хочу вставить следующее значение в последовательности в новую запись в столбце с именем «node_id» на основе того, какие точки уже существуют в этой области. Моя проблема в том, что последовательность является буквенно-цифровой, где первые 4 символа-это plat_page, а последние три-последовательность. Кроме того, я не уверен, как определить область, в которой я поместил новую точку. «Идентификатор узла» выглядит примерно так:
510C101
где 510C
находится plat_page, и 101
это число, которое мне нужно упорядочить.
Вот пример, я размещаю точку в области с параметром plat_page 610C
. Я хочу получить plat_page, а затем проверить, какое, скажем, наибольшее значение в существующей последовательности 100
. Затем я хочу сгенерировать следующее значение в последовательности 610C101
и вставить его в столбец с именем «node_id».
До сих пор у меня был способ захватить наибольшее число в последовательности для заданной страницы plat_page, но я хочу автоматизировать этот процесс, чтобы точка вставки определяла, что это за страница plat. Кроме того, я не уверен, как упорядочить последнее число, а затем присоединить его к значению plat_page, чтобы сгенерировать «идентификатор узла». Ниже приведен код того, что у меня есть.
SELECT MAX(RIGHT ("node_id",3)::numeric) from sewers.structures
WHERE(
ST_WITHIN(
ST_CENTROID((ST_SetSRID(structures.geom, 4326))),
ST_SetSRID((SELECT geom FROM sewers."Qrtr_Qrtr_Sections" WHERE "plat_page" = '510D'),4326)) ) and "node_id" != 'PRIVATE'
Я также приложил эту скрипку с образцами данных, чтобы помочь в понимании.
Ответ №1:
Это то, чего ты хочешь? Получите содержащий plat_page и следующий идентификатор для структур. Опущен ST_SetSRID для простоты, если предположить, что все геометрии имеют одинаковый SRID.
select qqs.plat_page,
(select MAX(RIGHT (s2."node_id",3)::numeric)
from structures s2
where ST_WITHIN(ST_CENTROID(s2.geom), qqs.geom)) 1 id,
s.*
from structures s
join "Qrtr_Qrtr_Sections" qqs on ST_WITHIN(ST_CENTROID(s.geom), qqs.geom)
Примечание. Я добавил дополнительную строку, чтобы убедиться, что хотя бы одна структура находится в «Qrtr_Qrtr_Sections».
Комментарии:
1. Это ближе к тому, что я хочу, но я намереваюсь, чтобы это была функция запуска. Кроме того, мне нужна функция триггера для автоматического заполнения столбца «node_id» идентификатором длиной 7 символов, первые четыре из которых являются информацией о plat_page, а последние три-порядковым номером.