欢迎访问宙启技术站
智能推送

使用Python和GDAL库将栅格数据转换为矢量数据的方法

发布时间:2023-12-12 08:13:55

GDAL(Geospatial Data Abstraction Library)是一个在开源GIS软件中广泛使用的库,它提供了读取、写入和处理各种栅格和矢量数据格式的功能。

将栅格数据转换为矢量数据的一种常见方法是栅格化(Rasterize)操作,即将栅格数据中的像素值转换为矢量数据中的几何对象,例如点、线、多边形等。

在Python中,可以使用gdal库中的RasterizeLayer函数来实现栅格化操作。下面是一个简单的例子,演示如何将一个栅格数据文件(例如TIFF格式)转换为一个包含多边形几何对象的矢量数据文件(例如Shapefile格式)。

import gdal
from gdalconst import *

# 输入栅格数据文件路径
input_raster = "path/to/input/raster.tif"

# 输入矢量数据文件路径
output_vector = "path/to/output/vector.shp"

# 打开输入栅格数据文件
dataset = gdal.Open(input_raster, GA_ReadOnly)

# 获取栅格数据的宽度、高度和波段数
width = dataset.RasterXSize
height = dataset.RasterYSize
band_count = dataset.RasterCount

# 创建输出矢量数据文件
driver = gdal.GetDriverByName("ESRI Shapefile")
output_dataset = driver.Create(output_vector, 0, 0, 0, GDT_Unknown)

# 获取输入栅格数据的空间参考
projection = dataset.GetProjection()

# 设置输出矢量数据的空间参考
output_dataset.SetProjection(projection)

# 创建输出矢量数据的图层
layer = output_dataset.CreateLayer("vector_layer", None, ogr.wkbPolygon)

# 添加要素类型字段
field_defn = ogr.FieldDefn("value", OFTInteger)
layer.CreateField(field_defn)

# 遍历输入栅格数据的每个波段
for i in range(1, band_count + 1):
    band = dataset.GetRasterBand(i)

    # 创建输入波段的临时矢量数据文件
    temp_vector = "path/to/temp/vector.shp"
    ds = ogr.GetDriverByName("ESRI Shapefile").CreateDataSource(temp_vector)
    temp_layer = ds.CreateLayer("temp_layer", None, ogr.wkbPoint)

    # 遍历栅格数据的每个像素
    for y in range(height):
        scanline = band.ReadRaster(0, y, width, 1, width, 1, GDT_Float32)
        values = struct.unpack("%df" % width, scanline)

        for x, value in enumerate(values):
            if value != 0:

                # 在临时图层中添加一个点
                point = ogr.Geometry(ogr.wkbPoint)
                point.AddPoint(x, height - y)

                feature = ogr.Feature(temp_layer.GetLayerDefn())
                feature.SetGeometry(point)
                temp_layer.CreateFeature(feature)
                feature = None

    # 将临时图层栅格化为多边形并添加到输出图层中
    rasterize_options = gdal.RasterizeOptions(outputSRS=projection,
                                              attribute="value",
                                              layers=[temp_layer])
    gdal.RasterizeLayer(output_dataset, [i], layer, options=[rasterize_options])

    # 删除临时图层和文件
    ds.Destroy()
    os.remove(temp_vector)

# 关闭输入和输出数据集
dataset = None
output_dataset = None

在上面的代码中,我们首先使用gdal库打开输入栅格数据文件,并获取其宽度、高度和波段数。然后,我们创建一个输出矢量数据文件,并设置其空间参考。

接下来,我们创建一个矢量图层,并定义一个整型字段。然后,我们遍历栅格数据的每个波段,并对每个像素进行处理。如果像素值不为0,我们将其转换为一个点,并添加到临时矢量图层中。

最后,我们将临时图层栅格化为多边形,并将其添加到输出图层中。在每次栅格化操作完成后,我们删除临时图层和文件。

这样,就完成了将栅格数据转换为矢量数据的操作,并保存到指定的输出文件中。你可以将上面的例子代码按照你的需求进行修改和扩展。