【GIS教程】使用GDAL实现栅格转矢量(GeoJSON、Shapefile)- 附完整代码

文章目录

  • 一、 应用场景
    • 1、GeoJSON
    • 2、ESRI Shapefile
    • 3、GDAL
  • 二、基本思路
    • 1、数据准备
    • 2、重投影(可选)
    • 3、创建空的矢量图层
    • 4、栅格转矢量
  • 三、完整代码
  • 四、总结
  • 五、拓展(使用ArcGIS工具进行栅格转矢量)

一、 应用场景

TIFF格式的影像数据包含了丰富的地理信息,但是直接使用栅格数据进行分析和规划存在一定的局限性,因为栅格数据不利于进行空间查询和属性分析。

因此我们可以将这些栅格TIFF数据转换为矢量格式,以便更好地进行空间分析和数据集成。

1、GeoJSON

GeoJSON是一种基于JSON(JavaScript Object Notation)的格式,用于在Web应用程序中编码各种地理数据结构。它能够描述几何、拓扑关系、属性和地理空间数据的其他特征,非常适合于矢量化处理和空间分析。

GeoJSON 的关键特性:

  • 1、基于JSON: GeoJSON 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。
  • 2、几何类型: GeoJSON支持多种几何类型,包括点(Point)、线(LineString)、线环(LinearRing)、多边形(Polygon)、多点(MultiPoint)、多线(MultiLineString)、多多边形(MultiPolygon)和几何集合(GeometryCollection)。
  • 3、特征(Feature): GeoJSON中的一个“特征”(Feature)是一个包含几何对象和属性的对象。特征可以代表地图上的一个实体,如一个城市或一条河流。
  • 4、特征集合(FeatureCollection): 特征集合是一组特征的集合,可以用来表示多个地理实体。
  • 5、属性: 每个特征都可以有一个与之关联的属性对象,该对象存储了关于特征的信息,例如名称、类型或其他描述性数据。
  • 6、 坐标参考系统: GeoJSON 对象可以包含一个“坐标参考系统”(CRS)属性,用来指定坐标系统,最常见的是WGS84(EPSG:4326)。

2、ESRI Shapefile

SHP(Shapefile)是一种广泛使用的矢量数据存储格式,由美国ESRI开发,它主要用于存储地理信息系统(GIS)中的点、线或多边形数据,一个完整的Shapefile由以下文件组成:

  • .shp文件:这是Shapefile的主文件,包含几何图形的几何信息,即空间坐标数据

  • .shx文件:这是Shapefile的索引文件,用于存储.shp文件中要素的位置,加快数据访问速度

  • .dbf文件:这是Shapefile的属性数据文件,存储每个几何图形的属性信息,如名称、类型等,采用dBase IV格式

除了这三个必须的文件外,Shapefile还可以包括以下可选文件:

  • .prj文件:包含地图投影的信息,定义了数据的坐标系和投影信息

  • .sbn和.sbx文件:这些是Shapefile的空间索引文件,提供了额外的空间查询性能,用于支持空间索引的快速查找

  • .xml文件:包含Shapefile的元数据信息

  • .cpg文件:存储的是属性表编码,例如ANSI或UTF-8,如果SHP打开属性表乱码很可能就是CPG文件出问题了

3、GDAL

GDAL(Geospatial Data Abstraction Library)是一个开源的地理空间数据处理库,它提供了强大的数据转换功能。通过编写一段GDAL命令或脚本,可以将栅格TIFF文件转换为矢量格式。


二、基本思路

1、数据准备

输入数据: 栅格数据可以是遥感图像,DEM地形,也可以是经过栅格计算后提取的坡度坡向等数据。格式为tif。 栅格数据的像元值通常为整数,每个整数代表栅格的一种颜色或类别。

输出数据: 需要定义输出的矢量数据的格式,一般而言,栅格转面要素的情况最常见。在转换过程中,可以选择一个字段,该字段的值将被用来指定输出面要素的属性。默认情况下,这个字段是“Value”,它包含了每个栅格像元中的值。

栅格转矢量的输出格式可以是GeoJSON,也可以是shapefile

这里使用DEM数据作为输入数据。
在这里插入图片描述

2、重投影(可选)

