Relation un à plusieurs dans QGIS avec PostGIS

9

Quelqu'un connaît-il un outil qui peut établir une relation un-à-plusieurs dans QGIS?

J'ai mes données dans une base de données PostGIS. Je voudrais pouvoir interroger des couches spatiales liées à des tables spatiales ou non spatiales et vice versa. Je crois qu'il y avait un moyen dans ArcGIS 9.x qui permettait de faire quelque chose de similaire.

Ryan Garnett
la source

Réponses:

12

Utiliser une table spatiale, appelée location, et une autre table non spatiale, sample. Pour le rendre spatial, une vue est utilisée appelée location_sample. Le schéma ci-dessous utilise la syntaxe typmod de 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;

Vous devriez pouvoir charger location_sampledans QGIS ou tout autre SIG que vous utilisez. Attribuez à chacun sampleun location_name, et il apparaîtra à cet endroit. Si vous utilisez QGIS 1.8, il y a une étape supplémentaire à considérer . La "clé primaire" de cette vue est sid(pensez à "ID échantillon").

Comment j'ai configuré la clé étrangère entre locationet samplec'est:

  • si vous tapez un location_nameexemple dans qui n'existe pas ou qui est mal tapé (espaces, tirets, casse, etc.), il ne vous permettra pas de l'utiliser (c.-à-d. MATCH SIMPLE)
  • si vous renommez un location(dans le namechamp), tous les échantillons qui y sont connectés mettront à jour leurs location_namechamps (c.-à-d. ON UPDATE CASCADE)
  • si vous supprimez une locationligne, tous les échantillons qui y sont connectés seront supprimés (c.-à-d. ON DELETE CASCADE)

Renseignez-vous sur les contraintes de clé étrangère pour obtenir des comportements différents, qui pourraient mieux correspondre à votre situation.

Vous pouvez également résumer les samplevaleurs en utilisant des fonctions d' agrégation, comme count, min, avg, etc, et faire une vue spatiale similaire. Cela a plus de sens si vous ajoutez des colonnes numériques à votre table non spatiale.

Mike T
la source