3种获取OpenStreetMap数据的方法【OSM】
OpenStreetMap 是每个人都可以编辑的世界地图。 这意味着你可以纠正错误、添加新地点,甚至自己为地图做出贡献! 这是一个社区驱动的项目,拥有数百万注册用户。 这是一个社区驱动的项目,旨在在开放许可下向每个人提供所有地理数据。
OpenStreetMap 数据是最新、最详细的可用空间数据库。 因此,OSM 已成为希望在其应用程序和网站中使用地图数据的开发人员的流行资源。 但是,将 OpenStreetMap 数据转换为 OSM 对象并在项目中使用它需要经验和特定知识。
在本文中,我们将介绍获取 OpenStreetMap 数据的基础知识以及三种获取OSM数据的方法。

推荐:用 NSDT编辑器 快速搭建可编程3D场景
0、OpenStreetMap 数据结构
在讨论提取数据和查询示例之前,让我们先看看 OpenStreetMap 数据结构,因为需要这些知识来更好地理解查询示例。
OSM 数据库中的每个对象都分配有与其表关联的类型。 对象分为三种类型:节点、路径和关系。 每种对象都有唯一的 ID。 所以OSM中的每个对象都有一个ID和类型。 例如, osm_type=“way” 和 osm_id=67104773。
此外,每个对象可能具有描述其属性的标签,例如地址、开放时间、设施类型、颜色、参考文献、维基百科页面或其他信息。
0.1 节点
节点(Node)是具有位置(坐标)的对象。 节点可以代表邮箱、树、地铁入口、市中心、建筑物编号等。

节点可以是独立的,也可以是关系的一部分。 例如,地铁入口可以是地铁站的一部分。
0.2 路线
路线(way)是一条线或多边形,例如街道、河流、建筑物或边界。

与节点类似,路线可以是独立的,也可以是关系的一部分。 通常,街道和河流由一组方式表示,因此每个部分都可以有自己的标签,例如速度限制、车道数量、表面等。
0.3 关系
关系(relation)是描述世界上某些结构的节点、道路和可能的其他关系的组,例如,关系“自行车道”描述了道路旁边的自行车道的结构。

