Hubungan Satu ke Banyak di QGIS dengan PostGIS

9

Adakah yang tahu alat apa pun yang dapat melakukan hubungan Satu-ke-Banyak di QGIS?

Saya memiliki data saya di database PostGIS. Saya ingin dapat meminta lapisan spasial yang terkait dengan tabel spasial atau non spasial dan sebaliknya. Saya percaya ada cara di ArcGIS 9.x yang memungkinkan untuk melakukan hal serupa.

Ryan Garnett
sumber

Jawaban:

12

Gunakan tabel spasial, yang disebut location, dan tabel non-spasial lainnya sample,. Untuk membuatnya spasial, digunakan tampilan yang disebut location_sample. Skema di bawah ini menggunakan sintaks typmod PostGIS 2.0:

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;

Anda harus dapat memuat location_sampledalam QGIS atau GIS apa pun yang Anda gunakan. Tetapkan masing sample- masing dengan location_name, dan itu akan muncul di lokasi itu. Jika Anda menggunakan QGIS 1.8, ada langkah ekstra untuk dipertimbangkan . "Kunci utama" untuk tampilan ini adalah sid(pikirkan "ID sampel").

Bagaimana saya mengatur kunci asing antara locationdan sampleadalah:

  • jika Anda mengetik location_namesampel dalam yang tidak ada, atau diketik salah (spasi, tanda hubung, kotak, dll.), itu tidak akan memungkinkan Anda untuk menggunakannya (yaitu, MATCH SIMPLE)
  • jika Anda mengganti nama location(di namebidang), maka semua sampel yang terhubung akan memperbarui location_namebidangnya (yaitu, ON UPDATE CASCADE)
  • jika Anda menghapus satu locationbaris, maka semua sampel yang terhubung akan dihapus (yaitu, ON DELETE CASCADE)

Bacalah batasan kunci asing untuk mendapatkan perilaku berbeda, yang mungkin lebih cocok dengan situasi Anda.

Anda juga dapat meringkas samplenilai-nilai menggunakan fungsi agregat, seperti count, min, avg, dll, dan membuat tampilan ruang yang sama. Ini paling masuk akal jika Anda menambahkan kolom numerik ke tabel non-spasial Anda.

Mike T
sumber