• 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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    salmon 报错:ESC[00mException : [rapidjson internal assertion failure: IsObject()] salmon quant was invoked improperly.
    报错:RSEM can not recognize reference sequence name chr1!(基因组的bam不能直接用rsem进行表达值计算)
    R: 使用tapply根据相同ID合并指定列
    linux:去除特定列为空格的行
    知乎一答:程序员为什么要关注管理
    如何掌握一门编程语言的运用
    谈谈程序员这个职业及前景
    Oracle学习笔记(2)--Centos 7 下11gR2部署
    用flask写一个简单的接口
    iptables命令详解
  • 原文地址:https://www.cnblogs.com/gaofan/p/11645743.html
Copyright © 2020-2023  润新知