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.rhkb.cn/news/104895.html

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

相关文章

大数据课程K6——Spark的Shuffle详解

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Spark的定义&&特点&&目的&&优缺点; ⚪ 掌握Spark的相关参数配置; ⚪ 掌握Hadoop的插件配置; 一、Spark Shuffle详解 1. 概述 Shuffle,就是洗牌。之所以…

安防监控平台EasyCVR视频汇聚平台增加首页告警类型的详细介绍

安防监控/视频集中存储/云存储EasyCVR视频汇聚平台,可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等…

vue3-ts- element-plus新增组件-过滤

新增组件-所有值为空时过滤 <el-form-item label"家庭成员"><divclass"username-box"v-for"(item, index) in form.namelist":key"index"><div>姓名&#xff1a;<el-input v-model"item.name" placeho…

Java异常

异常体系结构Java异常的分类异常处理异常抛出异常声明异常捕获异常处理流程自定义异常 异常体系结构 .Error&#xff1a;指的是Java虚拟机无法解决的严重问题&#xff0c;比如&#xff1a;JVM的内部错误、资源耗尽等&#xff0c;典型代表&#xff1a;StackOverflowError&#…

uniapp-滑块验证组件wo-slider

wo-slider是一款支持高度自定义的滑块验证组件&#xff0c;采用uniapp-vue2编写 采用touchstart、touchmove、touchend事件实现的滑块组件,支持H5、微信小程序&#xff08;其他小程序未试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&#xff1a; https://ext.…

Docker搭建个人网盘、私有仓库

1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘 [rootlocalhost ~]# docker pull mysql:5.6 [rootlocalhost ~]# docker pull owncloud [rootlocalhost ~]# docker run -itd --name mysql --env MYSQL_ROOT_PASSWORD123456 mysql:5.6 [rootlocalhost ~]# doc…

1267. 统计参与通信的服务器

题目描述&#xff1a; 这里有一幅服务器分布图&#xff0c;服务器的位置标识在 m * n 的整数矩阵网格 grid 中&#xff0c;1 表示单元格上有服务器&#xff0c;0 表示没有。 如果两台服务器位于同一行或者同一列&#xff0c;我们就认为它们之间可以进行通信。 请你统计并返回能…

工控机驱动自助检票机,打造轨道交通的智慧未来!

随着城市化进程的加速和人口的不断增长&#xff0c;城市轨道交通建设正日益成为解决交通拥堵、提高交通工作效率的重要举措。然而&#xff0c;仅仅依靠传统的交通设施已经无法满足城市发展的需求&#xff0c;轨道交通智能系统建设成为了不可忽视的发展趋势。 AFC&#xff0c;即…

Git gui教程---第八篇 Git gui的使用 创建一个分支

一般情况下一个主分支下代码稳定的情况下会新建出一个分支&#xff0c;然后在分支上修改&#xff0c;修改完成稳定后再合并到主分支上。 或者几个人合作写一份代码&#xff0c;每个人各一个分支&#xff0c;测试稳定再合并到主分支上。 在git gui选择菜单栏“分支”&#xff0…

Linux之套接字UDP实现网络通信

Linux之套接字UDP实现网络通信 文章目录 Linux之套接字UDP实现网络通信1.引言2.具体实现2.1需要知道的套接字接口1.socket()2.bind()3.recvfrom()4.sendto() 2.2服务器端server.hpp2.3服务器端server.cc2.4客户端Client.cc 1.引言 ​ 套接字(Socket)是计算机网络中实现网络通信…

docker安装clickhouse

安装 docker安装 创建clickhouse目录 mkdir -P /data/clickhouse/datamkdir -P /data/clickhouse/confmkdir -P /data/clickhouse/log 拉取镜像 这里直接拉取最新镜像, 如果需要某个特定版本, 则再拉取的时候指定版本号即可. docker pull clickhouse/clickhouse-server 启动临…

Springboot实现ENC加密

Springboot实现ENC加密 1、导入依赖2、配置加密秘钥&#xff08;盐&#xff09;3、获取并配置密文4、重启项目测试5、自定义前缀、后缀6、自定义加密方式 1、导入依赖 关于版本&#xff0c;需要根据spring-boot版本&#xff0c;自行修改 <dependency><groupId>co…

STM32 CubeMX (第四步Freertos内存管理和CPU使用率)

STM32 CubeMX STM32 CubeMX &#xff08;第四步Freertos内存管理和CPU使用率&#xff09; STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1&#xff08;不要选择滴答定时器&#xff1b;滴答定时器留给OS系统做时基&#xff09;使用STM32 CubeMX 库&#xff0c;配置Fr…

java maven项目打jar包发布(精简版)

目录 一、maven打包 二、安装jdk环境 三、安装mysql 四、jar包传输到服务器 一、maven打包 先clean再package target文件夹下面有生成一个jar包 二、安装jdk环境 1、下载jdk cd /usr/local wget https://repo.huaweicloud.com/java/jdk/8u201-b09/jdk-8u201-linux-x64.tar.…

RocketMQ消息存储

一、存储介质 ● 关系型数据库DB Apache下开源的另外一款MQ—ActiveMQ (默认采用的KahaDB做消息存储)可选用JDBC的方式来做消息持久化&#xff0c;通过简单的xmI配置信息即可实现JDBC消息存储。由于&#xff0c;普通关系型数据库(如Mysql)在单表数据量达到千万级别的情况下&a…

uniapp小程序位置信息配置

uniapp 小程序获取当前位置信息报错 报错信息&#xff1a; getLocation:fail the api need to be declared in the requiredPrivateInfos field in app.json/ext.json 需要在manifest.json配置文件中进行配置&#xff1a;

期权是什么?期权的优缺点是什么?

期权是一种合约&#xff0c;有看涨期权和看跌期权两种类型&#xff0c;也就是做多和做空两个方向&#xff0c;走势标的物对应大盘指数&#xff0c;这也是期权与其他金融工具的主要区别之一&#xff0c;可以用于套利&#xff0c;对冲股票和激进下跌的风险&#xff0c;下文介绍期…

安全(权限)框架Shiro概述及原理

1.1 Shiro是什么 Apache Shiro是一个功能强大且易于使用的Java安全&#xff08;权限&#xff09;框架。Shiro可以完成&#xff1a;认证、授权、加密、会话管理、与Web集成、缓存 等。借助Shiro您可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的Web和企业应用…

opencv 水果识别+UI界面识别系统,可训练自定义的水果数据集

目录 一、实现和完整UI视频效果展示 主界面&#xff1a; 测试图片结果界面&#xff1a; 自定义图片结果界面&#xff1a; 二、原理介绍&#xff1a; 图像预处理 HOG特征提取算法 数据准备 SVM支持向量机算法 预测和评估 完整演示视频&#xff1a; 完整代码链接 一、…

MyBatis分页思想和特殊字符

目录 一、MyBatis分页思想 1.1 使用场景 1.2 代码演示 二、MyBatis特殊字符 2.1代码演示 一、MyBatis分页思想 1.1 使用场景 Mybatis分页应用场景&#xff1a; MyBatis是一个Java持久层框架&#xff0c;它提供了一种将SQL查询和结果映射到Java对象的简单方式。分页是MyBa…