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


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

比较重要的参数有:

  • 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)

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

    • "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中矢量转栅格(每个要素赋不同值)的效果,可以先为用于测试的原始矢量数据添加一个属性字段用于赋值,例如下图的运动场面数据,以路网范围的栅格作为模板。

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

函数调用:

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

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

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

  1. python gdal 矢量转栅格

    data = gdal.Open(templateTifFileName, gdalconst.GA_ReadOnly)geo_transform = data.GetGeoTransform()x_ ...

  2. Python安装、配置图文详解(转载)

    Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(I ...

  3. 【和我一起学python吧】Python安装、配置图文详解

     Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境( ...

  4. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

  5. [转]使用python来操作redis用法详解

    转自:使用python来操作redis用法详解 class CommRedisBase(): def __init__(self): REDIS_CONF = {} connection_pool = ...

  6. Python中格式化format()方法详解

    Python中格式化format()方法详解 Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法; Python是完全面向对象的语言, 任何东西都是对象; 字符串的参 ...

  7. python设计模式之装饰器详解(三)

    python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...

  8. Python调用windows下DLL详解

    Python调用windows下DLL详解 - ctypes库的使用 2014年09月05日 16:05:44 阅读数:6942 在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分 ...

  9. Python操作redis字符串(String)详解 (三)

    # -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...

随机推荐

  1. MYSQL5.7详细安装步骤

    0.更换yum源 1.打开 mirrors.aliyun.com,选择centos的系统,点击帮助 2.执行命令:yum install wget -y 3.改变某些文件的名称 mv /etc/yum ...

  2. 什么是 WebSockets?

    WebSocket 是一种计算机通信协议,通过单个 TCP 连接提供全双工通信信道. 1.WebSocket 是双向的 -使用 WebSocket 客户端或服务器可以发起消息发送. 2.WebSock ...

  3. 什么是基于Java的Spring注解配置? 给一些注解的例子?

    基于Java的配置,允许你在少量的 Java注解 的帮助下,进行你的大部分Spring配置而非通过XML文件. 以@Configuration 注解为例,它用来标记类可以当做一个bean的定义,被Sp ...

  4. Eureka和Zookeeper区别?

    (1)Eureka取CAP的AP,注重可用性,Zookeeper取CAP的CP注重一致性. (2)Zookeeper在选举期间注册服务瘫痪,虽然服务最终会恢复,但选举期间不可用. (3)eureka的 ...

  5. XMLBeanFactory ?

    最常用的就是 org.springframework.beans.factory.xml.XmlBeanFactory ,它 根据 XML 文件中的定义加载 beans.该容器从 XML 文件读取配置 ...

  6. 在java web工程中jsp页面中使用kindeditor

    在这之前我们用Notepad++写过kindeditor 在Java web工程里也差不多 首先我们复制之前的thml代码粘贴到工程里 然后把样式也复制进去 然后就可以运行了

  7. 学习Apache(四)

    介绍 Apache HTTP 服务器被设计为一个功能强大,并且灵活的 web 服务器, 可以在很多平台与环境中工作.不同平台和不同的环境往往需要不同 的特性,或可能以不同的方式实现相同的特性最有效率. ...

  8. SpringCloud个人笔记-04-Stream初体验

    sb_cloud_stream Spring Cloud Stream 是一个构建消息驱动微服务的框架 应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream ...

  9. 基于HTML5的网络拓扑图(1)

    什么是网络拓扑 网络拓扑,指构成网络的成员间特定的排列方式.分为物理的,即真实的.或者逻辑的,即虚拟的两种.如果两个网络的连接结构相同,我们就説它们的网络拓扑相同,尽管它们各自内部的物理接线.节点间距 ...

  10. H5复制粘贴双端适配的解决方案(终极版)

    前言 最终适配所有机型的方案基于clipboardjs官网https://clipboardjs.com/ 这个库由几个不同的CDN提供商托管.选择你最喜欢的:) jsDelivr <scrip ...