GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。
Python的GDAL库作为栅格数据的处理转换库,其支持几百种栅格数据格式,如常见的TIFF、ENVI、HFA、HDF4等。因为遥感影像大部分都是栅格数据,所以GDAL库非常适合处理遥感影像、如光谱指数计算、波段合成、批量下载、栅格转面等。
os库用来判断文件是否存在,gdal库用来打开栅格数据并实现栅格转换,osr库用于定义投影,ogr库用于创建并编辑矢量。
var code = "3085904e-43cb-46ec-b554-3611f7b23acb"
import os
from osgeo import gdal, osr, ogr
栅格转面是指将栅格数据转换为连续的面状要素,通常在GIS数据分析和空间建模中使用。其主要意义包括:
提高数据精度:栅格数据是离散的,而面状要素是连续的,将栅格数据转换为连续的面状要素可以提高数据的精度。
便于空间分析:栅格数据在进行空间分析和建模时存在不足,而面状要素具有更强的可视化和解释性,便于空间分析和建模。
方便数据交换:在不同GIS软件和平台之间,栅格数据的格式和处理方式可能存在差异。将栅格数据转换为面状要素可以方便数据的交换和共享。
1.读取栅格数据
# 栅格转面
ds_raster = gdal.Open(different_data) # 读取路径中的栅格数据
band_raster = ds_raster.GetRasterBand(1) # 获取需要转为矢量的波段
2.创建投影驱动,并导入投影信息
proj_raster = osr.SpatialReference()
proj_raster.ImportFromWkt(ds_raster.GetProjection())
# 将栅格数据的投影信息赋值给矢量
3.创建矢量驱动,并创建新的属性字段
driver = ogr.GetDriverByName("ESRI Shapefile")
polygon = driver.CreateDataSource(out_shp) # 创建数据资源
layer_polygon = polygon.CreateLayer("Shp", srs=proj_raster, geom_type=ogr.wkbMultiPolygon) # 创建图层,定义多面
new_field = ogr.FieldDefn('value', ogr.OFTReal) # 给目标shp文件添加一个字段,用来存储原始栅格的pixel value
layer_polygon.CreateField(new_field)
4.执行栅格转面函数并关闭数据驱动
gdal.FPolygonize(band_raster, None, layer_polygon, 0) # 核心函数,执行的就是栅格转矢量操作
polygon.SyncToDisk()
polygon = None
5.完整代码
def Grid_faceting(different_data, out_shp):
"""
:param different_data: 输入需要转换的栅格数据
:param out_shp: 输出矢量的路径
:return:
"""
print("正在栅格转面。。。")
# 栅格转面
ds_raster = gdal.Open(different_data) # 读取路径中的栅格数据
band_raster = ds_raster.GetRasterBand(1) # 获取需要转为矢量的波段
proj_raster = osr.SpatialReference()
proj_raster.ImportFromWkt(ds_raster.GetProjection())
# 将栅格数据的投影信息赋值给矢量
driver = ogr.GetDriverByName("ESRI Shapefile")
if os.path.exists(out_shp): # 若文件已经存在,则删除它继续重新做一遍
driver.DeleteDataSource(out_shp)
polygon = driver.CreateDataSource(out_shp) # 创建数据资源
layer_polygon = polygon.CreateLayer("Shp", srs=proj_raster, geom_type=ogr.wkbMultiPolygon) # 创建图层,定义多面
new_field = ogr.FieldDefn('value', ogr.OFTReal) # 给目标shp文件添加一个字段,用来存储原始栅格的pixel value
layer_polygon.CreateField(new_field)
gdal.FPolygonize(band_raster, None, layer_polygon, 0) # 核心函数,执行的就是栅格转矢量操作
polygon.SyncToDisk()
polygon = None
1.创建数据驱动,打开数据
driver = ogr.GetDriverByName("ESRI Shapefile") # 创建数据驱动
ds = driver.Open(path_shp, 1) # 创建数据资源
2.创建新字段“Area”用来保存计算得到的面积
layer = ds.GetLayer()
new_field = ogr.FieldDefn("Area", ogr.OFTReal) # 创建新的字段
new_field.SetWidth(32)
new_field.SetPrecision(16)
layer.CreateField(new_field)
3.循环图层内的所有要素,并计算面积
for feature in layer:
geom = feature.GetGeometryRef()
geom2 = geom.Clone()
area = geom2.GetArea() # 默认为平方米
# area = area / 1000000 # 转化为平方公里
feature.SetField("Area", area)
# feature.GetField('Area')
layer.SetFeature(feature)
4.完整代码
def Get_polygon_area(path_shp):
"""
:param path_shp: 输入矢量文件
:return:
"""
print("正在获取矢量面积。。。")
driver = ogr.GetDriverByName("ESRI Shapefile") # 创建数据驱动
ds = driver.Open(path_shp, 1) # 创建数据资源
layer = ds.GetLayer()
new_field = ogr.FieldDefn("Area", ogr.OFTReal) # 创建新的字段
new_field.SetWidth(32)
new_field.SetPrecision(16)
layer.CreateField(new_field)
number = 0
for feature in layer:
geom = feature.GetGeometryRef()
geom2 = geom.Clone()
area = geom2.GetArea() # 默认为平方米
# area = area / 1000000 # 转化为平方公里
feature.SetField("Area", area)
# feature.GetField('Area')
layer.SetFeature(feature)
ds = None
本文章主要是分享个人在学习Python过程中写过的一些代码。有些部分借鉴了前人以及官网的教程,如有侵权请联系作者删除,大家有问题可以随时留言交流,博主会及时回复。