个性化地图渲染切片实战(6):导入 OSM 数据

在《个性化地图渲染切片实战(5):下载与裁剪 OSM 数据》一文中,为你准备了经过检查的成都 PBF 文件。

本文从能够运行 mapc 容器的 Ubuntu 宿主机开始,使用 osm2pgsql 把成都 OSM 数据导入 osm_db 数据库。

即使只具备本文起始条件,只要已准备同名 PBF、mapc 容器和 osm_db 数据库,也可以按照本文流程独立操作。

PostgreSQL 数据库准备

(1)确认本文起始状态

本文从 Ubuntu 宿主机开始,Docker 容器名称为 mapc,数据库为 osm_db,数据库角色为 root。

已准备的 chengdu-latest.osm.pbf 已经通过文件信息和引用完整性检查。

sudo docker ps --filter name=^/mapc$test -s chengdu-latest.osm.pbf && echo "host PBF ready"

图片

确认容器与宿主机 PBF

第一条命令应能看到 mapc 处于运行状态,第二条命令应输出 host PBF ready,任何一项失败都要先返回环境或文件检查。

(2)把成都 PBF 复制到容器

先在容器中建立统一数据目录,再把宿主机上的成都 PBF 复制进去,避免导入命令引用容器无法访问的宿主机路径。

sudo docker exec mapc mkdir -p /home/pbf_datasudo docker cp chengdu-latest.osm.pbf mapc:/home/pbf_data/chengdu-latest.osm.pbfsudo docker exec mapc test -s /home/pbf_data/chengdu-latest.osm.pbf && echo "container PBF ready"

图片

复制并检查成都 PBF

最后一条命令应输出 container PBF ready,表示容器内文件存在且不为空,随后才能继续检查导入工具。

(3)检查 osm2pgsql 与数据库

容器需要能够调用 osm2pgsql 和 psql,并且 osm_db 应允许 root 角色连接和创建导入表。​​​​​​​

sudo docker exec mapc osm2pgsql --versionsudo docker exec mapc psql -U root -d osm_db -c "SELECT current_database(), current_user"

图片

检查导入工具与数据库连接

版本信息和数据库查询都能正常返回,才说明容器中的导入程序、PostgreSQL 服务与连接角色处于可用状态。

(4)检查 PostGIS 与 hstore

osm2pgsql 必须使用 PostgreSQL 和 PostGIS,本文还启用 hstore 保存默认样式未单独建列的 OSM 标签。​​​​​​​

sudo docker exec mapc psql -U root -d osm_db -c "CREATE EXTENSION IF NOT EXISTS postgis"sudo docker exec mapc psql -U root -d osm_db -c "CREATE EXTENSION IF NOT EXISTS hstore"sudo docker exec mapc psql -U root -d osm_db -c "SELECT extname, extversion FROM pg_extension WHERE extname IN ('postgis','hstore') ORDER BY extname"

图片

检查 PostGIS 与 hstore

最后的查询应同时返回 postgis 和 hstore,如果创建扩展时报权限错误,需要由数据库管理员完成一次初始化。

osm2pgsql 导入

(1)为什么使用 pgsql 输出

当前系列沿用适合 Mapnik 渲染的经典表结构,因此本文显式选择 pgsql 输出,并使用独立前缀避免覆盖已有表。

osm2pgsql 官方已把 pgsql 标记为弃用,新项目应评估 flex 输出,但本文为了与既有渲染环境保持一致继续使用经典结构。

(2)执行首次导入

确认目标前缀尚未使用后,在 Ubuntu 宿主机执行下面的命令,让 osm2pgsql 在 mapc 容器内读取成都 PBF 文件。

sudo docker exec -it mapc osm2pgsql --create --slim --hstore --output=pgsql --database=osm_db --username=root --prefix=chengdu_osm /home/pbf_data/chengdu-latest.osm.pbf

图片

导入成都 OSM 数据

终端会依次显示读取节点、道路和关系的进度,并在结束阶段创建表与索引,正常完成后应返回命令提示符。

如果当前数据库连接要求密码,可以在命令中加入 --password 触发安全提示,不要把真实密码直接写在命令行中。

(3)观察导入结束信息

导入时间取决于 PBF 大小、磁盘速度、内存和 PostgreSQL 配置,不能把另一台计算机的耗时当作固定标准。

只有进程正常结束并且后续查询能够读取表与几何数据,才表示导入成功,单独看到进度达到百分之百并不充分。

导入参数

(1)--create

--create 表示执行首次导入,并创建新的中间表和输出表,如果相同前缀已经存在,命令会因对象冲突而失败。

(2)--slim

--slim 把中间数据存入数据库,能够降低大数据导入时的内存压力,也是以后执行增量更新所需要的模式。

(3)--hstore

--hstore 会把默认样式没有单独建列的标签写入 tags 字段,便于后续查询名称变体和其他扩展属性。

(4)--output=pgsql

pgsql 输出会生成固定的点、线、道路和面表,适合现有渲染样式直接查询,但长期项目应规划向 flex 迁移。

