• 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 成功返回查询
    作者: GoodGF
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    C++设计模式之享元模式
    C++设计模式之中介者模式
    C++设计模式之职责链模式
    C++设计模式之命令模式
    C++设计模式之桥接模式
    C++设计模式之单例模式
    C++设计模式之组合模式
    C++设计模式之备忘录模式
    C++设计模式之适配器模式
    操作系统(4)实验0——准备知识、基本内联汇编、扩展内联汇编
  • 原文地址:https://www.cnblogs.com/gaofan/p/11645743.html
Copyright © 2020-2023  润新知