真实地形三维建模全攻略:从数据获取到模型生成

Views: 4

本文将详细介绍一种基于数字高程模型(DEM)的真实地形三维建模方法,助力读者快速上手,首次按照教程全流程操作约需30分钟。

1. DEM数据的下载

地理空间数据云(www.gscloud.cn)是获取地形数据(DEM)的重要资源平台。它涵盖全球数据,如 LANDSAT、SENTINEL、MODIS、DEM 等,且永久免费。

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

②因我们需要的是地形数据,选择ASTER GDEM 30M数据即可。

③选择数据集后,框选研究区(本教程选择南昌市梅岭区域)后检索,将会出现匹配研究区的DEM数据,点击下载按钮即可下载。

2.利用Arcgis对DEM数据进行处理(裁剪、转换等)

下载的 DEM 数据需进行系列处理,主要包括裁剪、投影、转换等。

①首先,将数据导入ArcMap,查看属性,确认单元格尺寸与坐标系信息,需确认DEM数据单元尺寸单位为米,坐标系为投影坐标系,若不是需进行栅格投影。

图 2.1  导入的整幅地形数据
图 2.2  查看整幅地形数据属性
图 2.3  确认地形数据单元格尺寸
图 2.4  确认地形数据坐标系

若数据无需地理坐标系转投影坐标系变换,可直接进行后续操作。

②利用HIllshade工具生成山影图,能直观辅助确定研究范围。

图 2.5  生成地形数据山影图

图 2.6  研究区(梅岭)示意

③在目录中新建 shapefile(如多边形类型)。

图 2.7  目录栏新建Shapefile
图 2.8  新建Shapefile属性

④编辑绘制裁剪框。

图 2.9  编辑新建Shapefile
图 2.10  点击Create Feature开始创建元素
图 2.11  点击Rectangle开始创建矩形框
图 2.12  画好矩形框后保存并停止编辑

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

图 2.13  掩膜提取工具设置
图 2.14  掩膜提取后结果(彩色区域)

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

图 2.15  栅格转ASCII工具设置
图 2.16  转换后的ASCII文件及其修改

3.利用Python对ASC数据进行转换(ASC TO  OBJ)

在 Python 环境下,借助 numpy 库可实现 ASC 文件到三维 OBJ 文件的转换。

核心代码逻辑如下:先读取 ASC 文件头获取行列数、像元大小等关键信息及高程数据,构建顶点坐标列表(注意坐标系统转换符合图形系统 Y 轴向上约定),接着按规则构建三角网(如简单将每个像元划分为两个三角形),最后将顶点和三角面信息写入 OBJ 文件。

实际操作时,确保已安装 numpy 库,替换代码中的文件路径后运行程序,生成的 OBJ 文件可导入如犀牛等软件进行查看与后续处理。以下为代码。

import numpy as npdef 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)
代码 3.1  ASC转OBJ Python代码
图 3.1  复制asc文件路径

图 3.2  将路径修改至代码47-48行后运行
图 3.3  运行生成的三维obj文件
图 3.4  导入三维建模软件中进一步编辑

通过以上步骤,便可快速实现真实地形的三维建模。

如果本文对您有用,请帮忙点一下赞。如果有疑问,欢迎评论区留言。

还可以查看视频教程哦:https://www.bilibili.com/video/BV1ZcreYvEuz/

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部