Changing vector layer geometry
Sometimes you need to change the location of a feature. You could do this by deleting and re-adding the feature, but PyQGIS provides a simple way to change the geometry.
Getting ready
You will need the New York City museums shapefile, which you can download as a ZIP file from the following URL:
https://github.com/GeospatialPython/Learn/raw/master/NYC_MUSEUMS_GEO.zip
Extract this shapefile to /qgis_data/nyc
.
How to do it...
We will load the shapefile as a vector layer, validate it, define the feature ID we want to change, create the new geometry, and change the feature in the layer.
- Start QGIS.
- From the Plugins menu, select Python Console.
- First, we load the layer and validate it:
vectorLyr = QgsVectorLayer('/qgis_data/nyc/NYC_MUSEUMS_GEO.shp', 'Museums' , "ogr") vectorLyr.isValid()
- Next, we define the feature ID we are interested in changing:
feat_id = 22
- Now, we create the new point geometry that will become the new location:
geom = QgsGeometry.fromPoint(QgsPoint(-74.20378,40.89642))
- Finally, we change the geometry and replace it with our new geometry specifying the feature ID:
vectorLyr.dataProvider().changeGeometryValues({feat_id : geom})
How it works...
The changeGeometryValues
method makes editing a snap. If we had to delete and then re-add the feature, we would have to go through the trouble of reading the attributes, preserving them, and then re-adding them with the new feature. Of course, you must know the feature ID of the feature you want to change. How you determine that ID depends on your application. Typically, you would query the attributes to find a specific value, or you might perform a spatial operation of some sort.