Rapporto uno a molti in QGIS con PostGIS


9

Qualcuno sa di qualsiasi strumento che può fare una relazione uno-a-molti in QGIS?

Ho i miei dati in un database PostGIS. Vorrei essere in grado di interrogare i livelli spaziali correlati a tabelle spaziali o non spaziali e viceversa. Credo che in ArcGIS 9.x esistesse un modo che permettesse di fare qualcosa di simile.

Risposte:


12

Utilizzare una tabella spaziale, chiamata location, e un altro tavolo non spaziale, sample. Per renderlo spaziale, viene utilizzata una vista chiamata location_sample. Lo schema seguente utilizza la sintassi typmod di 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;

Dovresti essere in grado di caricare location_samplein QGIS o qualunque GIS che stai utilizzando. Assegna a ciascuno sampleun simbolo location_namee verrà visualizzato in quella posizione. Se si utilizza QGIS 1.8, è necessario considerare un ulteriore passaggio . La "chiave primaria" per questa vista è sid(pensa a "ID campione").

Come ho impostato la chiave esterna tra locationed sampleè:

  • se si digita un location_nameesempio inesistente o digitato in modo errato (spazi, trattini, case, ecc.), non sarà possibile utilizzarlo (ad es. MATCH SIMPLE)
  • se si rinomina un location(nel namecampo), tutti i campioni collegati ad esso aggiorneranno i loro location_namecampi (cioè, ON UPDATE CASCADE)
  • se elimini una locationriga, verranno eliminati tutti i campioni ad essa collegati (ad es. ON DELETE CASCADE)

Leggi i vincoli delle chiavi esterne per ottenere comportamenti diversi, che potrebbero corrispondere meglio alla tua situazione.

È inoltre possibile riassumere samplei valori utilizzando le funzioni di aggregazione, come count, min, avg, ecc, e fanno di questo una vista spaziale simile. Questo ha molto senso se aggiungi colonne numeriche alla tua tabella non spaziale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.