Relación uno a muchos en QGIS con PostGIS

9

¿Alguien sabe de alguna herramienta que pueda hacer una relación uno a muchos en QGIS?

Tengo mis datos en una base de datos PostGIS. Me gustaría poder consultar capas espaciales relacionadas con tablas espaciales o no espaciales y viceversa. Creo que había una forma en ArcGIS 9.x que permitía hacer algo similar.

Ryan Garnett
fuente

Respuestas:

12

Use una tabla espacial, llamada location, y otra tabla no espacial, sample. Para hacerlo espacial, se utiliza una vista llamada location_sample. El siguiente esquema utiliza la sintaxis típica 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;

Debería poder cargar location_sampleen QGIS o cualquier GIS que esté utilizando. Asigne cada uno samplecon un location_name, y aparecerá en esa ubicación. Si está utilizando QGIS 1.8, debe considerar un paso adicional . La "clave principal" para esta vista es sid(piense en "ID de muestra").

Cómo configuré la clave externa entre locationy samplees:

  • si escribe una location_namemuestra que no existe o que está escrita incorrectamente (espacios, guiones, mayúsculas, etc.), no le permitirá usarla (es decir, MATCH SIMPLE)
  • si cambia el nombre de a location(en el namecampo), todas las muestras conectadas a él actualizarán sus location_namecampos (es decir, ON UPDATE CASCADE)
  • si elimina una locationfila, se eliminarán todas las muestras conectadas a ella (es decir, ON DELETE CASCADE)

Lea sobre las restricciones de clave externa para obtener diferentes comportamientos, que podrían coincidir mejor con su situación.

También puede resumir samplevalores utilizando funciones de agregado, como count, min, avg, etc, y hacer de este un punto de vista espacial similar. Esto tiene más sentido si agrega columnas numéricas a su tabla no espacial.

Mike T
fuente