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

打印 上一主题 下一主题

主题 924|帖子 924|积分 2772

一、 应用场景

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:
  1. # 打开源TIF文件
  2. input_tif = r'C:\yourpath\Desktop\input.tif' #源栅格数据路径
  3. prj_tif = r'C:\yourpath\Desktop\prj_output.tif' #投影后的栅格数据路径
  4. raster_dataset = gdal.Open(input_tif, gdal.GA_ReadOnly) # 读取源数据
  5. # 设置目标坐标系为WGS84(EPSG:4326)
  6. target_srs = osr.SpatialReference()
  7. target_srs.ImportFromEPSG(4326)
  8. # 使用gdal.Warp进行坐标系转换,并生成重投影的TIF文件
  9. gdal.Warp(prj_tif, raster_dataset, dstSRS=target_srs)
  10. # 关闭数据集
  11. raster_dataset = None
复制代码
得到的prj_tif即为重投影后的栅格数据。
3、创建空的矢量图层

在GDAL中创建空的矢量图层是为了初始化一个具有特定几何类型和属性结构的空间数据容器,以便后续能够将几何要素和属性数据写入其中,从而构建完整的矢量数据集。
使用函数data_source.CreateLayer,需要定义矢量格式、坐标系、图层以及属性字段
  1. #定义坐标系
  2. prj = osr.SpatialReference()
  3. prj.ImportFromEPSG(4326)
  4. # 创建一个空的矢量图层:GeoJOSN
  5. output_file = r'C:\yourpath\Desktop\result.geojson'
  6. driver = ogr.GetDriverByName('GeoJSON')
  7. data_source = driver.CreateDataSource(output_file) #这里添加输出文件路径
  8. # polygons为geojson的"name"参数,geom_type为类型,prj为定义的坐标系。
  9. layer = data_source.CreateLayer('polygons', geom_type=ogr.wkbPolygon, srs = prj)
  10. # 定义矢量属性,不可省略
  11. layer.CreateField(ogr.FieldDefn('value', ogr.OFTReal))
  12. # 创建一个空的矢量图层:Shapefile
  13. output_file = r'C:\yourpath\Desktop\result' #路径为文件夹
  14. driver = ogr.GetDriverByName('ESRI Shapefile')
  15. data_source = driver.CreateDataSource(output_file) #这里添加输出文件路径
  16. # polygons为geojson的"name"参数,geom_type为类型,prj为定义的坐标系。
  17. layer = data_source.CreateLayer('polygons', geom_type=ogr.wkbPolygon, srs = prj)
  18. # 定义矢量属性,不可省略
  19. 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
  1. #读取栅格波段
  2. tmp_dataset = gdal.Open(input_tif, gdal.GA_ReadOnly) # 读取栅格数据
  3. tmp_band = tmp_dataset.GetRasterBand(1) # 最后想要转为矢量的波段,单波段是1
  4. mask_band = tmp_band.GetMaskBand() # 定义掩膜范围
  5. # 将栅格数据转换为矢量多边形
  6. # outLayer 是定义好的矢量的图层Layer
  7. gdal.Polygonize(srcBand=tmp_band, maskBand=mask_band, outLayer=layer, iPixValField=0)
复制代码
输出结果:GeoJSON

输出结果:Shapefile


三、完整代码

  1. # 栅格转geojson实验代码
  2. import os
  3. from osgeo import gdal, ogr, osr
  4. def reproject_raster(input_tif, prj_tif, target_epsg):
  5.     # 打开源TIF文件
  6.     raster_dataset = gdal.Open(input_tif, gdal.GA_ReadOnly)
  7.     # 设置目标坐标系
  8.     target_srs = osr.SpatialReference()
  9.     target_srs.ImportFromEPSG(target_epsg)
  10.     # 使用gdal.Warp进行坐标系转换,并生成临时重投影的TIF文件
  11.     gdal.Warp(prj_tif, raster_dataset, dstSRS=target_srs)
  12.     # 关闭数据集
  13.     raster_dataset = None
  14. def create_empty_vector(output_file, target_epsg):
  15.     prj = osr.SpatialReference()
  16.     prj.ImportFromEPSG(target_epsg)
  17.     # 创建一个空的矢量图层
  18.     driver = ogr.GetDriverByName('GeoJSON') #修改 GeoJSON 或 ESRI Shapefile
  19.     data_source = driver.CreateDataSource(output_file)
  20.     layer = data_source.CreateLayer('polygons', geom_type=ogr.wkbPolygon,srs = prj)
  21.     layer.CreateField(ogr.FieldDefn('value', ogr.OFTReal))
  22.     return data_source, layer
  23. def raster_to_vector(input_tif, output_file):
  24.     # 对input_tif进行重投影
  25.     tmp_tif = "temp.tif" # 中间的重投影文件,视为过程文件
  26.     target_epsg = 4326
  27.     reproject_raster(input_tif, tmp_tif, target_epsg)
  28.     # 打开重投影后的TIF文件
  29.     tmp_dataset = gdal.Open(tmp_tif, gdal.GA_ReadOnly)
  30.     tmp_band = tmp_dataset.GetRasterBand(1)
  31.     mask_band = tmp_band.GetMaskBand()
  32.     # 创建空矢量图层
  33.     data_source, layer = create_empty_vector(output_file, target_epsg)
  34.     # 将栅格数据转换为矢量多边形
  35.     gdal.Polygonize(srcBand=tmp_band, maskBand=mask_band, outLayer=layer, iPixValField=0)
  36.     # 关闭数据源和数据集
  37.     data_source.Destroy()
  38.     tmp_dataset = None
  39.     os.remove(tmp_tif)  # 移除中间文件
  40. # 使用函数
  41. input_tif = r'C:\yourpath\Desktop\input.tif'
  42. output_file = r"C:\yourpath\Desktop\output.geojson"
  43. raster_to_vector(input_tif, output_file)
复制代码
四、总结

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

操纵步骤:


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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

汕尾海湾

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表