Python|使用Python实现tif文件转shpfile格式文件
前言
遥感图像像素级别分类(语义分割)结果是栅格图像,转成矢量shp更方便在arcgis中自定义展示以及进一步分析。
代码实现
因为分类结果中可能会含有背景类或者我们不需要转成矢量的类,所以这里增加了一个参数来实现删除不需要转成矢量的类别要素。代码比较简单易懂,如下:
from osgeo import gdal, ogr, osr
import os
def raster2vector(raster_path, vecter_path, field_name="class", ignore_values=None):
# 读取路径中的栅格数据
raster = gdal.Open(raster_path)
# in_band 为想要转为矢量的波段,一般需要进行转矢量的栅格都是单波段分类结果
# 若栅格为多波段,需要提前转换为单波段
band = raster.GetRasterBand(1)
# 读取栅格的投影信息,为后面生成的矢量赋予相同的投影信息
prj = osr.SpatialReference()
prj.ImportFromWkt(raster.GetProjection())
drv = ogr.GetDriverByName("ESRI Shapefile")
# 若文件已经存在,删除
if os.path.exists(vecter_path):
drv.DeleteDataSource(vecter_path)
# 创建目标文件
polygon = drv.CreateDataSource(vecter_path)
# 创建面图层
poly_layer = polygon.CreateLayer(vecter_path[:-4], srs=prj, geom_type=ogr.wkbMultiPolygon)
# 添加浮点型字段,用来存储栅格的像素值
field = ogr.FieldDefn(field_name, ogr.OFTReal)
poly_layer.CreateField(field)
# FPolygonize将每个像元转成一个矩形,然后将相似的像元进行合并
# 设置矢量图层中保存像元值的字段序号为0
gdal.FPolygonize(band, None, poly_layer, 0)
# 删除ignore_value链表中的类别要素
if ignore_values is not None:
for feature in poly_layer:
class_value = feature.GetField('class')
for ignore_value in ignore_values:
if class_value == ignore_value:
# 通过FID删除要素
poly_layer.DeleteFeature(feature.GetFID())
break
polygon.SyncToDisk()
polygon = None
if __name__ == '__main__':
raster_path = r"demo.tif"
vecter_path = r"demo.shp"
field_name = "class"
# 第0类删除,若实际情况不需要1类和2类,则ignore_values = [1,2]
ignore_values = [0]
raster2vector(raster_path, vecter_path, field_name=field_name, ignore_values=ignore_values)
本文作者:Weltㅤ
本文链接:https://www.cnblogs.com/tangjielin/p/16597360.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
标签:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)