【代码】DEM生成等高线
【代码】DEM生成等高线
ytkz本质是输入为高程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")
结果展示:
这个函数的主要任务是从地形高程信息文件(DEM文件)生成等高线,并将这些等高线保存到Shapefile文件中。DEM文件是一种栅格数据,其中每个像素的值表示相应位置的高程。Shapefile文件是一种矢量数据格式,可以存储包括点、线或多边形在内的地理元素以及相关的属性信息。
在函数的执行过程中,首先,函数通过接收DEM文件的路径、输出Shapefile文件的路径以及等高线的间隔和基准作为参数来开始工作。接着,利用GDAL和OGR库,函数打开DEM文件并创建Shapefile数据源。在Shapefile数据源中,函数创建一个新的图层,并在这个图层中添加ID和ELEV字段,用于记录等高线的唯一标识和相应的高程。
之后,函数调用GDAL库的ContourGenerate
函数从DEM数据生成等高线,并将这些等高线添加到Shapefile图层中。在这个过程中,如果遇到任何错误,函数将会打印错误信息并停止执行。
最后,函数关闭并释放DEM数据和Shapefile数据源,完成等高线的生成和保存工作。这个过程利用了栅格数据和矢量数据的特性,通过对DEM数据的处理和转换,生成了可用于地理信息系统的Shapefile等高线数据。
数据结构:
- DEM文件:这是一个包含地形高程信息的文件,通常以.asc或.tif等格式保存。在这个函数中,我们将其路径作为
source
参数传入。 - Shapefile文件:这是一个矢量数据格式,用于存储地理位置和属性信息。在这个函数中,我们将生成的等高线保存到这种格式的文件中,其路径(不包括扩展名)作为
target
参数传入。
数据特点:
- DEM数据:它是一种栅格数据,每个像素的值表示那个位置的高程。
- Shapefile数据:它是一种矢量数据,可以包含点、线或多边形等地理元素,每个元素都可以有一个或多个属性。在这个函数中,我们生成的是线类型的元素,即等高线,每条等高线都有一个ID和一个ELEV属性,分别表示等高线的唯一标识和高程。