行走的蓑衣客

导航

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
统计
 

  近日在博客中看到一篇使用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   行走的蓑衣客  阅读(233)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
 
点击右上角即可分享
微信分享提示