行走的蓑衣客

导航

 

  近日在博客中看到一篇使用ogr裁剪矢量数据的文章,觉得挺好,就做个笔记来学习。文章链接https://www.cnblogs.com/ljwgis/p/14071604.html

核心代码

from osgeo import ogr, osr
import os

def createShpByLayer(shp, layer, fileType):
    '''
    根据layer创建shpfile
    '''
    driver = ogr.GetDriverByName("ESRI Shapefile")
    ds = driver.CreateDataSource(shp)
    pt_layer = ds.CopyLayer(layer, 'layername')
    ds.Destroy()
    
def splitShp(shpfile, outPath, splitField):
    '''
    按属性字段分割shpfile
    '''
    ds = ogr.Open(shpfile)
    lyr = ds.GetLayer(0)
    for feat in lyr:
        cityName = feat.GetField(splitField)  # 以字段名为文件名称
        outShp = os.path.join(outPath, str(cityName)+'.shp')
        geom = feat.GetGeometryRef()
        driver = ogr.GetDriverByName("ESRI Shapefile")
        outDs = driver.CreateDataSource(outShp)
        outLyr = outDs.CreateLayer("layername", lyr.GetSpatialRef(), ogr.wkbMultiPolygon)
        outLyr.CreateFields(lyr.schema)  # 创建字段属性
        outFeat = ogr.Feature(lyr.GetLayerDefn())
        for i in range(feat.GetFieldCount()):
            val = feat.GetField(i)
            outFeat.SetField(i, val)
        outFeat.SetGeometry(geom)
        outLyr.CreateFeature(outFeat)
        outDs = None
        
def splitShpByShp(covershp, splitshp, outPath):
    '''
    @desc: 将一个shp按属性分割后,再用来分割另一个shp(空间查询)
    '''
    ds = ogr.Open(covershp)
    lyr = ds.GetLayer(0)
    splitDs = ogr.Open(splitshp)
    splitLyr = splitDs.GetLayer(0)
    for feat in lyr:
        cityName = feat.GetField("NAME")  # 以字段名为文件名称
        outShp = os.path.join(outPath, str(cityName)+'.shp')
        geom = feat.GetGeometryRef()
        driver = ogr.GetDriverByName("memory")
        outDs = driver.CreateDataSource("temp")
        outLyr = outDs.CreateLayer("layername", lyr.GetSpatialRef(), ogr.wkbMultiPolygon)
        outLyr.CreateFields(lyr.schema)  # 创建字段属性
        outFeat = ogr.Feature(lyr.GetLayerDefn())
        for i in range(feat.GetFieldCount()):
            val = feat.GetField(i)
            # val = val.encode('utf8') # 将unicode编码转化为中文,还有点问题
            outFeat.SetField(i, val)
        outFeat.SetGeometry(geom)
        outLyr.CreateFeature(outFeat)
        outDs = None
        
        splitLyr.SetSpatialFilter(geom) # 按空间查询
        createShpByLayer(outShp, splitLyr, "ESRI Shapefile")
        print("按空间查询的要素数量:"+ str(splitLyr.GetFeatureCount()))

 

posted on 2021-08-20 13:40  行走的蓑衣客  阅读(233)  评论(0编辑  收藏  举报