Python GDAL矢量转栅格详解

2023-05-16

前言:挺久没有更新博客了,前段时间课程实验中需要用代码将矢量数据转成栅格,常见的点栅格化方法通过计算将点坐标(X,Y)转换到格网坐标(I,J),线栅格化方法主要有DDA算法、Bresenham算法等,根据实现效果也可分为八方向和全路径栅格化方法等,面栅格化方法主要有种子点填充、扫面线算法、边界代数法等。详细算法实现可参考GIS中将矢量数据转换栅格数据算法 和 GIS算法基础(五)矢量数据向栅格数据的转换(点,线算法实现)这两篇博客。GDAL为用户提供了矢栅转换的方法,但网络上相关资料比较少,官方文档不明所以,因此本文将基于Python GDAL谈谈矢量转栅格的用法。


使用Python GDAL的RasterizeLayer()方法可以比较容易地实现矢量图层转换为栅格,先看看官方API文档给出的参数列表。

image-20220124134111622

比较重要的参数有:

  • dataset 即输出的栅格数据集

  • bands 输出波段

  • layer 输入待转换的矢量图层

  • pfnTransformer 几何图形坐标转换图像行列号函数
    pTransformArg 几何图形坐标转换图像行列号参数

  • burn_values 设置每个输出波段的像素值,需要输入列表形式,如[0]

  • GDALProgressFunc callback 进度条回调函数

  • options 可选的栅格化参数(字符串参数对),对于该参数文档官方文档没有详细说明,可以参考C++ GDAL的类似API,如下:

    • “ATTRIBUTE”:

      指定输入矢量数据的属性字段中的字段值作为栅格值写入栅格文件中,该值将输出到所有输出波段中。假如该值指定了,burn_Values参数的值将失效数可以设置为空。
      
    • “CHUNKYSIZE”:

      指定该运行操作的块的高度。该值越大所需的计算时间越小。如果该值没有设置或者设置为0则由GDAL的缓存大小根据公式:缓存所占的字节数/扫描函数的字节数得到。所以该值不会超出缓存的大小。
      
    • “ALL_TOUCHED”:

      设置为TRUE表示所有的像素接触到矢量中线或多边形,否则只是多边形中心或被Bresenham算法选中的部分。默认值为FALSE。简单来说,FALSE是八方向栅格化,TRUE是全路径栅格化。
      
      • 八方向栅格化:(图片来自https://malagis.com/gis-vector-grid-data-conversion-algorithm.html)

        2014-02-20_232357

      • 全路径栅格化:(图片来自https://malagis.com/gis-vector-grid-data-conversion-algorithm.html)

      2014-02-20_232654

    • “BURN_VALUE_FROM”:

      用于设置几何图形的Z值
      
    • “MERGE_ALG”:

      设置重写或增加新值到栅格数据中。选择REPLACE为 重写,选择ADD为添加一个新值到已存在的栅格数据中。默认值为REPLACE。
      

矢量转栅格函数如下:

from osgeo import gdal,ogr,osr
from gdal import gdalconst

# 需要注意field,all_touch这些option的值必须为字符串
def vector2raster(inputfilePath, outputfile, templatefile,bands=[1],burn_values=[0],field="",all_touch="False"):
    # 输入矢量文件
    inputfilePath = inputfilePath
    # 输出栅格文件
    outputfile = outputfile
    # 栅格模板文件,确定输出栅格的元数据(坐标系等,栅格大小,范围等)
    templatefile = templatefile
    # 打开栅格模板文件
    data = gdal.Open(templatefile, gdalconst.GA_ReadOnly)
    # 确定栅格大小
    x_res = data.RasterXSize
    y_res = data.RasterYSize
    # 打开矢量文件
    vector = ogr.Open(inputfilePath)
    # 获取矢量图层
    layer = vector.GetLayer()
    # 查看要素数量
    featureCount = layer.GetFeatureCount()
    # print(featureCount)

    # 创建输出的TIFF栅格文件
    targetDataset = gdal.GetDriverByName('GTiff').Create(outputfile, x_res, y_res, 1, gdal.GDT_Byte)
    # 设置栅格坐标系与投影
    targetDataset.SetGeoTransform(data.GetGeoTransform())
    targetDataset.SetProjection(data.GetProjection())
    # 目标band 1
    band = targetDataset.GetRasterBand(1)
    # 白色背景
    #NoData_value = -999
    NoData_value = 255
    band.SetNoDataValue(NoData_value)
    band.FlushCache()
    if field:
        # 调用栅格化函数。RasterizeLayer函数有四个参数,分别有栅格对象,波段,矢量对象,options
        # options可以有多个属性,其中ATTRIBUTE属性将矢量图层的某字段属性值作为转换后的栅格值
        gdal.RasterizeLayer(targetDataset, bands,layer, burn_values=burn_values,options=["ALL_TOUCHED="+all_touch,"ATTRIBUTE="+field])
    else:
        gdal.RasterizeLayer(targetDataset, bands,layer, burn_values=burn_values,options=["ALL_TOUCHED="+all_touch])

对于ALL_TOUCHED属性实现的八方向和全路径栅格化,可以从下面两幅图看到结果略有不同,注意此时的ALL_TOUCHED属性设置必须全为字符串。

函数调用:

vector2raster(inputpath,outputpath,maskpath,field="",all_touch="False")

八方向(ALL_TOUCHED=False):

在这里插入图片描述

全路径(ALL_TOUCHED=True):

在这里插入图片描述

为了实现类似ArcGIS中矢量转栅格(每个要素赋不同值)的效果,可以先为用于测试的原始矢量数据添加一个属性字段用于赋值,例如下图的运动场面数据,以路网范围的栅格作为模板。

image-20220124184506426

其属性表如下,pp_id为自行添加的字段,表示每个要素转换成栅格时的赋值:

image-20220124193810401

函数调用:

vector2raster(inputpath,outputpath,maskpath,field="pp_id",all_touch="False")

得到的栅格化结果的每个要素具有不同的灰度值,对应pp_id字段的值。此时burn_values值会失效,根据pp_id字段值来对栅格赋值。

image-20220124194303626

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python GDAL矢量转栅格详解 的相关文章

  • Prometheus.yml配置文件示例

    my global config global scrape interval 15s Set the scrape interval to every 15 seconds Default is every 1 minute evalua
  • 如何查看chrome浏览器已保存的密码

    该方法是针对在chrome中已经存储了登陆密码的情况 chrome版本是 66 0 3359 139 xff08 正式版本 xff09 xff08 64 位 xff09 xff0c 不知道哪天会改了这个bug 一般来说 xff0c 我们登陆
  • SNMP学习笔记之iReasoning MIB Browser

    0x00 MIB Browser iReasoning MIB浏览器是一个强大和易于使用的工具由iReasoning SNMP API提供支持 MIB浏览器是工程师管理启用SNMP的网络设备和应用程序不可或缺的工具 它允许用户加载标准的 x
  • K8S学习笔记之将Google的gcr.io、k8s.gcr.io 换为国内镜像

    0x00 添加docker官方的国内镜像 sudo tee etc docker daemon json lt lt 39 EOF 39 34 registry mirrors 34 34 https registry docker cn
  • Docker学习笔记之常见 Dockerfile 使用技巧

    0x00 概述 在掌握 Dockerfile 的基本使用方法后 xff0c 我们再来了解一些在开发中使用 Dockerfile 的技巧 这一小节的展现方式与之前的略有不同 xff0c 其主要来自阅读收集和我自身在使用中的最佳实践 也许这里面
  • Docker学习笔记之通过 Dockerfile 创建镜像

    0x00 概述 由于 Docker 镜像的结构优势 xff0c 使它的占用空间远小于普通的虚拟机镜像 xff0c 而这就大幅减少了 Docker 镜像在网络或者其他介质中转移所花费的时间 xff0c 进而提高了我们进行迁移部署的效率 不过
  • K8S学习笔记之ETCD启动失败注意事项

    最近搭建K8S集群遇到ETCD的报错 xff0c 报错信息如下 xff0c 一定要关闭防火墙 iptables和SELINUX xff0c 三个都要关闭 xff01 xff01 Mar 26 20 39 24 k8s m1 etcd 643
  • 硬件笔记之Thinkpad T470P更换2K屏幕

    0x00 前言 手上的Thinkpad T470P屏幕是1920x1080的屏幕 xff0c 色域范围NTSC 45 xff0c 作为一块办公用屏是正常配置 xff0c 但是考虑到色彩显示和色域范围 xff0c 计划升级到2K屏幕 2k屏幕
  • Kafka学习笔记之Kafka High Availability(下)

    0x00 摘要 本文在上篇文章基础上 xff0c 更加深入讲解了Kafka的HA机制 xff0c 主要阐述了HA相关各种场景 xff0c 如Broker failover xff0c Controller failover xff0c To
  • Boyer-Moore算法的C++实现

    BM算法 阮一峰的网络日志 以上给出了通俗易懂的算法讲解 xff0c 下面给出代码实现 xff0c 使用的宽字符 xff0c 这样就不限于英文字母了 stdafx h编译不过去就屏蔽掉 StringSearch BoyerMoore cpp
  • Kafka学习笔记之Kafka Consumer设计解析

    0x00 摘要 本文主要介绍了Kafka High Level Consumer xff0c Consumer Group xff0c Consumer Rebalance xff0c Low Level Consumer实现的语义 xff
  • Kafka学习笔记之Kafka性能测试方法及Benchmark报告

    0x00 概述 本文主要介绍了如何利用Kafka自带的性能测试脚本及Kafka Manager测试Kafka的性能 xff0c 以及如何使用Kafka Manager监控Kafka的工作状态 xff0c 最后给出了Kafka的性能测试报告
  • 用Clion运行C++代码时输出中文乱码解决方法

    用Clion运行C 43 43 代码时输出中文乱码解决方法 1 File gt setting 2 在页面最下面找到UTF 8 xff0c 将其改成GBK 3 根据提示选择Convert 4 问题解决啦
  • Java核心技术卷1:基础知识(原书第10版)

    本书为专业程序员解决实际问题而写 xff0c Java基础知识面覆盖很完整 xff0c 可以帮助你深入了解Java语言和库 在卷I中 xff0c Horstmann主要强调基本语言概念和现代用户界面编程基础 xff0c 深入介绍了从Java
  • 斜率K的意义

    夹角公式 设直线l1 l2的斜率存在 xff0c 分别为k1 k2 xff0c l1到l2的转向角为 则tan 61 k2 k1 xff09 1 43 k1k2 xff09 l1与l2的夹角为 xff0c 则tan 61 k2 k1 xff
  • 阿里巴巴 2014校招 研发工程师 笔试

    刚杭州这边阿里巴巴校招笔试回来 回忆一下题 xff0c 为大家将来的笔试做点准备 选择题 xff1a 1 字符串 alibaba 的huffman编码有几位 2 以下哪些用到贪婪算法 xff1a 最小生成树的Prim算法最小生成树的Krus
  • Bag of Words(词袋模型)

    词袋模型的提出是为了解决文档分类 xff0c 主要应用在 NLP Natural Language Process xff0c IR Information Retrival xff0c CV xff08 Computer Vision x
  • 全向和定向天线区别,何为天线增益

    文 白浪 为什么网络信号弱 速率低 时断时续 xff1f 为什么购买了大量的AP xff0c 但是还有地方信号不好 xff0c 而有的地方信号多到互相干扰 xff1f 为什么布置了大增益的天线 xff0c 结果还未能得偿所愿 xff1f 无
  • 2017电赛国赛可见光定位装置(精确度达到1cm)

    先不多说上源码 Github网址 xff1a https github com DerrickRose25 Indoor positioning of visible light 用的畸变摄像头 xff0c 用Matlab做线性拟合和畸变矫
  • 如何给图片添加黑色边框

    有时候图片有了黑色边框才能与相近的背景区分开 xff0c 这个时候给图片添加边框就是必须的了 你好这位朋友 xff01 很简单 xff0c 要这样操作 xff1a 将照片打开 xff0c 裁切好后 xff0c 应用工具箱中的矩形选择工具 x

随机推荐