Python GDAL矢量转栅格详解
前言:挺久没有更新博客了,前段时间课程实验中需要用代码将矢量数据转成栅格,常见的点栅格化方法通过计算将点坐标(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矢量转栅格详解的更多相关文章
- python gdal 矢量转栅格
data = gdal.Open(templateTifFileName, gdalconst.GA_ReadOnly)geo_transform = data.GetGeoTransform()x_ ...
- Python安装、配置图文详解(转载)
Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(I ...
- 【和我一起学python吧】Python安装、配置图文详解
Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境( ...
- Python中的高级数据结构详解
这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...
- [转]使用python来操作redis用法详解
转自:使用python来操作redis用法详解 class CommRedisBase(): def __init__(self): REDIS_CONF = {} connection_pool = ...
- Python中格式化format()方法详解
Python中格式化format()方法详解 Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法; Python是完全面向对象的语言, 任何东西都是对象; 字符串的参 ...
- python设计模式之装饰器详解(三)
python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...
- Python调用windows下DLL详解
Python调用windows下DLL详解 - ctypes库的使用 2014年09月05日 16:05:44 阅读数:6942 在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分 ...
- Python操作redis字符串(String)详解 (三)
# -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...
随机推荐
- sharding-jdbc教程 看这一篇就够了
Sharding-JDBC是ShardingSphere的第一个产品,也是ShardingSphere的前身. 它定位为轻量级Java框架,在Java的JDBC层提供的额外服务.它使用客户端直连数 ...
- mock axios vue的数据传递关系
最近有一个项目要快速出一个前端demo,选择了vue-element框架(虽然其实很想用react,但是为了求快) 本人的基础只有初级的html/css/js知识,和python后端的一些简单工作,和 ...
- close()和flush()的区别
对于字符流,一般写入的时候想要马上看到一般需要flush()面试题:close()和flush()的区别?A:close()关闭流对象,但是先刷新一次缓冲区,关闭之后,流对象不可以继续再使用了.B:f ...
- 这些OAuth2客户端的认证方式你未必了解
OAuth2客户端按照它们与授权服务器进行安全认证的能力可以分为机密类型(Confidential)和公共类型(Public). 机密类型的自身会有个密码凭据,比如Web服务器后端程序:而公共类型则没 ...
- Kafka02--Kafka生产者简要原理
前言 在Kafka01--Kafka生产者使用方式中对KafkaProducer的基本使用方式进行了了解.以上只是使用方面,一个好的开元框架必定是易于开发者使用的,但是对生产者的基本逻辑流程和数据流转 ...
- mybatis插件机制原理
mybatis插件机制及分页插件原理 参考链接:mybatis插件机制及分页插件原理 如何编写一个自定义mybatis插件 参考链接:mybatis 自定义插件的使用
- 在虚拟机里面安装mysql
https://dev.mysql.com/downloads/repo/yum/ 首先到网站里面下载 mysql80-community-release-el7-3.noarch.rpm 通过xft ...
- SpringDataJpa备忘录
单向多对一关系 //产品类型 一的一方 @Entity public class ProductDir { @Id @GeneratedValue private Long id; private S ...
- css技术之用最高和最宽的限制“max-height和max-width”做图片同比例缩放,达到图片不变形目的,做出批量打印图片功能,页面打印“window.print()”
一.简介 他们是为流而生的,像width/height这种定死的砖头式布局,min-width/max-width就没有存在的意义 ,min-width/max-width一定是自适应布局或流体布局中 ...
- PCB模块化布局系列之时钟电路设计(晶振、晶体)
一.晶体在一个电路系统中, 时钟是必不可少的一部分.如人的心脏的作用,如果电路系统的时钟出错了,系统就会发生紊乱,因此在PCB 中设计,一个好的时钟电路是非常必要的.我们常用的时钟电路有:晶体.晶振. ...