数据重投影是一个很常见的处理方法,将图像或数据集从一个地理坐标系统转换到另一个坐标系统。这项技术对于确保数据的一致性和可用性至关重要,尤其是在处理来自不同来源和不同坐标系统的数据时。

之前博客【GIS教程】使用Arcpy+GDAL批量投影并批量生成COG文件-附完整代码 中介绍了使用Arcpy进行批量投影的方法,本篇补充使用GDAL函数修改栅格数据的坐标系

使用函数gdal.Warp

# 打开源TIF文件
input_tif = r'C:\yourpath\Desktop\input.tif' #源栅格数据路径
prj_tif = r'C:\yourpath\Desktop\prj_output.tif' #投影后的栅格数据路径
raster_dataset = gdal.Open(input_tif, gdal.GA_ReadOnly) # 读取源数据# 设置目标坐标系为WGS84(EPSG:4326)
target_srs = osr.SpatialReference()
target_srs.ImportFromEPSG(4326)# 使用gdal.Warp进行坐标系转换,并生成重投影的TIF文件
gdal.Warp(prj_tif, raster_dataset, dstSRS=target_srs)# 关闭数据集
raster_dataset = None

得到的prj_tif即为重投影后的栅格数据。

3、创建空的矢量图层

在GDAL中创建空的矢量图层是为了初始化一个具有特定几何类型和属性结构的空间数据容器,以便后续能够将几何要素和属性数据写入其中,从而构建完整的矢量数据集。

使用函数data_source.CreateLayer,需要定义矢量格式、坐标系、图层以及属性字段

#定义坐标系
prj = osr.SpatialReference()
prj.ImportFromEPSG(4326)# 创建一个空的矢量图层:GeoJOSN
output_file = r'C:\yourpath\Desktop\result.geojson'
driver = ogr.GetDriverByName('GeoJSON') data_source = driver.CreateDataSource(output_file) #这里添加输出文件路径
# polygons为geojson的"name"参数,geom_type为类型,prj为定义的坐标系。
layer = data_source.CreateLayer('polygons', geom_type=ogr.wkbPolygon, srs = prj)
# 定义矢量属性,不可省略
layer.CreateField(ogr.FieldDefn('value', ogr.OFTReal))# 创建一个空的矢量图层:Shapefile
output_file = r'C:\yourpath\Desktop\result' #路径为文件夹
driver = ogr.GetDriverByName('ESRI Shapefile') data_source = driver.CreateDataSource(output_file) #这里添加输出文件路径
# polygons为geojson的"name"参数,geom_type为类型,prj为定义的坐标系。
layer = data_source.CreateLayer('polygons', geom_type=ogr.wkbPolygon, srs = prj)
# 定义矢量属性,不可省略
layer.CreateField(ogr.FieldDefn('value', ogr.OFTReal))

4、栅格转矢量

使用函数gdal.Polygonize:将每个像元转成一个矩形,然后将相似的像元进行合并。

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

#读取栅格波段
tmp_dataset = gdal.Open(input_tif, gdal.GA_ReadOnly) # 读取栅格数据
tmp_band = tmp_dataset.GetRasterBand(1) # 最后想要转为矢量的波段,单波段是1
mask_band = tmp_band.GetMaskBand() # 定义掩膜范围 # 将栅格数据转换为矢量多边形
# outLayer 是定义好的矢量的图层Layer
gdal.Polygonize(srcBand=tmp_band, maskBand=mask_band, outLayer=layer, iPixValField=0)

输出结果:GeoJSON
在这里插入图片描述
输出结果:Shapefile
在这里插入图片描述
在这里插入图片描述

三、完整代码

