Relacja jeden do wielu w QGIS z PostGIS

9

Czy ktoś wie o jakimkolwiek narzędziu, które może nawiązać relację jeden do wielu w QGIS?

Mam swoje dane w bazie danych PostGIS. Chciałbym mieć możliwość przeszukiwania warstw przestrzennych związanych z tabelami przestrzennymi lub nieprzestrzennymi i odwrotnie. Wierzę, że istniał sposób w ArcGIS 9.x, który pozwolił zrobić coś podobnego.

Ryan Garnett
źródło

Odpowiedzi:

12

Użyj tabeli przestrzennego, zwany locationoraz inną tabelę non-przestrzenną, sample. Aby uczynić go przestrzennym, używany jest widok o nazwie location_sample. Poniższy schemat wykorzystuje składnię 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;

Powinieneś być w stanie załadować location_samplew QGIS lub dowolnym GIS, którego używasz. Przydziel każdemu samplez location_name, a pojawi się w tym miejscu. Jeśli używasz QGIS 1.8, musisz rozważyć dodatkowy krok . „Kluczem podstawowym” dla tego widoku jest sid(pomyśl „identyfikator próbki”).

Jak skonfigurowałem klucz obcy między locationi samplejest:

  • jeśli wpiszesz location_namew próbce, która nie istnieje lub jest wpisana niepoprawnie (spacje, myślniki, wielkość liter itp.), nie pozwoli ci to użyć (tj. MATCH SIMPLE)
  • jeśli zmienisz nazwę location(w namepolu), wówczas wszystkie próbki do niej podłączone zaktualizują swoje location_namepola (tj. ON UPDATE CASCADE)
  • jeśli usuniesz locationwiersz, wszystkie połączone z nim próbki zostaną usunięte (tj. ON DELETE CASCADE)

Przeczytaj o ograniczeniach klucza obcego, aby uzyskać różne zachowania, które mogą lepiej pasować do Twojej sytuacji.

Można również podsumować samplewartości przy użyciu funkcji agregujących, jak count, min, avgitp, i zrobić to podobny widok przestrzenny. Ma to sens, jeśli dodasz kolumny numeryczne do tabeli nieprzestrzennej.

Mike T.
źródło