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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/43596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云计算原理及实战】初识云计算

该学习笔记取自《云计算原理及实战》一书,关于具体描述可以查阅原本书籍。 云计算被视为“革命性的计算模型”,因为它通过互联网自由流通使超级计算能力成为可能。 2006年8月,在圣何塞举办的SES(捜索引擎战略)大会上&a…

Sentinel 规则持久化

文章目录 Sentinel 规则持久化一、修改order-service服务1.引入依赖2.配置nacos地址 第二步修改非常麻烦,可以略过,直接使用已经打好包的来使用二、修改sentinel-dashboard源码1. 解压2. 修改nacos依赖3. 添加nacos支持4. 修改nacos地址5. 配置nacos数据…

HCIP第五节------------------------------------------ospf

一、OSPF基础 1、动态路由分类 2、距离矢量协议 运行距离矢量路由协议的路由器周期性地泛洪自己的路由表。通过路由的交互,每台路由器都从相邻的路由器学习到路由,并且加载进自己的路由表中,然后再通告给其他相邻路由器。 对于网络中的所有…

AR/VR眼镜转接器方案,实现同时传输视频快充方案

简介 虚拟现实头戴显示器设备,简称VR头显VR眼镜,是利用仿真技术与计算机图形学人机接口技术多媒体技术传感技术网络技术等多种技术集合的产品,是借助计算机及最新传感器技术创造的一种崭新的人机交互手段。VR头显VR眼镜是一个跨时代的产品。不…

AgentBench——AI智能体基准测试和排行榜

如果您有兴趣了解有关如何对AI大型语言模型或LLM进行基准测试的更多信息,那么一种新的基准测试工具Agent Bench已成为游戏规则的改变者。这个创新工具经过精心设计,将大型语言模型列为代理,对其性能进行全面评估。该工具的首次亮相已经在AI社区掀起了波澜,揭示了ChatGPT-4目…

Selenium 测试用例编写

编写Selenium测试用例就是模拟用户在浏览器上的一系列操作,通过脚本来完成自动化测试。 编写测试用例的优势: 开源,免费。 支持多种浏览器 IE,Firefox,Chrome,Safari。 支持多平台 Windows,Li…

Spring中JavaBean的生命周期及模式

( 本篇文章大部分讲述了是底层知识,理念及原理 ) ( 如果只想了解,看我标记的重点即可,如果想明白其中原理,请耐心看完,对你大有受益 ) 目录 一、简介 ( 1 ) 是什么 ( 2 ) 背景概述 ( 3 ) 作用 二、生命周期 2.1 …

【计算机视觉|生成对抗】StackGAN:使用堆叠生成对抗网络进行文本到照片逼真图像合成

本系列博文为深度学习/计算机视觉论文笔记,转载请注明出处 标题:StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks 链接:[1612.03242] StackGAN: Text to Photo-realistic Image Synthesis…

ViewFs And Federation On HDFS

序言 ViewFs 是在Federation的基础上提出的,用于通过一个HDFS路径来访问多个NameSpace,同时与ViewFs搭配的技术是client-side mount table(这个就是具体的规则配置信息可以放置在core.xml中,也可以放置在mountTable.xml中). 总的来说ViewFs的其实就是一个中间层,用于去连接不…

STM32 F103C8T6学习笔记8:0.96寸单色OLED显示屏显示字符

使用STM32F103 C8T6 驱动0.96寸单色OLED显示屏: OLED显示屏的驱动,在设计开发中OLED显示屏十分常见,因此今日学习一下。一篇文章从程序到显示都讲通。 文章提供源码、原理解释、测试工程下载,测试效果图展示。 目录 OLED驱动原理—IIC通信…

无涯教程-Perl - undef函数

描述 此函数未定义EXPR的值。用于标量,列表,哈希,函数或类型范围。在带有诸如undef $hash {$key}之类的语句的哈希上使用;实际上将指定键的值设置为未定义的值。 如果要从哈希中删除元素,请使用delete函数。 语法 以下是此函数的简单语法- undef EXPRundef返回…

Java进阶篇--迭代器模式

目录 同步迭代器(Synchronous Iterator): Iterator 接口 常用方法: 注意: 扩展小知识: 异步迭代器(Asynchronous Iterator): 常用的方法 注意: 总结&#xff1a…

【学习FreeRTOS】第9章——FreeRTOS任务调度

1.开启任务调度器 vTaskStartScheduler() 作用:用于启动任务调度器,任务调度器启动后, FreeRTOS 便会开始进行任务调度【动态创建任务为例】 创建空闲任务如果使能软件定时器,则创建定时器任务关闭中断,防止调度器开…

Microsoft ISA服务器配置及日志分析

Microsoft ISA 分析器工具,可分析 Microsoft ISA 服务器(或 Forefront 威胁管理网关服务器)的日志并生成安全和流量报告。支持来自 Microsoft ISA 服务器组件的以下日志: 数据包过滤器ISA 服务器防火墙服务ISA 服务器网络代理服务…

透过源码理解Flutter中widget、state和element的关系

1、framework源码组成 Flutter中widget、state、element的源码位于framework.dart中,整个文件6693行(版本Flutter 3.12.0-14.0.pre.28)。整个代码可划分为若干部分,主要包括key、widget、state、element四部分。 1.1 key 关于key的代码65行到272行&am…

GuLi商城-前端基础Vue-生命周期和钩子函数

下图展示了实例的生命周期。你不需要立马弄明白所有的东西,不过随着你的不断学习和使用,它 的参考价值会越来越高。 VUE 的生命周期指的是组件在创建、运行和销毁过程中所经历的一系列事件,通过这些事件可以 让开发者在不同阶段进行相应的…

vue3 + antv/x6 实现拖拽侧边栏节点到画布

前篇:vue3ts使用antv/x6 自定义节点 前篇:vue3antv x6自定义节点样式 1、创建侧边栏 用antd的menu来做侧边栏 npm i --save ant-design-vue4.x//入口文件main.js内 import Antd from ant-design-vue; import App from ./App; import ant-design-vue/…

安卓的代码加固和其他安全问题

文章目录 安卓加固apk文件结构dex加固过程 其它安全问题 安卓加固 从App的加固技术来看:主流分为dex加密和so加密,目前来看保护dex文件更为重要,因为dex反编译后的java代码可读性更强。 android-ndk: Native Development Kit 官网解释:这套工具使您能在 Android 应…

Kvm配置ovs网桥

环境:部署在kvm虚拟环境上(让虚拟机和宿主机都可以直接从路由器获取到独立ip) 1、安装ovs软件安装包并启动服务(一般采用源码安装,此处用yum安装) yum install openvswitch-2.9.0-3.el7.x86_64.rpm syste…

Git常见操作

一、全局配置命令 配置级别: –local(默认,高级优先):只影响本地仓库 –global(中优先级):只影响所有当前用户的git仓库 –system(低优先级):影响到全系统的git仓库 1…