news 2026/8/7 22:57:44

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/7 22:54:18

如何用ESP32-C6和MCP协议打造你的AI语音助手:从零到一完整指南

如何用ESP32-C6和MCP协议打造你的AI语音助手&#xff1a;从零到一完整指南 【免费下载链接】xiaozhi-esp32 An MCP-based chatbot | 一个基于MCP的聊天机器人 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32 还在寻找一个既强大又易用的AI语音助手方…

作者头像 李华
网站建设 2026/8/7 22:50:51

如何快速上手AaronLocker:5分钟构建企业级应用白名单策略

如何快速上手AaronLocker&#xff1a;5分钟构建企业级应用白名单策略 【免费下载链接】AaronLocker Robust and practical application control for Windows 项目地址: https://gitcode.com/gh_mirrors/aa/AaronLocker AaronLocker是一款强大的Windows应用控制工具&…

作者头像 李华
网站建设 2026/8/7 22:47:50

2026年pdf转换器免费版哪个好?电脑网页端7款PDF格式转换工具实测盘点

去年八月底那会儿&#xff0c;我刚入职新部门&#xff0c;连着好几天都在跟一堆投标材料死磕。好不容易把方案写完&#xff0c;甲方突然发来一份旧版合同的 PDF&#xff0c;要求按新模板把关键条款重新整理进去。我打开文件夹那一刻就有点懵——扫描件&#xff0c;好几十页&…

作者头像 李华
网站建设 2026/8/7 22:39:43

【C++面向对象】模板进阶用法

目录绪言实例化显式实例化隐式实例化特化全特化类模板全特化函数模板全特化偏特化多个模板参数缺省的模板参数带参数包的类型参数非类型模板参数绪言 模板是泛型编程实现的重要手段。关于模板的基本用法&#xff0c;可以看我的这篇文章&#xff0c;这里不再过多地赘述。本篇文…

作者头像 李华
网站建设 2026/8/7 22:37:01

Akagi智能麻将AI分析工具:从新手到高手的完整实战指南

Akagi智能麻将AI分析工具&#xff1a;从新手到高手的完整实战指南 【免费下载链接】Akagi 支持雀魂、天鳳、麻雀一番街、天月麻將&#xff0c;能夠使用自定義的AI模型實時分析對局並給出建議&#xff0c;內建Mortal AI作為示例。 Supports Majsoul, Tenhou, Riichi City, Amats…

作者头像 李华