有谁知道可以在QGIS中建立一对多关系的工具吗?
我的数据保存在PostGIS数据库中。我希望能够查询与空间或非空间表相关的空间层,反之亦然。我相信ArcGIS 9.x中有一种方法可以做类似的事情。
有谁知道可以在QGIS中建立一对多关系的工具吗?
我的数据保存在PostGIS数据库中。我希望能够查询与空间或非空间表相关的空间层,反之亦然。我相信ArcGIS 9.x中有一种方法可以做类似的事情。
Answers:
使用一个称为的空间表,location
以及另一个非空间表sample
。为了使其具有空间性,使用了称为的视图location_sample
。下面的模式使用PostGIS 2.0 typmod语法:
CREATE TABLE location(
gid serial NOT NULL,
geom geometry(Point,4326),
name character varying(50) NOT NULL,
CONSTRAINT location_pkey PRIMARY KEY (gid),
CONSTRAINT name_unique UNIQUE (name)
);
CREATE INDEX location_geom_idx ON location USING gist (geom);
CREATE TABLE sample(
sid serial NOT NULL,
name character varying(50) NOT NULL,
location_name character varying(50),
CONSTRAINT sample_pkey PRIMARY KEY (sid),
CONSTRAINT location_name_fkey FOREIGN KEY (location_name)
REFERENCES location (name) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
);
CREATE INDEX fki_location_name_fkey ON sample USING btree (location_name);
CREATE VIEW location_sample AS
SELECT sample.sid, location.geom, sample.location_name, sample.name
FROM location
LEFT JOIN sample ON sample.location_name = location.name;
您应该能够location_sample
在QGIS或正在使用的任何GIS中进行加载。给每个分配sample
一个location_name
,它将出现在该位置。如果您使用的是QGIS 1.8,则需要考虑一个额外的步骤。该视图的“主键”为sid
(请考虑“样本ID”)。
我如何在和之间设置外键是:location
sample
location_name
样本中不存在或输入不正确的样本(空格,破折号,大小写等),将不允许您使用它(即MATCH SIMPLE
)location
(在name
字段中),那么所有与其连接的示例都会更新其location_name
字段(即ON UPDATE CASCADE
)location
一行,则与之连接的所有示例都将被删除(例如ON DELETE CASCADE
)阅读外键约束,以获取不同的行为,这可能更适合您的情况。
您也可以总结sample
使用聚合函数,如价值观count
,min
,avg
,等,使之成为一个类似的空间视图。如果将数字列添加到非空间表中,这最有意义。