摘要: 空间过滤器Spatial filters 如果说按照属性进行要素的选择,还是带有数据库的特征的话,那么,根据空间位置进行选择,则是地地道道的GIS功能。在OGR中,使用了Spatial filters(空间过滤)这一术语表征这一功能。 OGR提供的空间过滤功能...
空间过滤器Spatial filters
如果说按照属性进行要素的选择,还是带有数据库的特征的话,那么,根据空间位置进行选择,则是地地道道的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)则是清空空间属性过滤器。这个可以通过打印图层中要素的数目来查看。