# 什么是 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);
});
}
}
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`);
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16