ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Osmosis工具高效提取OSM建筑数据全流程

Osmosis工具高效提取OSM建筑数据全流程

1. 项目概述

最近在整理省级建筑数据时,发现Osmosis这个工具确实能大幅提升数据处理效率。作为一个开源的地理数据处理工具链,Osmosis特别适合处理OpenStreetMap(OSM)格式的数据。本文将分享如何用Osmosis从省级PBF文件中提取建筑数据,并转换为标准OSM格式的全流程。

这个方案最大的优势在于:①完全基于命令行操作,适合批量处理;②所有步骤都有现成脚本可以直接复制执行;③特别针对新手优化,避免了常见的环境配置和参数设置问题。我在处理某省全境建筑数据时,用这套方法将原本需要数天的手工操作压缩到了2小时内完成。

2. 环境准备

2.1 JDK安装与配置

Osmosis是基于Java开发的工具,所以首先需要配置Java环境。推荐使用JDK 8或11版本,这两个长期支持版(LTS)的稳定性最好。以下是具体步骤:

  1. 下载JDK安装包(以JDK11为例):
wget https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz
  1. 解压并设置环境变量:
tar -xzf openjdk-11.0.2_linux-x64_bin.tar.gz sudo mv jdk-11.0.2 /usr/local/ echo 'export JAVA_HOME=/usr/local/jdk-11.0.2' >> ~/.bashrc echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc source ~/.bashrc

注意:如果系统已安装其他Java版本,建议先用update-alternatives配置默认Java版本,避免冲突。

验证安装是否成功:

java -version javac -version

2.2 Osmosis安装

推荐直接从官网下载最新稳定版(当前为0.48.3):

wget https://github.com/openstreetmap/osmosis/releases/download/0.48.3/osmosis-0.48.3.tgz tar -xzf osmosis-0.48.3.tgz cd osmosis-0.48.3 chmod a+x bin/osmosis

为了方便使用,可以创建符号链接:

sudo ln -s $(pwd)/bin/osmosis /usr/local/bin/osmosis

测试安装:

osmosis --version

3. 数据准备与处理

3.1 获取省级PBF数据

以江苏省为例,可以从Geofabrik下载最新的PBF数据:

wget http://download.geofabrik.de/asia/china/jiangsu-latest.osm.pbf

提示:如果下载速度慢,可以尝试国内镜像源,如:

wget https://download.openstreetmap.fr/extracts/asia/china/jiangsu-latest.osm.pbf

3.2 建筑数据提取脚本

创建提取脚本extract_buildings.sh

#!/bin/bash INPUT_PBF="jiangsu-latest.osm.pbf" OUTPUT_OSM="jiangsu_buildings.osm" osmosis \ --read-pbf file="$INPUT_PBF" \ --tf accept-nodes building=* \ --tf accept-ways building=* \ --tf accept-relations building=* \ --used-node \ --write-xml file="$OUTPUT_OSM"

给脚本执行权限并运行:

chmod +x extract_buildings.sh ./extract_buildings.sh

参数说明:

  • --read-pbf:指定输入的PBF文件
  • --tf accept-*:过滤条件,只保留带building标签的元素
  • --used-node:确保引用的节点都被保留
  • --write-xml:输出为OSM XML格式

3.3 处理结果验证

检查输出文件:

head -n 20 jiangsu_buildings.osm

应该能看到类似这样的输出:

<?xml version='1.0' encoding='UTF-8'?> <osm version="0.6" generator="Osmosis 0.48.3"> <bounds minlat="30.7450" minlon="116.3750" maxlat="35.3330" maxlon="122.0000"/> <node id="123456" version="1" lat="32.0600" lon="118.7800"/> <way id="789012" version="1"> <nd ref="123456"/> <tag k="building" v="yes"/> </way> </osm>

4. 高级处理技巧

4.1 按行政区划进一步过滤

如果需要提取特定城市的建筑数据,可以先获取该城市的行政边界ID:

osmosis --read-pbf file="jiangsu-latest.osm.pbf" \ --tf accept-relations "admin_level=8" \ --write-xml file="boundaries.osm"

然后在提取脚本中加入边界过滤:

