Триггер размещения точки в qgis для автоматического заполнения столбца путем добавления следующего в алфавитно-цифровой последовательности в Postgresql

#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)
 

db<>скрипка

Примечание. Я добавил дополнительную строку, чтобы убедиться, что хотя бы одна структура находится в «Qrtr_Qrtr_Sections».

Комментарии:

1. Это ближе к тому, что я хочу, но я намереваюсь, чтобы это была функция запуска. Кроме того, мне нужна функция триггера для автоматического заполнения столбца «node_id» идентификатором длиной 7 символов, первые четыре из которых являются информацией о plat_page, а последние три-порядковым номером.