Триггер Spatialite для обновления атрибута многоугольника с суммой атрибута точки, где точки находятся внутри многоугольника - PullRequest
0 голосов
/ 07 мая 2018

Вот моя цель: У меня есть 2 слоя в пространственной БД: - слой 'abonnes', точечный слой с атрибутом 'nbabonnes' - слой «коммуны», слой многоугольника с атрибутом «nbabonnescom» Каждый раз, когда я добавляю точку 'abonnes', я хотел бы обновить атрибут 'nbaonnescom' суммой значений 'nbabonnes' всех точек abonnes, которые находятся в пределах многоугольника, содержащего новую точку. Я попробовал этот триггер:

CREATE TRIGGER abonnes_nw_updcommunes
AFTER INSERT
ON abonnes
BEGIN
UPDATE communes SET 
    "nbabonnescom" = 
        (
        SELECT SUM(abonnes.nbabonnes)
        FROM abonnes JOIN communes ON
        ( within(abonnes.GEOMETRY, (SELECT communes.GEOMETRY FROM communes, abonnes WHERE ST_Contains(communes.GEOMETRY, NEW.GEOMETRY))))
        )
WHERE within(NEW.GEOMETRY, communes.GEOMETRY);
END;

Результат почти правильный, но на самом деле результат для 'nbabonnescom' умножается на количество полигонов 'коммуны'. Например, если мне нужно получить 23, и у меня есть 5 полигонов «коммуны», я получу 115 для nbabonnescom. Я не понимаю почему.

1 Ответ

0 голосов
/ 09 мая 2018

После нескольких тестов я нашел правильный код SQL для получения правильного результата:

CREATE TRIGGER abonnes_nw_updcommunes
AFTER INSERT
ON abonnes
BEGIN
UPDATE communes SET 
    "nbabonnescom" = 
        (
        SELECT SUM(abonnes.nbabonnes)
        FROM abonnes JOIN communes ON
        ( within(abonnes.GEOMETRY,communes.GEOMETRY )) WHERE ST_Contains(communes.GEOMETRY, NEW.GEOMETRY)
        )
WHERE within(NEW.GEOMETRY, communes.GEOMETRY);
END;
...