QGISで1対多の関係を実現できるツールを知っている人はいますか?
PostGISデータベースにデータがあります。空間テーブルまたは非空間テーブルに関連する空間レイヤーをクエリしたり、その逆もできるようにしたいと思います。私は、ArcGIS 9.xに同様のことを可能にする方法があったと思います。
QGISで1対多の関係を実現できるツールを知っている人はいますか?
PostGISデータベースにデータがあります。空間テーブルまたは非空間テーブルに関連する空間レイヤーをクエリしたり、その逆もできるようにしたいと思います。私は、ArcGIS 9.xに同様のことを可能にする方法があったと思います。
回答:
と呼ばれる空間テーブルと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
、など、これと同様の空間ビューします。非空間テーブルに数値列を追加する場合、これは最も理にかなっています。