Czy QGIS może odczytywać widoki przestrzenne?

11

Mam utworzoną przeze mnie przestrzenną bazę danych obejmującą kilka lat danych o przestępczości. Aby ułatwić scenariusz w świecie rzeczywistym, w którym mogę uprościć interakcję użytkownika, wprowadzając widok, który po prostu ogranicza czas lub rodzaje zwracanych przestępstw, chcę wiedzieć, czy QGIS może przeczytać ten widok w podobny sposób byłaby inna tabela przestrzenna w mojej bazie danych. Chodzi o to, że oczywiście nie chcę tworzyć osobnej tabeli dla każdego możliwego widoku, którego mogę użyć, i staram się to uprościć, nie wymagając od użytkownika znajomości bazy danych i odpowiedniego kodu SQL do samodzielnego podzbioru danych. Podobny przepływ pracy w świecie ArcGIS może polegać na tworzeniu osobnych plików warstw, które użytkownik może otworzyć w ArcMap, które uzyskują dostęp do bazy danych (powiedzmy SQL Server) i prezentują tylko ograniczony zestaw danych.

Utworzyłem widok w mojej bazie danych, ale nie pojawia się on na liście klas obiektów, które mogę zaimportować, gdy połączę się z przestrzenną bazą danych w QGIS. Może widoki nie są uważane za przestrzenne? (Zajmę się tym później, ale myślałem, że już to zrobiłem; po prostu nie przypominam sobie wniosków.) W każdym razie, w jaki sposób można powielić rodzaj przepływu pracy, który chcę, lub podobną alternatywę ArcGIS ?

Bryan Goodrich
źródło

Odpowiedzi:

15

Myślę, że musisz zarejestrować widok w tabeli geometry_columns, aby móc go używać w QGIS.

Dobrym źródłem jest „Ręczne pisanie własnego WIDOKU PRZESTRZENNEGO” na następującym przykładzie:

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

W każdym razie musisz zarejestrować ten WIDOK w views_geometry_columns, aby stał się prawdziwym widokiem przestrzennym.

podmrok
źródło
To wydaje się być problemem. Utworzyłem widok i sprawdziłem meta-tabele. Oczywiście geometrii z widoku nie ma na liście. Jak zarejestrować geometrię widoku? Próbowałem RecoverGeometryColumn, ale mówi mi, że tabela nie istnieje. Myślałem, że jestem na wersji 2.4, ale najwyraźniej pracuję z wersją beta Spatialite 3.0. Może źle wykonuję polecenie? Może to nie działa na widokach? (To lepiej!); dla jasności moim poleceniem było SELECT RecoverGeometryColumn („tblName”, „SHAPE”, 2226, „POINT”, 2);
Bryan Goodrich,
4
Istnieje specjalna tabela do obsługi widoków opartych na geometrii. Użyj następującej składni INSERT INTO VIEWS_GEOMETRY_COLUMNS VALUES („{NAZWA TABELI}”, „{NAZWA KOLUMNY GEOMA}”, „{TYP GEOM}}, 2, {SRID}, 0);
Nathan W
przykład: INSERT INTO VIEWS_GEOMETRY_COLUMNS VALUES („Towns_v1”, „Geometry”, „POINT”, 2, 32632, 0);
Nathan W
Użyj, SELECT * FROM views_geometry_columns;aby zobaczyć, co należy wstawić. Więcej informacji na stronie gaia-gis.it/spatialite-3.0.0-BETA/spatialite-cookbook/html/...
Nathan W
2

Być może będziesz musiał wstawić unikalny identyfikator w widoku, podobny do tego, co omówiono tutaj: Czy w PostGIS można utworzyć widok z unikalnym identyfikatorem?

RyanKDalton
źródło
O ile nie wybiorę jawnie PK przy tworzeniu widoku, czy nie zostanie zabrany unikalny identyfikator? Przynajmniej dla prostego zapytania, które tu wybieram.
Bryan Goodrich,
@ BryanGoodrich- Spróbuj, ale, o ile się dowiedziałem, nie działa w ten sposób z widokami PostGIS.
RyanKDalton
Widok został utworzony przez „WYBIERZ * Z przestępstwa GDZIE ...”, a ja podgrupowałem klauzulą ​​where. Zwróciło to kolumnę PK (nazwa pliku, którą wygenerowałem z nazw kolumn w tabeli R, której użyłem do wypełnienia bazy danych SQLite). Problem jest taki, jak wskazano poniżej: wymaga odniesienia do geometrii w meta tabelach. Tego używa QGIS do identyfikowania tabel przestrzennych, a widok nie ma żadnego rekordu w tych tabelach meta.
Bryan Goodrich,
Dobrze wiedzieć. Dzięki, że
zadałeś
2

rejestrowanie widoku w geometrii_kolumnach obecnie (rok 2015) wydaje się wymagać dodatkowego pola „tylko do odczytu”:

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
źródło
1
Czy możesz dodać link do dokumentacji pomocniczej? Dzięki!
podmrok
2

W przypadku SpatialLite 4.x wymagane są dwie zmiany oryginalnej odpowiedzi - dodanie read_onlykolumny i zmiana wszystkich wstawionych wartości na małe litery. Zaktualizowany SQL wygląda następująco:

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_onlyPole przyjmuje wartość 0 lub 1. (patrz komentarz Sandro Furieri w Google Groups dla dalszych wyjaśnień).

Więcej szczegółów na temat tych i innych zmian 4.x można znaleźć na wiki wiki przełączania na 4.0 .

Darren
źródło
1
INSERT INTO views_geometry_columns VALUES
('nameOfView' , 'geometry', 'rowid', 'geometryTable', 'geometry', 1);

NB: zamień tylko: nameOfView i geometryTable

Norbert Byiringiro
źródło