# 什么是 SRTM 高程文件

  • 由美国太空总署(NASA)和国防部国家测绘局(NIMA)联合测量。2000 年 2 月 11 日,美国发射的“奋进”号航天飞机上搭载 SRTM 系统,共计进行了 222 小时 23 分钟的数据采集工作,获取北纬 60 度至南纬 60 度之间总面积超过 1.19 亿平方公里的雷达影像数据,覆盖地球 80%以上的陆地表面。 SRTM 系统获取的雷达影像的数据量约 9.8 万亿字节,经过两年多的数据处理,制成了数字地形高程模型(DEM),即现在的 SRTM 地形产品数据。此数据产品 2003 年开始公开发布,经历多修订,目前的数据修订版本为 V4.1 版本。该版本由 CIAT(国际热带农业中心)利用新的插值算法得到的 SRTM 地形数据,此方法更好的填补了 SRTM 90 的数据空洞。插值算法来自于 Reuter et al.(2007) SRTM 地形数据按精度可以分为 SRTM1 和 SRTM3,分别对应的分辨率精度为 30 米和 90 米数据(目前公开数据为 90 米分辨率的数据)

  • 数据组织方式:每 5 度经纬度方格划分一个文件,共分为 24 行(-60 至 60 度)和 72 列(-180 至 180 度)。文件命名规则为 srtm_XX_YY.zip,XX 表示列数(01-72),YY 表示行数(01-24)

# SRTM 90m 高程文件下载

  • http://www.gscloud.cn/sources/accessdata/306?pid=302
  • https://blog.csdn.net/qq_32649321/article/details/115298561
  • https://srtm.csi.cgiar.org/srtmdata/ (推荐)
  • http://arctiler.com/datacenter/index.html#terrain

在页面上一个个选中下载较为低效,所以写了一段 nodejs 来批量下载,代码如下:

const prefix = 'https://srtm.csi.cgiar.org/wp-content/uploads/files/srtm_5x5/TIFF/';
const startTime = new Date().getTime();

async function run() {
  for (let i = 0, len = names.length, count = 0; i < len; i++) {
    const fileName = names[i];
    const filePath = path.resolve('./data', fileName);

    if (fs.existsSync(filePath)) {
      console.log(`${fileName}已存在,跳过`);
      continue;
    }

    const writer = fs.createWriteStream(filePath);
    const response = await axios.get(`${prefix}${fileName}`, {responseType: 'stream'});

    console.log(
      `正在下载${fileName}, 进度${i + 1} / ${len}, 预计时间${(((new Date().getTime() - startTime) / count) *
        (len - i - 1)) /
        1000 /
        60}分钟`
    );

    response.data.pipe(writer);

    await new Promise((resolve, reject) => {
      writer.on('finish', () => {
        count += 1;
        resolve();
      });
      writer.on('error', reject);
    });
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

其实所需要下载的 names 数组可以从页面 https://srtm.csi.cgiar.org/wp-content/themes/srtm_theme/json/srtm30_5x5.json 接口中提取。

# 获取全国的 srtm 数据

最东端:东经 135 度 2 分 30 秒 64 最西端:东经 73 度 40 分 51 最北端:北纬 53 度 33 分 2 最南端:北纬 3 度 52 分 12

根据中国四个方向的最值,不难计算出对应的行和列信息,然后生成需要下载的文件名即可

const fs = require('fs');
const west = 51;
const east = 64;
const north = 2;
const sourth = 12;

for (let i = west; i <= east; i++) {
  for (let j = north; j <= sourth; j++) {
    const name = `${i}_${`${j}`.padStart(2, '0')}`;

    if (fs.existsSync(`./data/srtm_${name}.tif`)) {
      console.log(`copy file ${name}`);
      fs.copyFileSync(`./data/srtm_${name}.tif`, `./china/srtm_${name}.tif`);
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Last Updated: 2021/12/21 15:31:25