Eins zu viele Beziehung in QGIS zu PostGIS

9

Kennt jemand ein Tool, das eine Eins-zu-Viele-Beziehung in QGIS herstellen kann?

Ich habe meine Daten in einer PostGIS-Datenbank. Ich möchte in der Lage sein, räumliche Ebenen abzufragen, die sich auf räumliche oder nicht räumliche Tabellen beziehen, und umgekehrt. Ich glaube, es gab in ArcGIS 9.x einen Weg, der es ermöglichte, etwas Ähnliches zu tun.

Ryan Garnett
quelle

Antworten:

12

Verwenden Sie eine aufgerufene räumliche Tabelle locationund eine andere nicht räumliche Tabelle sample. Um es räumlich zu machen, wird eine Ansicht namens aufgerufen location_sample. Das folgende Schema verwendet die PostGIS 2.0-Typmod-Syntax:

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;

Sie sollten in der Lage sein, location_sampleQGIS oder das von Ihnen verwendete GIS zu laden . Weisen Sie jedem sampleein zu location_name, und es wird an dieser Stelle angezeigt . Wenn Sie QGIS 1.8 verwenden, müssen Sie einen zusätzlichen Schritt berücksichtigen . Der "Primärschlüssel" für diese Ansicht lautet sid(denken Sie an "Beispiel-ID").

Wie ich den Fremdschlüssel zwischen locationund eingerichtet habe sample:

  • Wenn Sie ein location_nameBeispiel eingeben, das nicht vorhanden ist oder falsch eingegeben wurde (Leerzeichen, Bindestriche, Groß- und Kleinschreibung usw.), können Sie es nicht verwenden (dh MATCH SIMPLE)
  • Wenn Sie a location(im nameFeld) umbenennen , aktualisieren alle damit verbundenen Beispiele ihre location_nameFelder (dh ON UPDATE CASCADE)
  • Wenn Sie eine locationZeile löschen , werden alle damit verbundenen Samples gelöscht (dh ON DELETE CASCADE)

Informieren Sie sich über die Fremdschlüsseleinschränkungen, um unterschiedliche Verhaltensweisen zu erhalten, die möglicherweise besser zu Ihrer Situation passen.

Sie können auch zusammenfassen sampleWerte mit Aggregatfunktionen, wie count, min, avgusw. und dies eine ähnliche räumliche Ansicht machen. Dies ist am sinnvollsten, wenn Sie Ihrer nicht räumlichen Tabelle numerische Spalten hinzufügen.

Mike T.
quelle