-
Notifications
You must be signed in to change notification settings - Fork 29
/
copyshapes.py
36 lines (28 loc) · 1.09 KB
/
copyshapes.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from osgeo import ogr
def filter_file(filter_func, infile, outfile):
"""
Saves all infile shapes which pass through filter_func to outfile.
Example:
filter_file(lambda x: x.GetField('ISO2') == 'CZ', 'TM_WORLD_BORDERS-0.3.shp', 'cz.shp')
"""
driver = ogr.GetDriverByName('ESRI Shapefile')
inDS = driver.Open(infile)
inLayer = inDS.GetLayer()
outDS = driver.CreateDataSource(outfile)
outLayer = outDS.CreateLayer('filtered')
feat = inLayer.GetFeature(0) # first feature
for field in feat.keys():
outLayer.CreateField(feat.GetFieldDefnRef(field))
del feat
featureDefn = outLayer.GetLayerDefn()
for i in range(inLayer.GetFeatureCount()):
feat = inLayer.GetFeature(i)
if not filter_func(feat):
continue
outFeature = ogr.Feature(featureDefn)
outFeature.SetGeometry(feat.GetGeometryRef())
for field in feat.keys():
outFeature.SetField(field, feat.GetField(field))
outLayer.CreateFeature(outFeature)