I have two layers(layer1,layer2) in PostGIS database where I have connect in QGIS project.
My database have specific precision. Now I want to use from QGIS processing some algorithms like GISDIFFERENCE(for example I know tew postgis have query for this). But I don't know how to import the algorithm output in PostGIS database automatic to keep my database precision.
For example, if I try to run graphical this tool show me choose to save as to PostGIS database. Because I want to create a QGIS plugin.
Some way is to run algorithms and I save manual the output to shapefile and after to import this shapefile to PostGIS database like this :
outputs_QGISDIFFERENCE_1=processing.runalg('qgis:difference', layer1,layer2,False,None)
load= QgsVectorLayer(outputs_QGISDIFFERENCE_1['OUTPUT'],'myname', 'ogr')
QgsMapLayerRegistry.instance().addMapLayer(load)
and save to PostGIS database.
But that way create it me topology error because I loose the database precision if I use the graphical way to save as to PostGIS database then that layer is correct.
But how to do this using PyQGIS?
-
Still interested in this question?Germán Carrillo– Germán Carrillo2019年11月05日 18:30:18 +00:00Commented Nov 5, 2019 at 18:30
1 Answer 1
Consider using something like this:
def updateOriginalLayer(self, pgInputLayer, qgisOutputVector):
"""
Updates the original posts layer using the processing output layer
pgInputLyr: postgis input layer
qgisOutputVector: qgis processing output layer
"""
provider = pgInputLayer.dataProvider()
# getting keyColumn because we want to be generic
uri = QgsDataSourceURI(pgInputLayer.dataProvider().dataSourceUri())
keyColumn = uri.keyColumn()
# starting edition mode
pgInputLayer.startEditing()
addList = []
idsToRemove = []
#making the changes and inserts
for feature in pgInputLayer.getFeatures():
id = feature.id()
outFeats = []
#getting the output features with the specific id
if qgisOutputVector:
for gf in qgisOutputVector.dataProvider().getFeatures(QgsFeatureRequest(QgsExpression("{0}={1}".format(keyColumn, id)))):
outFeats.append(gf)
#starting to make changes
for i in range(len(outFeats)):
if i == 0:
#let's update this feature
newGeom = outFeats[i].geometry()
newGeom.convertToMultiType()
feature.setGeometry(newGeom)
pgInputLayer.updateFeature(feature)
else:
#for the rest, let's add them
newFeat = QgsFeature(feature)
newGeom = outFeats[i].geometry()
newFeat.setGeometry(newGeom)
idx = newFeat.fieldNameIndex(keyColumn)
newFeat.setAttribute(idx, provider.defaultValue(idx))
addList.append(newFeat)
#in the case we don't find features in the output we should mark them to be removed
if len(outFeats) == 0:
idsToRemove.append(id)
#pushing the changes into the edit buffer
pgInputLayer.addFeatures(addList, True)
#removing features from the layer
pgInputLayer.deleteFeatures(idsToRemove)