✍️ 刘珠妹 , 陈箫翰 • 📅 2024-12-26

# 绘制三维地形图

视频讲解: https://www.bilibili.com/video/BV1Xh411e7fi/

绘制三维地形图的核心是 grdview 模块以及 -JZ 选项。 使用 -JZ 选项设置 Z 方向上的缩放比例，同时也必须在 -R 选项中设置 Z 方向上的最小值和最大值。 此外，-p 选项用于设置三维观察的视角。

本例将展示如何绘制三维起伏地形图，并叠加卫星图像图层与地震断层图层，用于对比研究。 请点击观看视频学习代码的详细讲解。

示例中使用到的数据包括：

- `@earth_relief_06m`：earth_relief

- `@earth_day_06m`：earth_day & earth_night

- `CN-faults.gmt`：CN-faults: 中国断层数据

下面的绘图脚本将三维地形、卫星图片以及断层线绘制在不同高度：

    #!/usr/bin/env bash
    # 将三维地形、卫星图片以及断层线绘制在不同高度

    gmt begin 3D_earth_relief_1
        gmt set MAP_FRAME_TYPE plain
        # 1. 绘制地形图形，图层默认位于 z 轴底部（此例中即 -1000 的高度）
        gmt grdview @earth_relief_06m_p -R101/108/35/42/-1000/20000 -JM10c -JZ10c -N-1000+ggray -Qs -Cgeo -I+d -Ba -BwsENZ -p60/25
        gmt colorbar -C -Ba -DJTC+o0/1c -p

        # 2. 绘制断层线图层，-p 设置图层抬高到10000
        gmt plot CN-faults.gmt -W2p,brown -p60/25/10000 -Ba -BWSen
        gmt basemap -TdjLT+w1.5c+l+o1c -p

        # 3. 绘制卫星图片图层，-p 设置图层抬高到20000
        gmt grdimage @earth_day_06m_p -p60/25/20000 -Ba -BWSen
    gmt end show

下面的脚本将卫星图片和断层线直接绘制在三维地形上:

    #!/usr/bin/env bash
    # 将卫星图片和断层线直接绘制在三维地形上

    gmt begin 3D_earth_relief_2
        gmt set MAP_FRAME_TYPE plain
        # 预处理1：生成断层的三维采样，输出数据为断层的经度、纬度以及对应的地形高程
        # 断层数据有第三列深度，所以grdtrack默认会将高程输出到第4列，因此需要使用 -o0,1,3 让第三列输出为高程。
        gmt grdtrack -R101/108/35/42 -G@earth_relief_06m_p CN-faults.gmt -o0,1,3 > faults.xyz

        # 绘制卫星图片，-G 表示在 DEM 上贴卫星图片
        gmt grdview @earth_relief_06m_p -R101/108/35/42/-1000/5000 -JM10c -JZ4c -N-1000+ggray -G@earth_day_06m_p -Qi -Ba -Bz -BwsENZ -p60/25
        # 绘制断层线
        gmt plot3d faults.xyz -W1p,brown -p
        # 绘制指北针
        gmt basemap -TdjLT+w1.5c+l+o1c -p60/25/2000

        rm faults.xyz
    gmt end show

除了 GMT 自带的卫星图像数据以外，读者还可以使用开源工具导出精度更高的谷歌卫星图像，并用于 GMT 绘图。 导出方法可以参考 以地图和卫星图为底图 。 在下面的例子中，grdview 模块将合肥地区卫星图像 `Hefei.tiff` 叠加在三维地形图上， 绘制出了清晰度更高的图片。卫星图像适用于作图范围较小的情况。

    gmt begin Hefei jpg E600
        gmt grdview @earth_relief_30s -R117/118/31.4/32/0/2000 -JM10c -JZ2c -Qi600 -GHefei.tiff -p135/15 -Baf
    gmt end