Views: 4
本文将详细介绍一种基于数字高程模型(DEM)的真实地形三维建模方法,助力读者快速上手,首次按照教程全流程操作约需30分钟。
1. DEM数据的下载
地理空间数据云(www.gscloud.cn)是获取地形数据(DEM)的重要资源平台。它涵盖全球数据,如 LANDSAT、SENTINEL、MODIS、DEM 等,且永久免费。

①用户登录后,通过高级检索,选择所需数据集(如 ASTER GDEM 30M 分辨率数字高程数据等),圈定目标区域范围,即可轻松下载匹配数据。
②因我们需要的是地形数据,选择ASTER GDEM 30M数据即可。

2.利用Arcgis对DEM数据进行处理(裁剪、转换等)
下载的 DEM 数据需进行系列处理,主要包括裁剪、投影、转换等。
①首先,将数据导入ArcMap,查看属性,确认单元格尺寸与坐标系信息,需确认DEM数据单元尺寸单位为米,坐标系为投影坐标系,若不是需进行栅格投影。




若数据无需地理坐标系转投影坐标系变换,可直接进行后续操作。
②利用HIllshade工具生成山影图,能直观辅助确定研究范围。


图 2.6 研究区(梅岭)示意
③在目录中新建 shapefile(如多边形类型)。


④编辑绘制裁剪框。




⑤再运用掩膜提取工具裁剪出研究区 DEM。


⑥最后,搜索 “raster to ascii” 将 DEM 数据转换为 ASCII 格式,并按需修改文件中的相关数值(如将空值改为合适的底部海拔标识)。


3.利用Python对ASC数据进行转换(ASC TO OBJ)
在 Python 环境下,借助 numpy 库可实现 ASC 文件到三维 OBJ 文件的转换。
核心代码逻辑如下:先读取 ASC 文件头获取行列数、像元大小等关键信息及高程数据,构建顶点坐标列表(注意坐标系统转换符合图形系统 Y 轴向上约定),接着按规则构建三角网(如简单将每个像元划分为两个三角形),最后将顶点和三角面信息写入 OBJ 文件。
实际操作时,确保已安装 numpy 库,替换代码中的文件路径后运行程序,生成的 OBJ 文件可导入如犀牛等软件进行查看与后续处理。以下为代码。
import numpy as np
def asc_to_obj(asc_file_path, obj_file_path):
"""
将ASC格式的DEM数据转换为OBJ格式文件(简单的三角网表示)
:param asc_file_path: ASC文件的路径
:param obj_file_path: 要生成的OBJ文件的路径
"""
# 读取ASC文件头信息,获取行列数以及像元大小等(假设标准的ASC格式头部)
with open(asc_file_path, 'r') as asc_file:
header = [next(asc_file).strip().split() for _ in range(6)]
ncols = int(header[0][1])
nrows = int(header[1][1])
xllcorner = float(header[2][1])
yllcorner = float(header[3][1])
cellsize = float(header[4][1])
nodata_value = float(header[5][1])
# 读取高程数据
elevation_data = np.array([[float(x) if x!= nodata_value else 0 for x in line.strip().split()]
for line in asc_file])
# 构建顶点坐标列表(根据每个像元的角点来生成顶点,这里简单处理,实际更复杂场景可能不同)
vertices = []
for row in range(nrows):
for col in range(ncols):
x = xllcorner + col * cellsize
y = yllcorner + (nrows - row - 1) * cellsize # 注意坐标系统转换以符合常见的图形系统的Y轴向上
z = elevation_data[row, col]
vertices.append([x, y, z])
# 构建三角网,这里简单使用两个三角形来表示一个像元(简单的规则划分,可优化)
faces = []
for row in range(nrows - 1):
for col in range(ncols - 1):
v1 = row * ncols + col
v2 = row * ncols + col + 1
v3 = (row + 1) * ncols + col
v4 = (row + 1) * ncols + col + 1
# 第一个三角形
faces.append([v1 + 1, v2 + 1, v3 + 1]) # OBJ索引从1开始
# 第二个三角形
faces.append([v2 + 1, v4 + 1, v3 + 1])
# 将顶点和三角面信息写入到OBJ文件
with open(obj_file_path, 'w') as obj_file:
for vertex in vertices:
obj_file.write("v {} {} {}n".format(vertex[0], vertex[1], vertex[2]))
for face in faces:
obj_file.write("f {} {} {}n".format(face[0], face[1], face[2]))
# 使用示例
asc_file_path = "your_asc_file.asc" # 替换为实际的ASC文件路径
obj_file_path = "output.obj" # 输出的OBJ文件路径
asc_to_obj(asc_file_path, obj_file_path)



通过以上步骤,便可快速实现真实地形的三维建模。
如果本文对您有用,请帮忙点一下赞。如果有疑问,欢迎评论区留言。