7

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?

Kadir Şahbaz
78.6k57 gold badges260 silver badges407 bronze badges
asked Aug 27, 2017 at 20:54
1
  • Still interested in this question? Commented Nov 5, 2019 at 18:30

1 Answer 1

2

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)
answered Jun 8, 2019 at 14:22

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.