osmosis \ --read-pbf file="$INPUT_PBF" \ --bounding-polygon file="nanjing_boundary.osm" \ --tf accept-nodes building=* \ --tf accept-ways building=* \ --tf accept-relations building=* \ --used-node \ --write-xml file="nanjing_buildings.osm"

4.2 批量处理多个省份

创建批量处理脚本batch_process.sh

#!/bin/bash PROVINCES=("jiangsu" "zhejiang" "shanghai") for province in "${PROVINCES[@]}"; do wget "http://download.geofabrik.de/asia/china/${province}-latest.osm.pbf" osmosis \ --read-pbf file="${province}-latest.osm.pbf" \ --tf accept-nodes building=* \ --tf accept-ways building=* \ --tf accept-relations building=* \ --used-node \ --write-xml file="${province}_buildings.osm" done

4.3 性能优化建议

处理大型PBF文件时,可以调整内存设置:

JAVACMD_OPTIONS="-Xmx8G" osmosis \ --read-pbf file="large_file.osm.pbf" \ ...

对于特别大的省份(如广东),建议分区域处理:

osmosis \ --read-pbf file="guangdong-latest.osm.pbf" \ --bounding-box top=23.5 left=113 bottom=22 right=114 \ --tf accept-nodes building=* \ ...

5. 常见问题解决

5.1 内存不足错误

错误现象:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

解决方案:

  1. 增加JVM内存:
export JAVACMD_OPTIONS="-Xmx8G"
  1. 使用更高效的处理方式:
osmosis \ --read-pbf-fast file="large.pbf" \ ...

5.2 文件编码问题

错误现象:

Error parsing XML

解决方案: 确保使用UTF-8编码:

osmosis \ --read-xml file="input.osm" encoding="UTF-8" \ ...

5.3 版本兼容性问题

如果遇到API版本不匹配:

Unsupported OSM version: 0.7

可以在写入时指定版本:

osmosis \ ... \ --write-xml version="0.6" file="output.osm"

6. 结果应用

6.1 在QGIS中可视化

将生成的OSM文件导入QGIS:

  1. 打开QGIS → 图层 → 添加图层 → 添加矢量图层
  2. 选择生成的OSM文件
  3. 右键图层 → 属性 → 符号化 → 按building标签分类

6.2 转换为GeoJSON

使用osmtogeojson工具转换:

npm install -g osmtogeojson osmtogeojson jiangsu_buildings.osm > jiangsu_buildings.geojson

6.3 导入PostgreSQL/PostGIS

使用osm2pgsql工具:

osm2pgsql -c -d gis -U postgres -H localhost jiangsu_buildings.osm

7. 完整自动化脚本

以下是整合所有步骤的完整脚本auto_extract.sh

#!/bin/bash # 参数检查 if [ $# -ne 1 ]; then echo "用法: $0 <省份英文名>" echo "示例: $0 jiangsu" exit 1 fi PROVINCE=$1 PBF_URL="http://download.geofabrik.de/asia/china/${PROVINCE}-latest.osm.pbf" OUTPUT_FILE="${PROVINCE}_buildings.osm" echo "开始处理 ${PROVINCE} 数据..." # 下载数据 echo "正在下载PBF文件..." wget -q "$PBF_URL" -O "${PROVINCE}-latest.osm.pbf" # 提取建筑数据 echo "正在提取建筑数据..." JAVACMD_OPTIONS="-Xmx4G" osmosis \ --read-pbf file="${PROVINCE}-latest.osm.pbf" \ --tf accept-nodes building=* \ --tf accept-ways building=* \ --tf accept-relations building=* \ --used-node \ --write-xml file="$OUTPUT_FILE" # 结果统计 BUILDINGS_COUNT=$(grep -c '<way' "$OUTPUT_FILE") NODES_COUNT=$(grep -c '<node' "$OUTPUT_FILE") echo "处理完成!" echo "输出文件: $OUTPUT_FILE" echo "建筑数量: $BUILDINGS_COUNT" echo "节点数量: $NODES_COUNT"

使用方式:

chmod +x auto_extract.sh ./auto_extract.sh jiangsu
返回列表