(5)数据库与用户参数

--database=osm_db 指定目标数据库,--username=root 指定连接角色,二者必须与容器初始化时的真实配置一致。

(6)--prefix=chengdu_osm

独立前缀会生成 chengdu_osm_point、chengdu_osm_line、chengdu_osm_roads 和 chengdu_osm_polygon 等表。

(7)输入文件路径

/home/pbf_data/chengdu-latest.osm.pbf 是容器内部路径,不能直接替换为只有宿主机能够访问的文件位置。

参数理解清楚以后再执行导入,可以避免把表名、数据库、输出方式或输入路径错误混入后续渲染配置。

导入结果检查

(1)确认输出表已经创建

sudo docker exec mapc psql -U root -d osm_db -c "\dt chengdu_osm*"

图片

查看成都 OSM 数据表

结果中应出现以 chengdu_osm 开头的点、线、道路和面表,同时还会保留 slim 模式需要的中间表。

(2)统计四类要素数量

sudo docker exec mapc psql -U root -d osm_db -c "SELECT 'point' AS layer, COUNT(*) FROM chengdu_osm_point UNION ALL SELECT 'line', COUNT(*) FROM chengdu_osm_line UNION ALL SELECT 'roads', COUNT(*) FROM chengdu_osm_roads UNION ALL SELECT 'polygon', COUNT(*) FROM chengdu_osm_polygon"

图片

统计成都 OSM 要素数量

四张表应能够正常查询,成都数据通常会在点、线和面表中得到大于零的记录,具体数量随 PBF 更新时间变化。

(3)检查几何坐标系

sudo docker exec mapc psql -U root -d osm_db -c "SELECT Find_SRID('public','chengdu_osm_polygon','way') AS srid"

图片

检查导入几何坐标系

pgsql 输出默认使用 Web Mercator,查询通常应返回 3857,如果结果不同,需要同步检查导入参数和后续渲染样式。

(4)抽查建筑属性与几何

sudo docker exec mapc psql -U root -d osm_db -c "SELECT name, building, ST_GeometryType(way) AS geometry_type FROM chengdu_osm_polygon WHERE building IS NOT NULL LIMIT 5"

图片

抽查成都建筑属性

查询应返回建筑标签和面几何类型,名称字段允许为空,因为 OpenStreetMap 中并非每个建筑都具有名称。

(5)完成最终成功验证

sudo docker exec mapc psql -U root -d osm_db -tAc "SELECT CASE WHEN COUNT(*) > 0 THEN 'chengdu OSM import ready' ELSE 'import failed' END FROM chengdu_osm_line"

图片

完成 OSM 导入验证

终端输出 chengdu OSM import ready,并且表、数量、坐标系和样例查询全部通过,才表示本文导入闭环完成。

常见问题与处理方法

(1)提示输入文件不存在

应重新检查 docker cp 的目标路径,并在容器内执行 test -s,不能只确认宿主机上存在同名文件。

(2)提示数据库认证失败

应核对 osm_db 和 root 是否与当前容器一致,确需密码时使用 --password 或受权限保护的 pgpass 文件。

(3)提示表已经存在

不要直接删除不明表,可以改用新的前缀重新导入,或先确认旧表无业务依赖后再由管理员处理。

(4)导入过程被系统终止

应检查磁盘空间、容器内存和 PostgreSQL 日志,并根据设备条件调整缓存,不能反复执行同一条命令掩盖资源不足。

把文件、数据库、扩展、导入和查询逐步验证,可以把一次长命令拆成多个能够定位问题的检查节点。

个性化地图渲染切片实战系列教程

学习一款软件或者技术,最好能够成体系,从基础操作到实战应用,逐步构建完整知识框架,避免碎片化学习导致效率低下。

为了方便你了解个性化地图渲染切片实战往期内容,这里列出相关文档。

个性化地图渲染切片实战:课程简介

个性化地图渲染切片实战(1):环境安装与镜像恢复

个性化地图渲染切片实战(2):初始化渲染环境

个性化地图渲染切片实战(3):加载基础级别地图

个性化地图渲染切片实战(4):导入基础级别地图数据

个性化地图渲染切片实战(5):下载与裁剪 OSM 数据

为了便于学习和测试,我们已经准备了与本系列教程配套的 Docker 镜像,导入并创建容器后,即可继续进行后续的地图数据处理与渲染操作。

相关资源已经上传至网盘,下载地址放在“水经注GIS圈”知识星球中。

扫描下方二维码加入“水经注GIS圈”,即可获取本系列教程配套资源及更多优质 GIS 数据。

图片

写在最后

本章完成成都 PBF 的容器内检查、PostGIS 与 hstore 准备、osm2pgsql 导入和数据库查询验证,最终形成可供后续样式配置与地图渲染使用的 OSM 数据表。

如果你也对个性化地图渲染感兴趣,请关注“水经注GIS”公众号,并在后台回复“人工客服”进群交流。

你还可以立即点击“分享”按钮,将本文分享给你希望渲染个性化地图的朋友!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值