【代码】DEM生成等高线

本质是输入为高程asc文件,输出为shp文件。

直接上代码:



from osgeo import gdal, ogr
import sys

def generate_contour(source, target, contour_interval=400, contour_base=10):
    """
    从给定的DEM生成等高线,并保存为Shapefile格式。

    参数:
    source : str
        DEM文件的路径。
    target : str
        输出Shapefile文件的路径(不包括扩展名)。
    contour_interval : int, optional
        等高线的间隔。
    contour_base : int, optional
        等高线的基准。

    返回:
    None
    """

    # 创建Shapefile数据源
    ogr_driver = ogr.GetDriverByName('ESRI Shapefile')
    ogr_ds = ogr_driver.CreateDataSource(target + ".shp")

    # 创建图层并添加字段
    ogr_lyr = ogr_ds.CreateLayer(target, geom_type=ogr.wkbLineString25D)
    field_defn = ogr.FieldDefn('ID', ogr.OFTInteger)
    ogr_lyr.CreateField(field_defn)
    field_defn = ogr.FieldDefn('ELEV', ogr.OFTReal)
    ogr_lyr.CreateField(field_defn)

    # 打开DEM文件
    ds = gdal.Open(source)
    if ds is None:
        print(f"打开文件失败: {source}")
        sys.exit(1)

    # 生成等高线
    result = gdal.ContourGenerate(ds.GetRasterBand(1), contour_interval, contour_base, [], 0, 0, ogr_lyr, 0, 1)
    if result != 0:
        print(f"等高线生成失败: {gdal.GetLastErrorMsg()}")
        sys.exit(2)

    # 关闭数据集
    ds = None
    ogr_ds = None
if __name__ == '__main__':
    generate_contour("dem.asc", "contour")

结果展示:

image-20240329162554372

这个函数的主要任务是从地形高程信息文件(DEM文件)生成等高线,并将这些等高线保存到Shapefile文件中。DEM文件是一种栅格数据,其中每个像素的值表示相应位置的高程。Shapefile文件是一种矢量数据格式,可以存储包括点、线或多边形在内的地理元素以及相关的属性信息。

在函数的执行过程中,首先,函数通过接收DEM文件的路径、输出Shapefile文件的路径以及等高线的间隔和基准作为参数来开始工作。接着,利用GDAL和OGR库,函数打开DEM文件并创建Shapefile数据源。在Shapefile数据源中,函数创建一个新的图层,并在这个图层中添加ID和ELEV字段,用于记录等高线的唯一标识和相应的高程。

之后,函数调用GDAL库的ContourGenerate函数从DEM数据生成等高线,并将这些等高线添加到Shapefile图层中。在这个过程中,如果遇到任何错误,函数将会打印错误信息并停止执行。

最后,函数关闭并释放DEM数据和Shapefile数据源,完成等高线的生成和保存工作。这个过程利用了栅格数据和矢量数据的特性,通过对DEM数据的处理和转换,生成了可用于地理信息系统的Shapefile等高线数据。

数据结构:

  1. DEM文件:这是一个包含地形高程信息的文件,通常以.asc或.tif等格式保存。在这个函数中,我们将其路径作为source参数传入。
  2. Shapefile文件:这是一个矢量数据格式,用于存储地理位置和属性信息。在这个函数中,我们将生成的等高线保存到这种格式的文件中,其路径(不包括扩展名)作为target参数传入。

数据特点:

  1. DEM数据:它是一种栅格数据,每个像素的值表示那个位置的高程。
  2. Shapefile数据:它是一种矢量数据,可以包含点、线或多边形等地理元素,每个元素都可以有一个或多个属性。在这个函数中,我们生成的是线类型的元素,即等高线,每条等高线都有一个ID和一个ELEV属性,分别表示等高线的唯一标识和高程。