近日在博客中看到一篇使用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()))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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训练数据并当服务器共享给他人