访问量: 101 次浏览
如果说按照属性进行要素的选择,还是带有数据库的特征的话,那么,根据空间位置进行选择,则是地地道道的GIS功能。在OGR中,使用了Spatial filters(空间过滤)这一术语表征这一功能。 OGR提供的空间过滤功能有两种,一种是SetSpatialFilter(),过滤某一类型的Feature,例如参数中使用Polygon,就是选出Layer中的所有Polygon所覆盖的要素(注意,只要相交即可,不必完全包含)。
下面这段代码用了两套数据。world_borders是全球国界数据,cover.shp则是覆盖了非洲南部地区的一个多边形。 下面先定义一个根据图层直接生成shape文件的函数,方便后面调用。
from osgeo import ogr
def create_shp_by_layer(shp, layer):
outputfile = shp
if os.access(outputfile, os.F_OK):
driver.DeleteDataSource(outputfile)
newds = driver. CreateDataSource ( outputfile )
pt_layer = newds.CopyLayer ( layer, '')
newds.Destroy ()
下面代码是使用cover.shp中的多边形来选择全球国界数据:
driver = ogr.GetDriverByName("ESRI Shapefile")
world_shp = '/gdata/world_borders.shp'
cover_shp = '/gdata/cover.shp'
world_ds = ogr.Open(world_shp)
cover_ds = ogr.Open(cover_shp)
world_layer = world_ds.GetLayer(0)
cover_layer = cover_ds.GetLayer(0)
print(world_layer.GetFeatureCount())
cover_feats = cover_layer.GetNextFeature()
poly = cover_feats.GetGeometryRef()
world_layer.SetSpatialFilter(poly)
out_shp = '/gdata/world_cover.shp'
create_shp_by_layer(out_shp, world_layer)
结果可以通过下面的图来看。
另外还有SetSpatialFilterRect(minx, miny, maxx, maxy),参数输入四个坐标,可以选中矩形内的要素。
world_layer.SetSpatialFilterRect(50, 60, 25, 35)
out_shp = '/gdata/world_spatial_filter.shp'
create_shp_by_layer(out_shp, world_layer)
同样可以打开GIS软件来查看结果。 SetSpatialFilter(None)则是清空空间属性过滤器。这个可以通过打印图层中要素的数目来查看。