Vector Edit#
Editing#
import ogr
driver = ogr.GetDriverByName('ESRI Shapefile')
shp = r'C:\data\sites.shp'
# Open as 1 to write
dataSource = driver.Open(shp, 1)
layer = dataSource.GetLayer()
# Create new feature
layer_defn = layer.GetLayerDefn()
newfeature = ogr.Feature(layer_defn)
# Set an FID index
newfeature.SetFID(0)
# Set a new geometry
newfeature.SetGeometry(point) # point/line/polygon
# Add feature to layer
layer.CreateFeature(newfeature)
Create New Geometries#
Operation |
Method |
|---|---|
Add new point |
|
Modify point |
|
# Point
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(10, 20)
# Line
line = ogr.Geometry(ogr.wkbLineString)
line.AddPoint(10, 10)
line.AddPoint(20, 20)
line.SetPoint(0, 30, 30) # (10,10) -> (30,30)
# Polygon
ring = ogr.Geometry(ogr.wkbLinearRing)
ring.AddPoint(0, 0)
ring.AddPoint(100, 0)
ring.AddPoint(100, 100)
ring.AddPoint(0, 100)
ring.CloseRings()
polygon = ogr.Geometry(ogr.wkbPolygon)
polygon.AddGeometry(ring)
New Layer#
Field types:
Type |
Description |
|---|---|
|
Integer numbers |
|
Float numbers |
|
Strings |
|
Dates |
This script:
Creates a point vector file
sample.shpAdds a new field
NEWFIELDAdds a new feature point with coordinates and a value of 9999
import ogr, osr
path = r"E:\Spatial\Shape"
driver = ogr.GetDriverByName("ESRI Shapefile")
# Define spatial reference
laearef = osr.SpatialReference()
laearef.ImportFromEPSG(3035)
# Create the shapefile
datasource = driver.CreateDataSource(path)
layer = datasource.CreateLayer('sample', laearef, geom_type=ogr.wkbPoint)
# Add new field
layer_defn = layer.GetLayerDefn()
field_def = ogr.FieldDefn('NEWFIELD', ogr.OFTInteger)
field_def.SetWidth(4)
field_def.SetPrecision(0)
layer.CreateField(field_def)
# Populate with geometry
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(3254159.2, 4586973.6)
featureIndex = 0 # FID value
feature = ogr.Feature(layer_defn)
feature.SetGeometry(point)
feature.SetFID(featureIndex)
layer.CreateFeature(feature)
feature.SetField('NEWFIELD', 9999)
layer.SetFeature(feature)
datasource.Destroy()
Update Attributes#
import ogr
driver = ogr.GetDriverByName('ESRI Shapefile')
dataSource = driver.Open(r'C:\data\sites.shp', 1)
layer = dataSource.GetLayer()
for i in range(layer.GetFeatureCount()):
feature = layer.GetFeature(i)
feature.SetField('NEWFIELD', 12345)
layer.SetFeature(feature)
dataSource.Destroy()
Copy Features#
import ogr
driver = ogr.GetDriverByName('ESRI Shapefile')
# Copy from source
dataSource = driver.Open(r'C:\data\layer1.shp', 0)
layerSource = dataSource.GetLayer()
featureSource = layerSource.GetFeature(158) # get the feature with FID = 158
geom = featureSource.GetGeometryRef()
# Create new feature and paste
dataTarget = driver.Open(r'C:\data\layer2.shp', 1)
layerTarget = dataTarget.GetLayer()
newfeature = ogr.Feature(layerTarget.GetLayerDefn())
newfeature.SetGeometry(geom)
newfeature.SetField('ID', 158)
layerTarget.CreateFeature(newfeature)
dataTarget.Destroy()
dataSource.Destroy()