使用Phyghtmap为OpenStreetMap添加 DEM 高程图层
玩OSM很久了,今天准备为自己的ArchOSM服务器添加NASA的SRTM图层。我们这就来弄。数字高程数据(DEM)一般来自大地遥感卫星,NASA官网有免费的开源数字高程数据可以利用。DEM是对地表栅格化后采样测量的海拔值,转换为地图,还要经过几步。
- 第一步,获取DEM数据并转化为OSM使用的xml或PBF格式文件
- 第二步,为osm2pgsql指定style与数据库,导入PBF文件
- 第三步,嵌入DEM图层到Mapnik的样式表
- 第四步, 重新渲染瓦片
经过下面四步,我们可以得到类似这样的显示效果
下面我们开始做喽!
1. 从DEM到PBF
1.1 到 NASA网站注册一个账号
NASA的数字高程网站在https://urs.earthdata.nasa.gov/home/, 要首先注册一个账号,才能下载数字高程影像。当然,需要填写用户、口令。
1.2 安装 phyghtmap
Phyghtmap 是一款傻瓜化的 DEM到PBF转换软件,傻瓜到给定经纬度范围,就能产生PBF。这里,我们使用万能的ArchLinux yaourt 进行傻瓜安装(越老越爱ArchLinux了)。
yaourt -S phyghtmap
一顿默认yes后,就搞定了。
1.3 下载并转换数据
而后,测试一下下载效果,以上海周边为例子(经度119133,纬度3032)。
如果是首次运行,指定1.1里申请的用户、口令(XXXXXXX)。后面就不用了,会在当前文件夹产生文件
.phyghtmaprc
里面保存了口令。
phyghtmap -a 119:30:133:32 --earthdata-user xxxxxx --earthdata-password "xxxxxx" --source=view3 --pbf --max-nodes-per-tile 0
上面的参数:
–source=view3是说采用较新整合的全球dem数据源,否则很多非北美的数据木有哦!
–max-nodes-per-tile 0 是要求他捣鼓一个单一的PBF文件出来,而不是一堆。
具体很多参数的含义可以参考官方网站。执行命令下载、计算后,一个PBF文件就生成啦!这里是名字:
shanghai_lon119.00_133.00lat30.00_32.00_view3.osm.pbf
2.导入DEM到PostgreSQL
这里我们用生成的PBF,配合osm2pgsql,导入到新建的数据库 contours 里。osm2pgsql导入时需要 style文件,以便于知道该过滤PBF中的哪些要素。这个 style文件是这样的,可以参考网站或者直接用下面这个contour.style:
# OsmType Tag DataType Flags
node,way contour text linearway contour_ext text linearway ele text linear
而后执行osm2pgsql
osm2pgsql -c -s -S"./contour.style" -C32000 -dcontours ./shanghai_lon119.00_133.00lat30.00_32.00_view3.osm.pbf
导入后,进入数据库 contours,可以看到已经有数据了:
3. 向MapNik里添加图层
我们的ArchLinux服务器采用openstreetmap_carto 分支 3.0.x 作为风格工程。签出这个分支后,依照这个网站的指示一步步添加图层。注意了,因为该网站似乎有些技术延迟,我会把自己使用的方法在下面重新复述一遍。
3.1 建立 contour.mss 风格文件
这个文件将作为主工程的一部分被包含,内容如下:
@contour-below: #886A08;
@contour-lowland: #0B3B0B;
@contour-highland: #3B240B;
@contour-veryhigh: #0B3B39;#contours-minor {line-width: 0.2;[elevation < 0] {line-color: @contour-below;}[elevation > 0][elevation < 2000] {line-color: @contour-lowland;}[elevation >= 2000][elevation < 5000] {line-color: @contour-highland;}[elevation >= 5000] {line-color: @contour-veryhigh;}
}
#contours-medium {line-width: 0.4;[elevation < 0] {line-color: @contour-below;}[elevation > 0][elevation < 2000] {line-color: @contour-lowland;}[elevation >= 2000][elevation < 5000] {line-color: @contour-highland;}[elevation >= 5000] {line-color: @contour-veryhigh;}
}
#contours-major {line-width: 0.6;[elevation < 0] {line-color: @contour-below;}[elevation > 0][elevation < 2000] {line-color: @contour-lowland;}[elevation >= 2000][elevation < 5000] {line-color: @contour-highland;}[elevation >= 5000] {line-color: @contour-veryhigh;}
}#contours-medium-text {text-name: "[ele]";text-face-name: @book-fonts;text-placement: line;text-spacing: 500;text-size: 7;text-fill: #FF0000;[elevation < 0] {text-fill: @contour-below;}[elevation > 0][elevation < 2000] {text-fill: @contour-lowland;}[elevation >= 2000][elevation < 5000] {text-fill: @contour-highland;}[elevation >= 5000] {text-fill: @contour-veryhigh;}
}
#contours-major-text {text-name: "[ele]";text-face-name: @book-fonts;text-placement: line;text-spacing: 1000;text-size: 8;text-fill: #FF0000;[elevation < 0] {text-fill: @contour-below;}[elevation > 0][elevation < 2000] {text-fill: @contour-lowland;}[elevation >= 2000][elevation < 5000] {text-fill: @contour-highland;}[elevation >= 5000] {text-fill: @contour-veryhigh;}
}
把这个文件放在与project.mml相同的文件夹下。
3.2 植入style与图层
打开project.mml,备份好,而后开改!
3.2.1 加入数据库入口
首先,加入数据库入口。找到_parts块,加入前:
osm2pgsql: &osm2pgsqltype: "postgis"dbname: "gis"key_field: ""geometry_field: "way"extent: "-20037508,-20037508,20037508,20037508"
加入后:
osm2pgsql: &osm2pgsqltype: "postgis"dbname: "gis"key_field: ""geometry_field: "way"extent: "-20037508,-20037508,20037508,20037508"contour: &contourtype: "postgis"dbname: "contours"key_field: ""geometry_field: "way"extent: "-20037508,-20037508,20037508,20037508"
3.2.2 引用样式并粘贴图层
在入口 Stylesheet里把3.1中新建的contour.mms引用进来。
Stylesheet:...- "contour.mss"...
而后,跑到文件末尾,粘贴图层:
- id: "contours-minor"name: "contours-minor"class: ""geometry: "linestring"<<: *extentsDatasource:<<: *contourtable: |-(SELECTway,CAST (ele AS INTEGER) AS elevation,eleFROM planet_osm_lineWHERE contour_ext='elevation_minor') AS contours_minorproperties:minzoom: 14advanced: {}- id: "contours-medium"name: "contours-medium"class: ""geometry: "linestring"<<: *extentsDatasource:<<: *contourtable: |-(SELECTway,CAST (ele AS INTEGER) AS elevation,eleFROM planet_osm_lineWHERE contour_ext='elevation_medium') AS contours_mediumproperties:minzoom: 12advanced: {}- id: "contours-major"name: "contours-major"class: ""geometry: "linestring"<<: *extentsDatasource:<<: *contourtable: |-(SELECTway,CAST (ele AS INTEGER) AS elevation,eleFROM planet_osm_lineWHERE contour_ext='elevation_major' AND ele != '0') AS contours_majorproperties:minzoom: 9advanced: {}- id: "contours-medium-text"name: "contours-medium-text"class: ""geometry: "linestring"<<: *extentsDatasource:<<: *contourtable: |-(SELECTway,CAST (ele AS INTEGER) AS elevation,eleFROM planet_osm_lineWHERE contour_ext='elevation_medium') AS contours_medium_textproperties:minzoom: 13advanced: {}- id: "contours-major-text"name: "contours-major-text"class: ""geometry: "linestring"<<: *extentsDatasource:<<: *contourtable: |-(SELECTway,CAST (ele AS INTEGER) AS elevation,eleFROM planet_osm_lineWHERE contour_ext='elevation_major' AND ele != '0') AS contours_major_textproperties:minzoom: 9advanced: {}
要特别注意各部分的缩进与文档相同级别的缩进一致。楼主因为一开始少了一个空格(图层的id行缩进为2空格)折腾的要死。
3.3 编译样式表
我们用 node.js的工具 cartocss编译project.mml为mapnik.xml
如果没有安装,要使用 npm 傻瓜安装
npm install cartocss
当然,这玩意有依赖,根据错误提示,把依赖安装完了就ok了。而后编译:
carto project.mml > mapnik.xml
生成的 mapnik.xml 就可以直接被renderd使用了。
4 测试
在导入了高程后,刷新时戳
sudo touch /var/lib/mod_tile/planet-import-complete
重启服务后,渲染瓦片
render_old
好啦!成功了!
后续会试试看全球的高程到底会吃掉多少磁盘空间(-:<
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
