Один з багатьох стосунків у 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 або будь-який інший GIS, який ви використовуєте. Призначте кожного sampleзі знаком location_name, і він з’явиться в цьому місці. Якщо ви використовуєте QGIS 1.8, є додатковий крок . "Первинний ключ" для цього перегляду є sid(подумайте "зразок ідентифікатора").

Як я встановив зовнішній ключ між locationі sample:

  • якщо ви введете location_nameзразок, який не існує або введений неправильно (пробіли, тире, регістр тощо), він не дозволить вам використовувати його (тобто MATCH SIMPLE)
  • якщо ви перейменовуєте a locationnameполе), то всі підключені до нього зразки оновлять свої location_nameполя (тобто ON UPDATE CASCADE)
  • якщо ви видалите locationрядок, всі зразки, підключені до нього, будуть видалені (тобто ON DELETE CASCADE)

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.