关系也可以有标签 - 这些通常称为“关系上的标签”,因为它们直接应用于关系,而不是像节点或路径标签这样的单个成员。
0.4 标签
OSM 数据库中的每个对象都可能有一组描述该对象的特征和属性的标签(tag)。 以下是如何标记建筑物的示例:
- Building=yes(这告诉我们这是一座建筑物)
- name=Old Marylebone Town Hall(这是建筑物的名称)
- operator=Westminster City Council(这告诉我们谁在运营这座大楼)
- addr:street=Marylebone Road(这告诉我们可以在哪里找到这座建筑)
OpenStreetMap (OSM) 社区努力创建一种保持标签平衡且易于理解的方法。 文档门户解释了标签。
该文档不仅解释了每个标签的作用,还解释了为什么它会这样做,以便当你在网络上查看地图或使用根据 OSM 数据构建的应用程序时,可以了解正在查看的内容并拥有你的位置或路线的一些背景信息。
OSM 社区还创建了一系列用于在地图上标记道路和其他要素的指南。 这些指南在 OSM 行话中称为“风格指南”,它们解释了如何标记不同类型的事物,以便您的数据与其他人的数据保持一致。 风格指南非常重要,因为它有助于确保所有使用 OSM 数据的地图看起来都一样!
让我们看一下如何从 OSM 项目检索数据并使用它来构建新应用程序:
1、使用原始OSM 数据快照
原始 OpenStreetMap 文件使用基于 XML 的格式。 XML 格式旨在添加有关节点、路径和关系的新信息,并跟踪对地图所做的更改。
最适合数据读取的替代格式由第三方工具和提取器生成。
以下是获取 OSM 原始数据的一些最流行的方法:
1.1 通过 Planet OSM 网站
Planet OSM 提供 OSM 数据的每周快照。 它包含当时 OSM 中的所有对象。
可以使用第三方工具将文件转换为不同的格式或数据库。 例如,Osm2pgsql 允许你将数据导入到 Postgis 数据库。
从数据库中获取数据后,你可以使用 SQL 查询来处理它。 例如,此查询提取法国巴黎特定视图框中的所有餐馆:
with filterGeom as (select ST_Transform(ST_SetSRID(st_geomfromgeojson('{"type":"Polygon","coordinates":[[[2.2795, 48.8810], [2.4142, 48.8810], [2.4142, 48.8325], [2.2795, 48.8325], [2.2795, 48.8810]]]}'), 4326), 3857) as w)
(select
pop.osm_id,
pop.tags,
'node' as osm_type,
ST_AsGeoJSON(st_transform(way, 4326))::jsonb as geojson
from planet_osm_point pop, filterGeom
where pop.amenity = 'restaurant' and ST_Intersects(way, filtergeom.w))
union all
(select
pol.osm_id,
pol.tags,
'polygon' as osm_type,
ST_AsGeoJSON(st_transform(way, 4326))::jsonb as geojson
from planet_osm_polygon pol, filterGeom
where pol.amenity = 'restaurant' and ST_Intersects(way, filtergeom.w))
请注意,一些餐厅被映射为节点 ( planet_osm_point),而另一些餐厅则被映射为路径 ( planet_osm_polygon)。 所以你必须从2个表中查询。
1.2 通过 Geofabrik 网站
Geofabrik 以 PBF 格式提供各大洲的每日 OSM 数据提取。 数据已从元数据(个人数据、用户 ID、变更集)中清除。 因此你可以使用它而无需担心数据保护法规。
1.3 通过 BBBike 网站
BBBike 提供按城市和地区划分的 OSM 摘录。 提取内容只有 2-50 MB 大,你可以选择 PBF、XML、形状文件、矢量地图图块等数据格式。
2、使用Overpass API 作为 OSM API
Overpass API 允许你按条件查询 OpenStreetMap 数据。 它针对读取数据进行了优化,可以使用 Overpass QL(或 Overpass XML 作为替代方案)来编写查询,也可以在 Overpass QL 文档页面上找到查询示例。
你可以使用 Overpass Turbo 交互式工具运行小型查询并测试你的请求。 Overpass Turbo 交互式允许你在实时地图上测试请求。 通过简单直观的界面,你可以轻松搜索地址、使用标签、编辑对象或只是玩地图。
下面是一个查询示例,它与上一节中的示例执行相同的工作 - 查询巴黎餐馆:
nw[amenity=restaurant](48.8330,2.2792,48.8800,2.4140);
out;
请注意,你可以在一个请求中查询多个表中的数据。 要从一张表中获取信息,请使用 node、rel和way。 要同时查询多个表中的数据,请使用nw、 nwr、wr或nr。
有一个可用的开放 Overpass API 实例列表,可以免费使用。 但是,它们的使用有限制,因此你不能在应用程序中将它们用于生产目的。
然而,值得注意的是,即使 Overpass API 非常适合小型和简单的查询,但它并不是更复杂的查询的最佳选择。
3、使用Geoapify API获取 OSM 数据
Geoapify Places API 可以轻松地将 OpenStreetMap (OSM) 数据获取到你的项目中。 例如,如果想要有关特定区域的餐馆的信息,你只需指定所需地点的类别以及搜索和运行 HTTP 请求的区域即可。
以下是获取巴黎餐厅的 URL(在 MyProjects Geoapify 上注册并获取 API 密钥):
https://api.geoapify.com/v2/places?categories=catering.restaurant&filter=rect:2.2792,48.8330,2.4140,48.8800&limit=100&apiKey=YOUR_API_KEY
你不需要使用 Places API 来操作节点、路径和关系。 我们已经为你做好了! 此外,Places API 包含经过处理和检查的数据,因此你不必处理在开放数据中可能发现的磨损情况或错误。
以下是如何在 JS 应用程序中运行查询的示例:
fetch('https://api.geoapify.com/v2/places?categories=catering.restaurant&filter=rect:2.2792,48.8330,2.4140,48.8800&limit=100&apiKey=YOUR_API_KEY')
.then(resp => resp.json())
.then((places) => {console.log(places);
});
Geoapify Places API 支持 500 多个类别 - 住宿、商业、餐厅和咖啡馆、休闲、娱乐、旅游等。
你可以在 Playground 页面上尝试 Places API,无需注册。
4、结束语
我们可以得出的结论是,OSM 是一个游戏规则改变者。 如果你想为不同平台开发开源应用程序,OSM 就是你应该开始寻找的源。 数据免费提供,更新速度快,并且有大量的工具可供使用。
现在你至少知道三种将 OSM 数据导入项目的方法。 工具的选择取决于你正在寻找什么类型的数据以及你拥有什么功能。
原文链接:3种获取OSM数据的方法 — BimAnt
相关文章:
3种获取OpenStreetMap数据的方法【OSM】
OpenStreetMap 是每个人都可以编辑的世界地图。 这意味着你可以纠正错误、添加新地点,甚至自己为地图做出贡献! 这是一个社区驱动的项目,拥有数百万注册用户。 这是一个社区驱动的项目,旨在在开放许可下向每个人提供所有地理数据。…...
数据处理与统计分析——MySQL与SQL
这里写目录标题 1、初识数据库1.1、什么是数据库1.2、数据库分类1.3、相关概念1.4、MySQL及其安装1.5、基本命令 2、基本命令2.1、操作数据库2.2、数据库的列类型2.3、数据库的字段属性2.4 创建和删除数据库表2.5、数据库存储引擎2.6、修改数据库 3、MySQL数据管理3.1、外键 My…...
OpenCV之特征点匹配
特征点选取 特征点探测方法有goodFeaturesToTrack(),cornerHarris()和SURF()。一般使用goodFeaturesToTrack()就能获得很好的特征点。goodFeaturesToTrack()定义: void goodFeaturesToTrack( InputArray image, OutputArray corners,int maxCorners, double qualit…...
浅谈开关柜绝缘状态检测与故障诊断
贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要:电力开关柜作为电力系统的关键设备广泛应用于输电配电网络,其运行可靠性直接影响着电力系统供电质量及安全性能。开关柜绝缘状态检测与故障诊断是及时维修、更换和预防绝缘故障的重要技术手段。在阐述开关柜绝…...
Mybatis 动态 SQL
动态 SQL 1. if 标签2. trim 标签3. where 标签4. set 标签5. foreach 标签 1. if 标签 if 标签有很多应用场景, 例如: 在用户进行注册是有些是必填项有些是选填项, 这就会导致前端传入的参数不固定如果还是将参数写死就很难处理, 这时就可以使用 if 标签进行判断 <insert …...
Android studio之 build.gradle配置
在使用Android studio创建项目会出现两个build.gradle: 一. Project项目级别的build.gradle (1)、buildscript{}闭包里是gradle脚本执行所需依赖,分别是对应的maven库和插件。 闭包下包含: 1、repositories闭包 2、d…...
【ElasticSearch】一键安装IK分词器无需其他操作
要注意的时下面命令中的es是我容器的名称,要换成你对应的es容器名 docker exec -it es /bin/bash # 进入容器 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis- ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.1…...
在Ubuntu上启动一个简单的用户登录接口服务
一个简单的用户登录接口 我使用 Python 和 Flask 框架来创建这个接口 首先,确保你已经安装了 Python 和 Flask。如果没有安装,可以通过以下命令在 Ubuntu 上安装: sudo apt update sudo apt install python3 python3-pip pip3 install Fla…...
【PHP】函数-作用域可变函数匿名函数闭包常用系统函数
文章目录 函数定义&使用命名规则参数种类默认值引用传递函数返回值return关键字 作用域global关键字静态变量 可变函数匿名函数闭包常用系统函数输出函数时间函数数学函数与函数相关函数 函数 函数:function,是一种语法结构,将实现某一个…...
Python使用pymysql和sqlalchemy访问MySQL的区别
Python使用pymysql和sqlalchemy访问MySQL的区别 1. 两个数据库连接工具的对比 pymysql和sqlalchemy是两个Python中经常用于与MySQL数据库交互的库。都可以连接MySQL数据库,但它们有明显的区别。 (1)特点 pymysql是一个Python模块…...
ubuntu服务器的mysql,更改root密码,并允许远程连接
我只是一个搬运工 更改密码远程连接...
微信小程序【构建npm】使用记录
:: 问题 使用原生微信小程序开发时,通过官方 typescript 模板构建的小程序无法正确执行 构建npm 成功,从而导致我想通过 npm 安装并使用第三方库出现问题 :: 开发环境(可参照) 设备:macOS Ventura 13.0 微信开发者工…...
mybatis入门的环境搭建及快速完成CRUD(增删改查)
又是爱代码的一天 一、MyBatis的介绍 ( 1 ) 背景 MyBatis 的背景可以追溯到 2002 年,当时 Clinton Begin 开发了一个名为 iBATIS 的持久化框架。iBATIS 的目标是简化 JDBC 编程,提供一种更直观、易用的方式来处理数据库操作。 在传统的 JDBC 编程中&…...
《HeadFirst设计模式(第二版)》第九章代码——组合模式
上一章链接: 《HeadFirst设计模式(第二版)》第九章代码——迭代器模式_轩下小酌的博客-CSDN博客 前面说到,当一个菜单里面出现了子菜单的时候,前面的迭代器模式得换成组合模式。 组合模式: 允许将对象组合成树形结构来表现部分-整…...
iOS17 widget Content margin
iOS17小组件有4个新的地方可以放置分别是:Mac桌面、iPad锁屏界面、 iPhone Standby模式、watch的smart stack Transition to content margins iOS17中苹果为widget新增了Content margin, 使widget的内容能够距离边缘有一定的间隙,确保内容显示完整。这…...
计网第四章(网络层)(一)
前面学习了数据链路层,我们可以实现一个网络的内部通信,可是要把这些网络互连起来形成更大的互连网,就需要用网络层互联设备路由器。而有了路由器的参与,就有不同网络、跨网络的概念诞生。 这时候我想大家也能理解为什么叫网络层…...
【前端】vue3 接入antdv表单校验
1/🍕背景 1、表单校验是非常常见的需求,能够有效的拦截大部分的错误数据,提升效率。 2、快速的给使用者提示和反馈,用户体验感非常好。 3、成熟的表单校验框架,开发效率高,bug少。 最近使用的是vue3antdv的…...
CY3-COOH在蛋白质定位的特点1251915-29-3星戈瑞
欢迎来到星戈瑞荧光stargraydye!小编带您盘点: CY3-COOH是一种橙红色荧光标记试剂,可以用于蛋白质定位研究。**以下是CY3-COOH在蛋白质定位的特点和应用: 细胞定位:**将CY3-COOH标记到特定蛋白质上,可以…...
数据采集:selenium 获取某网站CDN 商家排名信息
写在前面 工作中遇到,简单整理理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大…...
5.从头跑一个pipeline
1.安装torch pip install torchvision torch PyTorch的torchvision.models模块中自带的很多预定义模型。torchvision 是PyTorch的一个官方库,专门用于处理计算机视觉任务。在这个库中,可以找到许多常用的卷积神经网络模型,包括ResNet、VGG、…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
