前言:挺久没有更新博客了,前段时间课程实验中需要用代码将矢量数据转成栅格,常见的点栅格化方法通过计算将点坐标(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. linux的文件与目录的权限设置

    @font-face { font-family: 宋体 } @font-face { font-family: "Cambria Math" } @font-face { fon ...

  2. 使用git clone 报错curl56 errno 10054解决方法

    使用git clone 报错curl56 errno 10054解决方法 ----------------版权声明:本文为CSDN博主「伽马射线爆」的原创文章,遵循CC 4.0 BY-SA版权协议,转 ...

  3. 解释 AOP 模块?

    AOP 模块用于发给我们的 Spring 应用做面向切面的开发, 很多支持由 AOP 联 盟提供,这样就确保了 Spring 和其他 AOP 框架的共通性.这个模块将元数据编 程引入 Spring.

  4. Java 中,Maven 和 ANT 有什么区别?

    虽然两者都是构建工具,都用于创建 Java 应用,但是 Maven 做的事情更多, 在基于"约定优于配置"的概念下,提供标准的 Java 项目结构,同时能为应用自 动管理依赖(应用 ...

  5. 时间工具类之"获取相差天数"

    一.时间工具类DateUtils之"获取相差天数" 1 /** 2 * 相差天数 3 * 4 * <p>TODO 方法功能描述 5 * 6 * @param start ...

  6. 重定向(redirect)与转发(forward)的区别

    重定向(redirect)与转发(forward)的区别 1.重定向时地址栏会发生改变,转发时地址栏不会发生改变 当浏览器请求资源时,服务器直接访问目标地址的URL,将URL的响应内容读取,之后再将读 ...

  7. MySQL索引如何优化?二十条铁则

    索引的相信大家都听说过,但是真正会用的又有几人?平时工作中写SQL真的会考虑到这条SQL如何能够用上索引,如何能够提升执行效率?  前言 索引的相信大家都听说过,但是真正会用的又有几人?平时工作中写S ...

  8. 解决联想笔记本 安装VM虚拟机后每次启动都会导致电脑蓝屏问题

    现象描述: pc为联想笔记本 系统是微软家庭中文版,每次启动VM虚拟机都会出现蓝屏现象,出现错误代码system_service_exception 原因及解决方法: 对于Windows10家庭版  ...

  9. ADAS最全整理

    为了实现「无人驾驶」的理想,各大整车厂和供应商目前正在开发「高级驾驶员辅助系统」(ADAS),随着 ADAS 慢慢被完善,车辆也在一步一步从 NHTSa 的 0 级过度到第 4 级,实现完全自动化.& ...

  10. C语言思维导图—自己整理的