QGIS加載與編輯視圖圖層


1、數據准備

在PostGIS中導入點層數據valve,valve表中擁有字段(gid,oldno1,subtype,diameter,addr,geom),並建立valve的屬性擴展表valve_ext

創建擴展表

--DROP SEQUENCE waterdataset.valve_ext_seq;
CREATE SEQUENCE waterdataset.valve_ext_seq
    INCREMENT 1
    START 1
    MINVALUE 1
    MAXVALUE 2147483647
    CACHE 1;
 
ALTER SEQUENCE waterdataset.valve_ext_seq
    OWNER TO postgres;

-- Table: waterdataset.valve_ext
--DROP TABLE waterdataset.valve_ext;
CREATE TABLE waterdataset.valve_ext
(
    id integer NOT NULL DEFAULT nextval('waterdataset.valve_ext_seq'::regclass),
    gid integer NOT NULL,
    extname character(50) COLLATE pg_catalog."default",
    CONSTRAINT valve_ext_pkey PRIMARY KEY (id)
        USING INDEX TABLESPACE sy_water,
    CONSTRAINT gid_unique UNIQUE (gid)
        USING INDEX TABLESPACE sy_water
)
WITH (
    OIDS = FALSE
)

TABLESPACE sy_water;
ALTER TABLE waterdataset.valve_ext
    OWNER to postgres;

 2、創建視圖

基於點表valve和屬性擴展表valve_ext建立視圖valveview

--創建視圖
CREATE OR REPLACE VIEW waterdataset.valveview AS
 SELECT t1.gid,
    t1.oldno1,
    t1.subtype,
    t1.diameter,
    t1.addr,
    t1.geom,
    t2.extname
   FROM waterdataset.valve t1
     LEFT JOIN waterdataset.valve_ext t2 ON t1.gid = t2.gid;

ALTER TABLE waterdataset.valveview
    OWNER TO postgres;

3、在QGIS中加載視圖圖層

在qgis中加載視圖圖層,啟動圖層編輯,編輯屬性后提示不是簡單視圖,需要通過規則或觸發器來制定更新、插入、刪除命令。

 

 

 

4、建立視圖的編輯規則

PostgreSQL規則語法

CREATE [ OR REPLACE ] RULE name AS ON event
    TO table [ WHERE condition ]
DO [ ALSO | INSTEAD ] { NOTHING | command | ( command ; command ... ) }

基於以上語法我們創建視圖的編輯規則,以update命令為例

因為我們的視圖需要更新兩個表,主表valve與擴展屬性表valve_ext,所以在DO INSTAEAD后我們需要執行多條命令,按照語法在()中以分號分隔多條命令。

更新實現邏輯更新屬性后先更新主表valve屬性,然后更新valve_ext屬性(如果不存在則插入,這里用到了PostgreSQL的upsert特性)

CREATE OR REPLACE RULE valveview_upd AS
    ON UPDATE TO waterdataset.valveview
    DO INSTEAD
( UPDATE waterdataset.valve 
  SET gid = new.gid, oldno1 = new.oldno1, subtype = new.subtype, diameter = 
  new.diameter, addr = new.addr, geom = new.geom
  WHERE valve.gid = old.gid;
  INSERT INTO waterdataset.valve_ext (gid, extname)
  VALUES (new.gid, new.extname) ON CONFLICT(gid) DO UPDATE SET gid = excluded.gid, extname = excluded.extname;
);
--EXCLUDED upsert語法中待插入的數據對象關鍵字

PostgreSQL的upsert語法

INSERT INTO table VALUES(…) ON CONFLICT(唯一字段)DO UPDATE SET

建立好規則后更新視圖成功

UPDATE waterdataset.valveview SET gid=517,oldno1 = '1005',extname='擴展屬性'
WHERE gid = 517;

UPDATE 1 耗時54 msec 成功返回查詢

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM