Kann QGIS räumliche Ansichten lesen?

10

Ich habe eine Spatialite-Datenbank erstellt, die mehrere Jahre Kriminalitätsdaten umfasst. Um ein reales Szenario zu vereinfachen, in dem ich die Interaktion für einen Benutzer vereinfachen kann, indem ich eine Ansicht einführe, die lediglich die Zeitspanne begrenzt oder angibt, welche Arten von Straftaten zurückgegeben werden, möchte ich wissen, ob QGIS diese Ansicht so lesen kann würde jede andere räumliche Tabelle in meiner Datenbank. Der Punkt hier ist, dass ich offensichtlich nicht für jede mögliche Ansicht, die ich verwenden möchte, eine separate Tabelle erstellen möchte, und ich versuche es einfach zu machen, indem der Benutzer nicht die Datenbank und das entsprechende SQL kennen muss, um die Daten selbst zu unterteilen. Ein ähnlicher Workflow in der ArcGIS-Welt besteht möglicherweise darin, separate Layer-Dateien zu erstellen, die der Benutzer in ArcMap öffnen kann, die auf die Datenbank zugreifen (z. B. SQL Server) und nur den begrenzten Datensatz anzeigen.

Ich habe eine Ansicht in meiner Datenbank erstellt, diese wird jedoch nicht in der Liste der Feature-Classes angezeigt, die ich importieren kann, wenn ich eine Verbindung zur Spatialite-Datenbank in QGIS herstelle. Vielleicht werden Ansichten nicht als räumlich betrachtet? (Dies ist etwas, worauf ich später noch eingehen werde, aber ich dachte, ich hätte es bereits getan. Ich erinnere mich nur nicht an die Schlussfolgerung.) Wie könnte man auf jeden Fall den gewünschten Workflow oder die ähnliche ArcGIS-Alternative replizieren? ?

Bryan Goodrich
quelle

Antworten:

15

Ich denke, Sie müssen die Ansicht in der Tabelleometry_columns registrieren, um sie in QGIS verwenden zu können.

Eine gute Ressource ist "Handschrift Ihrer eigenen räumlichen Ansicht" mit dem folgenden Beispiel:

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

Auf jeden Fall müssen Sie diese ANSICHT in den views_geometry_columns registrieren, damit sie zu einer echten räumlichen Ansicht wird.

Unterdunkel
quelle
Das scheint das Problem zu sein. Ich habe die Ansicht erstellt und die Metatabellen überprüft. Offensichtlich ist die Geometrie aus der Ansicht nicht aufgeführt. Wie registriere ich die Geometrie der Ansicht? Ich habe die RecoverGeometryColumn ausprobiert, aber sie sagt mir, dass die Tabelle nicht existiert. Ich dachte, ich hätte eine 2.4-Version, aber anscheinend arbeite ich mit der Spatialite 3.0-Beta. Vielleicht implementiere ich den Befehl falsch? Vielleicht funktioniert es nicht bei Ansichten? (Es besser!); Aus Gründen der Klarheit war mein Befehl SELECT RecoverGeometryColumn ('tblName', 'SHAPE', 2226, 'POINT', 2);
Bryan Goodrich
4
Es gibt eine spezielle Tabelle für die Behandlung geometriebasierter Ansichten. Verwenden Sie die folgende Syntax INSERT INTO VIEWS_GEOMETRY_COLUMNS VALUES ('{TABLE NAME}', '{GEOM COLUMN NAME}', '{GEOM TYPE}', 2, {SRID}, 0);
Nathan W
Beispiel: INSERT INTO VIEWS_GEOMETRY_COLUMNS VALUES ('Towns_v1', 'Geometry', 'POINT', 2, 32632, 0);
Nathan W
Verwenden Sie SELECT * FROM views_geometry_columns;diese Option, um zu sehen, was eingefügt werden muss. Weitere Informationen unter gaia-gis.it/spatialite-3.0.0-BETA/spatialite-cookbook/html/…
Nathan W
2

Möglicherweise müssen Sie auch eine eindeutige ID in die Ansicht einfügen, ähnlich wie hier beschrieben: Ist es in PostGIS möglich, eine Ansicht mit einer eindeutigen ID zu erstellen?

RyanKDalton
quelle
Würde eine eindeutige ID nicht mitgeführt, es sei denn, ich wähle die PK bei der Ansichtserstellung nicht ausdrücklich aus? Zumindest für die einfache Auswahlabfrage, die ich hier mache.
Bryan Goodrich
@ BryanGoodrich- Probieren Sie es aus, aber es funktioniert nicht so mit PostGIS-Ansichten, soweit ich festgestellt habe.
RyanKDalton
Die Ansicht wurde von "SELECT * FROM Crime WHERE ..." erstellt und ich durch die where-Klausel untergeordnet. Dies gab die PK-Spalte zurück (Rowname, den ich aus den Spaltennamen in der R-Tabelle generiert habe, mit der ich die SQLite-Datenbank gefüllt habe). Das Problem ist, wie unterdunkelt, hervorgehoben: Es benötigt eine Geometriereferenz in den Metatabellen. Dies ist, was QGIS verwendet, um räumliche Tabellen zu identifizieren, und die Ansicht enthält keinen Datensatz in diesen Metatabellen.
Bryan Goodrich
Gut zu wissen. Vielen Dank, dass Sie die Frage gestellt und eine gute Antwort erhalten haben
RyanKDalton
2

Das Registrieren der Ansicht in geometrischen Spalten heutzutage (Jahr 2015) scheint ein zusätzliches Feld 'read_only' zu erfordern, wie folgt:

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
quelle
1
Könnten Sie bitte einen Link zur unterstützenden Dokumentation hinzufügen? Vielen Dank!
Underdark
2

Für SpatialLite 4.x sind zwei Änderungen an der ursprünglichen Antwort erforderlich - das Hinzufügen der read_onlySpalte und das Ändern aller eingefügten Werte in Kleinbuchstaben. Das aktualisierte SQL würde folgendermaßen aussehen:

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);

Das read_onlyFeld akzeptiert entweder 0 oder 1. (Weitere Erläuterungen finden Sie in Sandro Furieris Kommentar in Google Groups .)

Weitere Details zu diesen und anderen 4.x-Änderungen finden Sie im Wiki zum Umschalten auf 4.0 .

Darren
quelle
1
INSERT INTO views_geometry_columns VALUES
('nameOfView' , 'geometry', 'rowid', 'geometryTable', 'geometry', 1);

NB: nur ersetzen: nameOfView und geometrTabelle

Norbert Byiringiro
quelle