# 栅格转geojson实验代码
import os
from osgeo import gdal, ogr, osrdef reproject_raster(input_tif, prj_tif, target_epsg):# 打开源TIF文件raster_dataset = gdal.Open(input_tif, gdal.GA_ReadOnly)# 设置目标坐标系target_srs = osr.SpatialReference()target_srs.ImportFromEPSG(target_epsg)# 使用gdal.Warp进行坐标系转换,并生成临时重投影的TIF文件gdal.Warp(prj_tif, raster_dataset, dstSRS=target_srs)# 关闭数据集raster_dataset = Nonedef create_empty_vector(output_file, target_epsg):prj = osr.SpatialReference()prj.ImportFromEPSG(target_epsg)# 创建一个空的矢量图层driver = ogr.GetDriverByName('GeoJSON') #修改 GeoJSON 或 ESRI Shapefiledata_source = driver.CreateDataSource(output_file)layer = data_source.CreateLayer('polygons', geom_type=ogr.wkbPolygon,srs = prj)layer.CreateField(ogr.FieldDefn('value', ogr.OFTReal))return data_source, layerdef raster_to_vector(input_tif, output_file):# 对input_tif进行重投影tmp_tif = "temp.tif" # 中间的重投影文件,视为过程文件target_epsg = 4326reproject_raster(input_tif, tmp_tif, target_epsg)# 打开重投影后的TIF文件tmp_dataset = gdal.Open(tmp_tif, gdal.GA_ReadOnly)tmp_band = tmp_dataset.GetRasterBand(1)mask_band = tmp_band.GetMaskBand()# 创建空矢量图层data_source, layer = create_empty_vector(output_file, target_epsg)# 将栅格数据转换为矢量多边形gdal.Polygonize(srcBand=tmp_band, maskBand=mask_band, outLayer=layer, iPixValField=0)# 关闭数据源和数据集data_source.Destroy()tmp_dataset = Noneos.remove(tmp_tif)  # 移除中间文件# 使用函数
input_tif = r'C:\yourpath\Desktop\input.tif'
output_file = r"C:\yourpath\Desktop\output.geojson"
raster_to_vector(input_tif, output_file)

四、总结

GDAL栅格转矢量是将栅格数据(像素表示的连续数据)转换为矢量数据(离散的几何对象)的过程,通常涉及重投影gdal.Warp、创建空矢量图层data_source.CreateLayer、使用gdal.Polygonize函数将栅格像素转换为矢量多边形,并最终编辑和保存转换结果,以便进行空间分析和GIS应用。

五、拓展(使用ArcGIS工具进行栅格转矢量)

操作步骤:

  • 1、查看数据类型,【浮点型】数据需要转为【整型】,类型转换:【spatial analyst】- 【数学分析】-【转为整型】工具。

  • 2、栅格转面【转换工具】-【由栅格转出】-【栅格转面工具】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

JVM系列(十三) -常用调优工具介绍

最近对 JVM 技术知识进行了重新整理,再次献上 JVM系列文章合集索引,感兴趣的小伙伴可以直接点击如下地址快速阅读。 JVM系列(一) -什么是虚拟机JVM系列(二) -类的加载过程JVM系列(三) -内存布局详解JVM系列(四) -对象的创建过程JVM系列(五) -对象的内存分…

Hive其四,Hive的数据导出,案例展示,表类型介绍

目录 一、Hive的数据导出 1)导出数据到本地目录 2)导出到hdfs的目录下 3)直接将结果导出到本地文件中 二、一个案例 三、表类型 1、表类型介绍 2、内部表和外部表转换 3、两种表的区别 4、练习 一、Hive的数据导出 数据导出的分类&…

使用RKNN进行YOLOv8人体姿态估计的实战教程:yolov8-pose.onnx转yolov8-pose.rknn+推理全流程

之前文章有提到“YOLOv8的原生模型包含了后处理步骤,其中一些形状超出了RK3588的矩阵计算限制,因此需要对输出层进行一些裁剪”,通过裁剪后得到的onnx能够顺利的进行rknn转换,本文将对转rnkk过程,以及相应的后处理进行阐述。并在文末附上全部源码、数据、模型的百度云盘链…

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集NI-FGSM介绍背景算法流程 NI-FGSM代码实现NI-FGSM算法实现攻击效果 代码汇总nifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器: Pytorch | 从零构建AlexNet对CIFAR10进行…

继承详细总结

一.继承的定义与概念 1.定义:继承是一种is-a的关系,例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。 2.允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数) 和 属…

批量多线程给TXT文档插入相关腾讯AI【高质量无水印无版权】原创图片

给蜘蛛访问的网站文章插入相关图片,可以带来以下好处: ‌1、提升用户体验‌:图片能够直观地展示文章内容,帮助用户更好地理解和消化信息。对于阅读者来说,图文并茂的内容往往更具吸引力,也能提高他们的阅读…

牵手红娘:牵手App红娘助力“牵手”,脱单精准更便捷

