Python与开源GIS:根据空间过滤器选择要素

Python与开源GIS:根据空间过滤器选择要素

2015-02-03 作者: giser 浏览: 3624 次

摘要: 空间过滤器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)则是清空空间属性过滤器。这个可以通过打印图层中要素的数目来查看。

关注公众号
获取免费资源

随机推荐


Copyright © Since 2014. 开源地理空间基金会中文分会 吉ICP备05002032号

Powered by TorCMS

OSGeo 中国中心 邮件列表

问题讨论 : 要订阅或者退订列表,请点击 订阅

发言 : 请写信给: osgeo-china@lists.osgeo.org