Может ли QGIS читать пространственные представления?

11

У меня есть созданная мной пространственная база данных, которая охватывает данные за несколько лет. Чтобы облегчить реальный сценарий, в котором я могу упростить взаимодействие для пользователя, введя представление, которое просто ограничивает промежуток времени или какие типы преступлений возвращаются, я хочу знать, возможно ли, чтобы QGIS читал это представление, как это будет любая другая пространственная таблица в моей базе данных. Дело в том, что я, очевидно, не хочу создавать отдельную таблицу для каждого возможного представления, которое я могу использовать, и я пытаюсь упростить его, не требуя, чтобы пользователь знал базу данных и соответствующий SQL-код для подмножества самих данных. Аналогичным рабочим процессом в мире ArcGIS может быть создание отдельных файлов слоев, которые пользователь может открыть в ArcMap для доступа к базе данных (скажем, SQL Server) и представления только ограниченного набора данных.

Я создал View в своей базе данных, но он не отображается в списке классов объектов, которые я могу импортировать, когда подключаюсь к пространственной базе данных в QGIS. Может быть, виды не считаются пространственными? (Это то, что я собираюсь рассмотреть позже, но я думал, что уже сделал; я просто не вспоминаю заключение.) В любом случае, как можно повторить тот вид рабочего потока, который я хочу, или подобную альтернативу ArcGIS? ?

Брайан Гудрич
источник

Ответы:

15

Я думаю, что вы должны зарегистрировать представление в таблице geometry_columns, чтобы иметь возможность использовать его в QGIS.

Хорошим ресурсом является «Написание собственного пространственного обзора» со следующим примером:

INSERT INTO views_geometry_columns
(view_name, view_geometry, view_rowid, f_table_name, f_geometry_column)
VALUES ('italy', 'geometry', 'ROWID', 'local_councils', 'geometry');

В любом случае вы должны зарегистрировать этот VIEW в views_geometry_columns, чтобы он стал реальным пространственным представлением.

Подземье
источник
Это кажется проблемой. Я создал представление и проверил мета таблицы. Очевидно, что геометрия из вида не указана. Как мне зарегистрировать геометрию вида? Я попробовал RecoverGeometryColumn, но он говорит мне, что таблица не существует. Я думал, что на версии 2.4, но, видимо, я работаю с бета-версии Spatialite 3.0. Может я неправильно реализую команду? Может быть, это не работает на представлениях? (Это лучше!); для ясности моя команда была SELECT RecoverGeometryColumn ('tblName', 'SHAPE', 2226, 'POINT', 2);
Брайан Гудрич
4
Существует специальная таблица для обработки представлений на основе геометрии. Используйте следующий синтаксис INSERT INTO VIEWS_GEOMETRY_COLUMNS VALUES ('{TABLE NAME}', '{GEOM COLUMN NAME}', '{GEOM TYPE}', 2, {SRID}, 0);
Натан W
пример: INSERT INTO VIEWS_GEOMETRY_COLUMNS VALUES ('Towns_v1', 'Geometry', 'POINT', 2, 32632, 0);
Натан W
Используйте, SELECT * FROM views_geometry_columns;чтобы увидеть, что нужно вставить. Больше информации на gaia-gis.it/spatialite-3.0.0-BETA/spatialite-cookbook/html/…
Натан W
2

Возможно, вам также придется ввести уникальный идентификатор в представление, аналогичное тому, что обсуждается здесь: В PostGIS возможно ли создать представление с уникальным идентификатором?

RyanKDalton
источник
Если я явно не выберу PK при создании представления, не будет ли уникальный идентификатор? По крайней мере, для простого запроса выбора, который я делаю здесь.
Брайан Гудрич
@ BryanGoodrich - попробуйте, но, как я обнаружил, это не работает с представлениями PostGIS.
RyanKDalton
Представление было создано "SELECT * FROM crime WHERE ...", а я подстановил предложением where. Это вернуло столбец PK (имя строки, которое я сгенерировал из имен столбцов в таблице R, которую использовал для заполнения БД SQLite). Проблема, как указала Подземье: ей нужна ссылка на геометрию в мета таблицах. Это то, что QGIS использует для идентификации пространственных таблиц, и в представлении нет записей в этих мета таблицах.
Брайан Гудрич
Хорошо знать. Спасибо, что задали вопрос и получили хороший ответ
RyanKDalton
2

регистрация представления в geometry_columns в настоящее время (год 2015), кажется, требует дополнительного поля read_only, например:

INSERT INTO views_geometry_columns
(view_name, view_geometry, view_rowid, f_table_name, f_geometry_column, read_only )
VALUES ('italy', 'geometry', 'ROWID', 'local_councils', 'geometry', 1);
KaeptnHaddock
источник
1
Не могли бы вы добавить ссылку на сопроводительную документацию? Спасибо!
Подземье
2

Для SpatialLite 4.x требуется два изменения исходного ответа - добавление read_onlyстолбца и изменение всех вставленных значений в нижний регистр. Обновленный SQL будет выглядеть так:

INSERT INTO views_geometry_columns
(view_name, view_geometry, view_rowid, f_table_name, f_geometry_column, read_only )
VALUES ('italy', 'geometry', 'rowid', 'local_councils', 'geometry', 1);

read_onlyПоле принимает значение 0 или 1. (комментарий знакомства Сандро Furieri в в Google Groups для дальнейших разъяснений.)

Более подробную информацию об этих и других изменениях в 4.x можно найти в вики-переходе на 4.0 .

Даррен
источник
1
INSERT INTO views_geometry_columns VALUES
('nameOfView' , 'geometry', 'rowid', 'geometryTable', 'geometry', 1);

NB: только заменить: nameOfView и geometryTable

Норберт Буйрингиро
источник