3D地形可视化新范式:用Rerun从DEM数据生成等高线的完整指南
你是否还在为地形数据可视化工具的复杂操作而烦恼?是否尝试过多种软件却始终无法快速呈现高质量的三维地形模型?本文将带你探索如何使用Rerun这款强大的可视化工具,从DEM(数字高程模型)数据轻松生成专业的三维地形和等高线,无需复杂的GIS知识,让地形可视化变得简单高效。读完本文,你将掌握从数据准备到最终可视化的完整流程,能够独立完成地形数据的三维展示和分析。
项目介绍与核心优势
Rerun是一个专注于多模态数据流可视化的开源项目,采用Rust语言开发,基于egui图形界面库,具有高效、易用和易于集成的特点。它能够帮助用户快速将各种数据以直观的方式进行可视化展示,特别是在三维空间数据的处理和呈现方面表现出色。
Rerun的核心优势包括:
- 高效的数据处理能力,能够快速加载和渲染大规模点云数据
- 简洁易用的API接口,支持多种编程语言,包括Python、Rust、C++等
- 强大的三维可视化功能,支持多种数据格式和渲染方式
- 灵活的界面布局,可自定义视图和交互方式
项目的完整文档和源码可以通过以下链接获取:
- 项目教程:README.md
- 技术架构:ARCHITECTURE.md
- Python API:rerun_py/
- 示例代码:examples/
环境准备与安装
在开始地形可视化之前,我们需要先安装Rerun及其相关依赖。Rerun提供了多种安装方式,这里我们以Python API为例,介绍如何快速搭建开发环境。
首先,确保你的系统中已经安装了Python 3.8或更高版本。然后,使用pip命令安装Rerun SDK:
pip install rerun-sdk
如果你需要从源码构建,可以通过以下命令克隆项目仓库:
git clone https://gitcode.com/GitHub_Trending/re/rerun.git
cd rerun
cargo build --release
项目还提供了详细的构建指南,包含在BUILD.md文件中,如有需要可以参考。
数据准备:DEM数据获取与处理
DEM(数字高程模型)数据是地形可视化的基础,它包含了地表的高程信息。我们可以从多种渠道获取DEM数据,如USGS Earth Explorer、ASTER GDEM等。本文使用示例数据集中的PLY格式点云文件来模拟DEM数据,你可以在examples/assets/example.ply找到该文件。
以下是加载PLY格式点云数据的Python代码示例:
import rerun as rr
import numpy as np
# 初始化Rerun可视化器
rr.init("terrain_visualization", spawn=True)
# 加载PLY文件数据
def load_ply_data(file_path):
points = []
with open(file_path, 'r') as f:
lines = f.readlines()
# 找到数据起始行
header_end = 0
for i, line in enumerate(lines):
if line.startswith('end_header'):
header_end = i + 1
break
# 读取点数据
for line in lines[header_end:]:
parts = list(map(float, line.strip().split()))
if len(parts) >= 3:
points.append([parts[0], parts[1], parts[2]])
return np.array(points)
# 加载示例地形数据
terrain_data = load_ply_data("examples/assets/example.ply")
print(f"Loaded terrain data with {len(terrain_data)} points")
这段代码会加载PLY文件中的点云数据,并提取出x、y、z坐标信息。实际应用中,你可能需要根据具体的DEM数据格式调整数据加载代码。
三维地形可视化实现
有了DEM数据后,我们可以使用Rerun的Points3D组件将其可视化为三维地形。以下是完整的实现代码:
import rerun as rr
import numpy as np
from pathlib import Path
def main():
# 初始化Rerun
rr.init("terrain_visualization", spawn=True)
# 设置坐标系
rr.log("world", rr.ViewCoordinates.RIGHT_HAND_Z_UP, static=True)
# 加载地形数据
terrain_data = load_ply_data("examples/assets/example.ply")
# 对数据进行处理,计算点的颜色(基于高程)
z_values = terrain_data[:, 2]
min_z, max_z = np.min(z_values), np.max(z_values)
norm_z = (z_values - min_z) / (max_z - min_z)
# 使用matplotlib的颜色映射生成点的颜色
import matplotlib.cm as cm
cmap = cm.get_cmap('terrain')
colors = cmap(norm_z)[:, :3] # 取RGB通道
# 记录点云数据
rr.log("world/terrain", rr.Points3D(
terrain_data,
colors=colors,
radii=0.05
))
# 保持可视化窗口打开
input("按Enter键退出...")
if __name__ == "__main__":
main()
在这段代码中,我们首先初始化了Rerun可视化器,然后设置了三维坐标系。接着,我们加载了之前准备好的地形数据,并根据点的高程值为每个点分配了颜色,使用了matplotlib的"terrain"颜色映射,使地形的高度变化更加直观。最后,我们使用rr.log函数将点云数据发送到可视化器中进行显示。
Rerun还提供了其他多种三维可视化组件,如Mesh3D,可以用于创建更平滑的地形表面。以下是一个使用Mesh3D的示例代码片段:
# 假设我们已经有了地形的网格数据
# vertices: 顶点坐标数组,shape为(n, 3)
# triangles: 三角形面片索引,shape为(m, 3)
rr.log("world/terrain_mesh", rr.Mesh3D(
vertex_positions=vertices,
triangle_indices=triangles,
vertex_colors=colors
))
你可以在examples/python/raw_mesh/raw_mesh/main.py中找到完整的网格加载和可视化示例。
等高线生成与可视化
除了三维地形,等高线也是展示地形特征的重要方式。Rerun虽然没有直接提供等高线生成功能,但我们可以结合其他库(如Matplotlib)生成等高线数据,然后在Rerun中进行可视化。
以下是一个生成等高线并在Rerun中显示的示例:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
def generate_contour_lines(points, z_values, levels=20):
"""
从散乱点数据生成等高线
参数:
points: 点的坐标数组,shape为(n, 2)
z_values: 点的高程值数组,shape为(n,)
levels: 等高线的层级数量
返回:
contours: 等高线数据,每个等高线是一个(x, y)坐标数组的列表
"""
# 创建网格
xi = np.linspace(points[:, 0].min(), points[:, 0].max(), 100)
yi = np.linspace(points[:, 1].min(), points[:, 1].max(), 100)
xi, yi = np.meshgrid(xi, yi)
# 插值生成高程网格
zi = griddata(points, z_values, (xi, yi), method='cubic')
# 生成等高线
contours = plt.contour(xi, yi, zi, levels=levels)
# 提取等高线数据
contour_lines = []
for contour in contours.collections:
paths = contour.get_paths()
for path in paths:
contour_lines.append(path.vertices)
return contour_lines
# 在主函数中添加等高线生成和可视化代码
contour_lines = generate_contour_lines(terrain_data[:, :2], terrain_data[:, 2], levels=15)
# 记录等高线数据
for i, line in enumerate(contour_lines):
# 为每个等高线创建一个z坐标数组,使用该等高线的平均高程
z = np.mean(terrain_data[np.argmin(np.linalg.norm(terrain_data[:, :2] - line.mean(axis=0), axis=1)), 2])
line_3d = np.hstack([line, np.full((len(line), 1), z + 0.01)]) # 稍微抬高等高线,避免与地形重叠
rr.log(f"world/contours/contour_{i}", rr.LineStrips3D([line_3d], colors=[[0.0, 0.0, 0.0]]))
在这段代码中,我们使用了scipy库的griddata函数将散乱的点云数据插值成规则网格,然后使用matplotlib的contour函数生成等高线。最后,我们将生成的二维等高线提升到对应的高程位置,转换为三维线条,并在Rerun中进行可视化。
高级功能与交互操作
Rerun提供了丰富的交互功能,可以帮助你更好地探索和分析地形数据。在可视化窗口中,你可以:
- 使用鼠标拖动来旋转视角
- 使用鼠标滚轮缩放视图
- 按住Shift键拖动来平移视图
- 在右侧面板中调整点的大小、颜色映射和透明度
- 使用时间轴控件查看动态数据(如果有的话)
Rerun还支持自定义布局,可以同时显示多个视图,方便进行对比分析。以下是一个自定义布局的示例代码:
import rerun.blueprint as rrb
# 创建一个包含三维视图和二维等高线视图的布局
blueprint = rrb.Vertical(
rrb.Spatial3DView(name="3D Terrain", origin="/world"),
rrb.Spatial2DView(name="2D Contour", origin="/world/terrain"),
row_shares=[2, 1]
)
# 在初始化时应用自定义布局
rr.script_setup(args, "rerun_example_terrain", default_blueprint=blueprint)
这个布局将窗口分为上下两部分,上部分显示三维地形,下部分显示二维等高线视图,方便同时进行三维和二维分析。
完整案例与结果展示
结合以上所有功能,我们可以构建一个完整的地形可视化应用。以下是完整的代码实现:
import rerun as rr
import numpy as np
import matplotlib.cm as cm
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
from pathlib import Path
def load_ply_data(file_path):
"""加载PLY格式的点云数据"""
points = []
with open(file_path, 'r') as f:
lines = f.readlines()
# 找到数据起始行
header_end = 0
for i, line in enumerate(lines):
if line.startswith('end_header'):
header_end = i + 1
break
# 读取点数据
for line in lines[header_end:]:
parts = list(map(float, line.strip().split()))
if len(parts) >= 3:
points.append([parts[0], parts[1], parts[2]])
return np.array(points)
def generate_contour_lines(points, z_values, levels=20):
"""从散乱点数据生成等高线"""
# 创建网格
xi = np.linspace(points[:, 0].min(), points[:, 0].max(), 100)
yi = np.linspace(points[:, 1].min(), points[:, 1].max(), 100)
xi, yi = np.meshgrid(xi, yi)
# 插值生成高程网格
zi = griddata(points, z_values, (xi, yi), method='cubic')
# 生成等高线
contours = plt.contour(xi, yi, zi, levels=levels)
# 提取等高线数据
contour_lines = []
for contour in contours.collections:
paths = contour.get_paths()
for path in paths:
contour_lines.append(path.vertices)
return contour_lines
def main():
# 初始化Rerun
rr.init("terrain_visualization", spawn=True)
# 设置坐标系
rr.log("world", rr.ViewCoordinates.RIGHT_HAND_Z_UP, static=True)
# 加载地形数据
terrain_data = load_ply_data("examples/assets/example.ply")
print(f"Loaded terrain data with {len(terrain_data)} points")
# 对数据进行处理,计算点的颜色(基于高程)
z_values = terrain_data[:, 2]
min_z, max_z = np.min(z_values), np.max(z_values)
norm_z = (z_values - min_z) / (max_z - min_z)
# 使用matplotlib的颜色映射生成点的颜色
cmap = cm.get_cmap('terrain')
colors = cmap(norm_z)[:, :3] # 取RGB通道
# 记录点云数据
rr.log("world/terrain", rr.Points3D(
terrain_data,
colors=colors,
radii=0.05
))
# 生成等高线
contour_lines = generate_contour_lines(terrain_data[:, :2], terrain_data[:, 2], levels=15)
print(f"Generated {len(contour_lines)} contour lines")
# 记录等高线数据
for i, line in enumerate(contour_lines):
# 为每个等高线创建一个z坐标数组,使用该等高线的平均高程
z = np.mean(terrain_data[np.argmin(np.linalg.norm(terrain_data[:, :2] - line.mean(axis=0), axis=1)), 2])
line_3d = np.hstack([line, np.full((len(line), 1), z + 0.01)]) # 稍微抬高等高线,避免与地形重叠
rr.log(f"world/contours/contour_{i}", rr.LineStrips3D([line_3d], colors=[[0.0, 0.0, 0.0]]))
# 保持可视化窗口打开
input("按Enter键退出...")
if __name__ == "__main__":
main()
总结与展望
通过本文的介绍,我们展示了如何使用Rerun从DEM数据生成高质量的三维地形可视化和等高线。我们从环境搭建开始,逐步介绍了数据准备、三维地形可视化、等高线生成等关键步骤,并提供了完整的代码示例。
Rerun作为一个功能强大的可视化工具,在地形数据展示方面具有很大的潜力。未来,我们可以期待Rerun在以下方面进一步提升地形可视化的体验:
- 直接支持更多DEM数据格式,如GeoTIFF
- 内置等高线生成功能,无需依赖外部库
- 添加地形分析功能,如坡度、坡向计算
- 支持地形剖面线的绘制和分析
如果你对Rerun项目感兴趣,可以通过CONTRIBUTING.md了解如何为项目贡献代码和想法。同时,项目的CHANGELOG.md文件记录了最新的功能更新和改进,建议定期查看以了解项目的最新进展。
希望本文能够帮助你快速掌握使用Rerun进行地形可视化的方法。如果你有任何问题或建议,欢迎在项目的GitHub仓库中提交issue或PR,与开发团队和其他用户交流讨论。
最后,如果你觉得本文对你有帮助,请点赞、收藏并关注项目的更新,以便获取更多关于Rerun可视化的实用教程和技巧。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