随着互联网的普及,现代青年的社交圈层加速扩大,他们的恋爱观也正经历着前所未有的转变。在繁忙的工作之余,人们希望能够找到一种既高效又真诚的交友方式。于是,线上交友平台成为了他们寻找爱情的新选择。让不同文化背景、不同工作…

STM32-笔记12-实现SysTick模拟多线程流水灯

1、前言 正常STM32实现多线程,需要移植一个操作系统FreeRTOS。但是在这里不移植FreeRTOS怎么实现多线程呢?使用SysTick,那么怎么使用SysTick来模拟多线程呢?前面我们知道SysTick就是一个定时器,它不是在主函数的while循…

麒麟信安受邀出席开放原子园区行暨供需对接活动,分享基于关基领域打造的行业解决方案

12月17日,武汉市经信局和开放原子开源基金会共同主办开放原子园区行暨供需对接活动,旨在推进武汉市开源体系建设,推动开源技术赋能千行百业。活动吸引了武汉市委金融办、市卫健委、疾控中心、医保局、信息中心(大数据中心)、市红十字会、银行…

golang 并发--goroutine(四)

golang 语言最大的特点之一就是语法上支持并发,通过简单的语法很容易就能创建一个 go 程,这就使得 golang 天生适合写高并发的程序。这一章节我们就主要介绍 go 程,但是要想完全理解 go 程我们需要深入研究 GPM 模型,关于 GPM 模型…

SpringAI人工智能开发框架006---SpringAI多模态接口_编程测试springai多模态接口支持

可以看到springai对多模态的支持. 同样去创建一个项目 也是跟之前的项目一样,修改版本1.0.0 这里 然后修改仓库地址,为springai的地址 然后开始写代码

JSON 系列之1:将 JSON 数据存储在 Oracle 数据库中

本文为Oracle数据库JSON学习系列的第一篇,讲述如何将JSON文档存储到数据库中,包括了版本为19c和23ai的情形。 19c中的JSON 先来看一下数据库版本为19c时的情形。 创建表colortab,其中color列的长度设为4000。若color的长度需要设为32767&a…

SOME/IP 协议详解——信息格式

文章目录 1. 头部格式1.1 消息 ID(Message ID)1.2 长度(Length)1.3 请求 ID(Request ID)1.4 协议版本(Protocol Version):1.5 接口版本(Interface Version&am…

Spring学习(一)——Sping-XML

一、Spring的概述 (一)什么是Spring? Spring是针对bean对象的生命周期进行管理的轻量级容器。提供了功能强大IOC、AOP及Web MVC等功能。Spring框架主要由七部分组成:分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 S…

用 gdbserver 调试 arm-linux 上的 AWTK 应用程序

很多嵌入式 linux 开发者都能熟练的使用 gdb/lldb 调试应用程序,但是还有不少朋友在调试开发板上的程序时,仍然在使用原始的 printf。本文介绍一下使用 gdbserver 通过网络调试开发板上的 AWTK 应用程序的方法,供有需要的朋友参考。 1. 下载 …

树莓派换源

查询自己版本: lsb_release -a bullseye可以理解为树莓派的系统代号(10,11,12都不同,一定要看好自己系统是什么版本) 查询架构 uname -a aarch64的地方就是代表系统架构的,我的是aarch64的架…

MySQL索引-索引的结构和原理

索引原理 查找算法 顺序查找 数组链表 二分查找 B树跳表 散列查找 Hash表 DFS 树图 BFS 树图 分块查找 海量数据 Hash结构 Hash索引可以方便的提供等值查询,但是对于范围查询就需要全表扫描了。 Hash索引在MySQL 中Hash结构主要应用在InnoDB 自适应哈希索引。…

【Linux探索学习】第二十三弹——理解文件系统:认识硬件、探索文件在硬件上的存储问题

Linux学习笔记:https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 我们前面讲过了文件的组成是由文件内容和文件属性两者组成的,但是我们前面接触的文件都是系统中的文件,都是已经在进…

深度学习中的并行策略概述:2 Data Parallelism

深度学习中的并行策略概述:2 Data Parallelism 数据并行(Data Parallelism)的核心在于将模型的数据处理过程并行化。具体来说,面对大规模数据批次时,将其拆分为较小的子批次,并在多个计算设备上同时进行处…