Отношения один-ко-многим в QGIS с PostGIS

9

Кто-нибудь знает какой-либо инструмент, который может создавать отношения «один ко многим» в QGIS?

У меня есть данные в базе данных PostGIS. Я хотел бы иметь возможность запрашивать пространственные слои, которые связаны с пространственными или непространственными таблицами и наоборот. Я считаю, что в ArcGIS 9.x был способ, позволяющий делать нечто подобное.

Райан Гарнетт
источник

Ответы:

12

Используйте пространственную таблицу, называемую location, и другую непространственную таблицу sample. Чтобы сделать его пространственным, используется вид location_sample. В приведенной ниже схеме используется синтаксис типа 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;

Вы должны иметь возможность загружаться location_sampleв QGIS или любую другую ГИС, которую вы используете. Назначьте каждому sampleс location_name, и он появится в этом месте. Если вы используете QGIS 1.8, есть дополнительный шаг для рассмотрения . «Первичный ключ» для этого представления sid(подумайте «образец ID»).

Как я настроить внешний ключ между locationи sampleявляется:

  • если вы location_nameвведете в образец, который не существует или введен неправильно (пробелы, тире, регистр и т. д.), это не позволит вам использовать его (т. е. MATCH SIMPLE)
  • если вы переименуете locationnameполе), то все связанные с ним сэмплы обновят свои location_nameполя (т. е. ON UPDATE CASCADE)
  • если вы удалите locationстроку, то все сэмплы, связанные с ней, будут удалены (т.е. ON DELETE CASCADE)

Читайте об ограничениях внешнего ключа, чтобы получить различное поведение, которое может лучше соответствовать вашей ситуации.

Кроме того, можно суммировать sampleзначения с помощью агрегатных функций, как count, min, avgи т.д., и сделать это подобное пространственное представление. Это имеет смысл, если вы добавляете числовые столбцы в вашу непространственную таблицу.

Майк Т
источник