Mehr

QGIS, SpatiaLite und Python verbinden?

QGIS, SpatiaLite und Python verbinden?


Ich versuche, eine Verbindung mit Python-Code, QGIS und Spatialite herzustellen, um eine SQL-Abfrage durchzuführen. Ich habe einige Tipps gelesen und mit diesem Code versucht, aber nichts hinzugefügt.

Irgendeine Idee?

uri=QgsDataSourceURI() uri.setDatabase('C:UsersprDesktopGIS.sqlite') schema="table ='ambi' geom_column= 'geom' uri.setDataSource(schema, table, geom_column) display_name=( 'prueba') vlayer=QgsVectorLayer(uri.uri(), display_name, 'spatialite')

Schließlich habe ich dies geschrieben:

uri = QgsDataSourceURI() uri.setDatabase('C:/Desktop/GIS.sqlite') schema ="table = 'PV' geom_column = 'geom' uri.setDataSource(schema, table, geom_column) display_name = 'PV' vlayer = QgsVectorLayer(uri.uri(), display_name, 'spatialite') db = QSqlDatabase.addDatabase("QSQLITE"); db.setDatabaseName(uri.database()) db.open() query=db.exec_("""select * von PV wo pk=1 """) QgsMapLayerRegistry.instance().addMapLayer(vlayer)

Aber es fügt die komplette Form hinzu und ich möchte nur das PV mit pk=1 hinzufügen. Können Sie mir sagen, warum das so ist?


Ich habe Zweifel an deinen Erwartungen

Wenn es eine SQL-Abfrage auf einer SQlite/Spatialite-DB in QGIS durchführt

Wählen Sie die Ebene aus, die SQlite als Quelle verwendet, und führen Sie dann aus

# QtSql-Funktion(en) aus PyQt4.QtSql importieren QSqlDatabase importieren # Ausgewählten Layer-Layer abrufen = iface.activeLayer() # Dateipfad abrufen uri = QgsDataSourceURI(layer.dataProvider().dataSourceUri()) # DB-Verbindung erstellen, um SQL-Datenbank zu erstellen = QSqlDatabase.addDatabase("QSQLITE"); # Verwenden Sie den Pfad zur DB erneut, um den Datenbanknamen festzulegen db.setDatabaseName(uri.database()) # Öffnen Sie die Verbindung db.open() # Abfrage der Tabelle query = db.exec_("""select * from your_table""") # Spielen Sie mit Ergebnissen (nicht effizient, nur für Demo) während query.next(): values ​​= [] record = query.record() for index in range(record.count()): # Wir schließen die Geometrie aus, um Attribute zu verbinden data if not isinstance(record.value(index), QByteArray): values.append(str(record.value(index))) print ';'.join(values)

Es wurde hauptsächlich von diesem Thema inspiriert, aber auf SQLite/Spatialite angewendet

Um Spatialite (eigentlich eine Erweiterung, die Sie in SQLite laden) und nicht nur SQLite wirklich zu verwenden, können Sie ersetzenQSQLITEmitQSPATIALITE. Dann können Sie sehen, ob die Erweiterung geladen wurde mit:

query = db.exec_("""SELECT sqlite_version(), Spatialite_version()""") query.next() print query.value(0), query.value(1)

Wenn nur der Layer von Python angezeigt wird

Wenn Sie die Ebene hinzufügen möchten, vergessen Sie nicht danach

vlayer=QgsVectorLayer(uri.uri(), display_name, 'spatialite')

um es hinzuzufügen mit:

QgsMapLayerRegistry.instance().addMapLayer(vlayer)

Eine Abkürzung, um dieselbe Operation in einem auszuführen, ist:

iface.addVectorLayer(uri.uri(), display_name, 'spatialite')

uri.setDataSource(Schema, Tabelle, geom_column,"pk=1")

Der vierte Parameter (optional) in setDataSource ist ein SQL WHERE


Schau das Video: How to merge or join attribute table in QGIS