Relacionamento Um para Muitos no QGIS com PostGIS

9

Alguém conhece alguma ferramenta que possa fazer um relacionamento Um para Muitos no QGIS?

Eu tenho meus dados em um banco de dados PostGIS. Gostaria de poder consultar camadas espaciais relacionadas a tabelas espaciais ou não espaciais e vice-versa. Acredito que havia uma maneira no ArcGIS 9.x que permitia fazer algo semelhante.

Ryan Garnett
fonte

Respostas:

12

Use uma tabela espacial, chamada location, e outra tabela não espacial sample,. Para torná-lo espacial, é usada uma visão chamada location_sample. O esquema abaixo está usando a sintaxe do typmod do 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;

Você deve conseguir carregar location_sampleno QGIS ou em qualquer GIS que estiver usando. Atribua cada sampleum com um location_namee ele aparecerá nesse local. Se você estiver usando o QGIS 1.8, há uma etapa extra a considerar . A "chave primária" para esta visualização é sid(pense em "ID da amostra").

Como eu configurei a chave estrangeira entre locatione sampleé:

  • se você digitar um location_namena amostra que não existe ou foi digitado incorretamente (espaços, traços, maiúsculas e minúsculas), não permitirá que você o use (por exemplo, MATCH SIMPLE)
  • se você renomear um location(no namecampo), todas as amostras conectadas a ele atualizarão seus location_namecampos (ou seja, ON UPDATE CASCADE)
  • se você excluir uma locationlinha, todas as amostras conectadas a ela serão excluídas (por exemplo, ON DELETE CASCADE)

Leia as restrições de chave estrangeira para obter comportamentos diferentes, que podem corresponder melhor à sua situação.

Você também pode resumir samplevalores usando funções agregadas, como count, min, avg, etc, e fazer deste um visão espacial similar. Isso faz mais sentido se você adicionar colunas numéricas à sua tabela não espacial.

Mike T
fonte