python 使用GDAL实现栅格tif转矢量shp的方式小结

 更新时间:2021年08月09日 11:04:55   作者:GIS开发者  
今天通过本文给大家分享python 使用GDAL实现栅格tif转矢量shp的方式小结,计划是使用栅格转矢量的方式,将栅格数据转为矢量shp文件,然后进行矢量切片,使用Mapbox进行前端动态渲染,具体内容详情跟随小编一起看看吧

前言

目前有一张tif格式的栅格影像,需要在web地图上进行展示,使用动态切片WMS的方式,渲染速度比较慢,而且大的时候会出现模糊的问题。并且后面需要做多期影像的切换,渲染与加载效率也值得关注。

计划是使用栅格转矢量的方式,将栅格数据转为矢量shp文件,然后进行矢量切片,使用Mapbox进行前端动态渲染。在网上查询了很多资料,有人说使用d3-contour在node.js中生成或者使用rasterio在python中进行转换,整体过程都比较麻烦,很不易实现。最终选定了使用GDAL进行栅格转矢量的方法,代码比较简单。
原始tif影像(12.8MB)如下:

原始tif

核心函数

GDAL中栅格转矢量的函数主要是以下两个,二者的参数没有任何区别,只是功能有区别:

FPolygonize(*args, **kwargs)

FPolygonize(Band srcBand, Band maskBand, Layer outLayer, int iPixValField, char options=None, GDALProgressFunc callback=0, void * callback_data=None) -> int

将每个像元转成一个矩形。

Polygonize(*args, **kwargs) **

Polygonize(Band srcBand, Band maskBand, Layer outLayer, int iPixValField, char ** options=None, GDALProgressFunc callback=0, void * callback_data=None) -> int

将每个像元转成一个矩形,然后将相似的像元进行合并。

转换代码

from osgeo import gdal, ogr, osr
import os
import datetime
import numpy as np

path = "Z_NAFP20210727.tif"


if __name__ == '__main__':
    start_time = datetime.datetime.now()

    inraster = gdal.Open(path)  # 读取路径中的栅格数据
    inband = inraster.GetRasterBand(1)  # 这个波段就是最后想要转为矢量的波段,如果是单波段数据的话那就都是1
    prj = osr.SpatialReference()
    prj.ImportFromWkt(inraster.GetProjection())  # 读取栅格数据的投影信息,用来为后面生成的矢量做准备

    outshp = path[:-4] + ".shp"  # 给后面生成的矢量准备一个输出文件名,这里就是把原栅格的文件名后缀名改成shp了
    drv = ogr.GetDriverByName("ESRI Shapefile")
    if os.path.exists(outshp):  # 若文件已经存在,则删除它继续重新做一遍
        drv.DeleteDataSource(outshp)
    Polygon = drv.CreateDataSource(outshp)  # 创建一个目标文件
    Poly_layer = Polygon.CreateLayer(path[:-4], srs=prj, geom_type=ogr.wkbMultiPolygon)  # 对shp文件创建一个图层,定义为多个面类
    newField = ogr.FieldDefn('value', ogr.OFTReal)  # 给目标shp文件添加一个字段,用来存储原始栅格的pixel value,浮点型,
    Poly_layer.CreateField(newField)

    gdal.Polygonize(inband, None, Poly_layer, 0)  # 核心函数,执行的就是栅格转矢量操作
    # gdal.FPolygonize(inband, None, Poly_layer, 0)  # 只转矩形,不合并
    Polygon.SyncToDisk()
    Polygon = None
    end_time = datetime.datetime.now()
    print("Succeeded at", end_time)
    print("Elapsed Time:", end_time - start_time)  # 输出程序运行所需时间

转换效果

  • 使用FPolygonize

转换之后的矢量数据有270MB,非常大,打开非常卡

FPolygonize转换效果

  • 使用Polygonize

合并之后的矢量数据有48MB,相对第一种方法数据量大大减少

Polygonize转换效果

到此这篇关于python 使用GDAL实现栅格tif转矢量shp的文章就介绍到这了,更多相关python栅格tif转矢量shp内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Django框架设置cookies与获取cookies操作详解

    Django框架设置cookies与获取cookies操作详解

    这篇文章主要介绍了Django框架设置cookies与获取cookies操作,结合实例形式详细分析了Django框架针对cookie操作的各种常见技巧与操作注意事项,需要的朋友可以参考下
    2019-05-05
  • python类继承用法实例分析

    python类继承用法实例分析

    这篇文章主要介绍了python类继承用法,实例分析了Python类的定义与类继承的实现技巧,需要的朋友可以参考下
    2015-05-05
  • Python PyMuPDF实现PDF与图片和PPT相互转换

    Python PyMuPDF实现PDF与图片和PPT相互转换

    能够用来对PDF文档进行操作的Python包有好几个,如提取内容的PdfPlumber、PDFMiner,可以用来对PDF文件进行修改操作的PyPDF2等等,如果只是需要简单地对PDF文件实现合并、拆分、书签操作,使用PyPDF2就足以满足。但如果想对PDF文件进行一些底层操作,基本上只有PyMuPDF了
    2022-12-12
  • Pytorch可视化之Visdom使用实例

    Pytorch可视化之Visdom使用实例

    Visdom 是一个专门用于 PyTorch 的交互式可视化工具,可以对实时数据进行丰富的可视化,帮助我们实时监控在远程服务器上进行的科学实验,这篇文章主要给大家介绍了关于Pytorch可视化之Visdom使用的相关资料,需要的朋友可以参考下
    2021-08-08
  • Python利用PIL实现多张图片合成gif动画的案例详解

    Python利用PIL实现多张图片合成gif动画的案例详解

    这篇文章主要介绍了Python利用PIL实现多张图片合成gif动画的案例,文章通过代码示例介绍的非常详细,对大家的学习或工作有一定的帮助,感兴趣的小伙伴可以自己动手试一下
    2023-11-11
  • python 实现倒计时功能(gui界面)

    python 实现倒计时功能(gui界面)

    这篇文章主要介绍了python 实现倒计时功能(gui界面),帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-11-11
  • Python2.7+pytesser实现简单验证码的识别方法

    Python2.7+pytesser实现简单验证码的识别方法

    这篇文章主要介绍了Python2.7+pytesser实现简单验证码的识别方法,简单分析了pytesser的安装及Python2.7环境下实现验证码识别的相关操作技巧,需要的朋友可以参考下
    2017-12-12
  • Python:合并两个numpy矩阵的实现

    Python:合并两个numpy矩阵的实现

    今天小编就为大家分享一篇Python:合并两个numpy矩阵的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python web开发之用Tornado框架制作简易表白墙网站

    Python web开发之用Tornado框架制作简易表白墙网站

    这篇文章将用Python做Web开发。在Python当中,WEB开发框架主要有三个,本文将利用Tornado框架做一个简单的表白墙网站,感兴趣的可以了解一下
    2022-02-02
  • Python语言中的if语句详情

    Python语言中的if语句详情

    这篇文章主要介绍了Python语言中的if语句详情,每条if语句的核心都是一个值为True或False的表达式,这种表达式被称为条件测试,下面文章介绍python语言的if语句详细内容,需要的小伙伴可以参考一下
    2022-02-02

最新评论