OpenStreetMap 是每个人都可以编辑的世界地图。 这意味着你可以纠正错误、添加新地点,甚至自己为地图做出贡献! 这是一个社区驱动的项目,拥有数百万注册用户。 这是一个社区驱动的项目,旨在在开放许可下向每个人提供所有地理数据。
OpenStreetMap 数据是最新、最详细的可用空间数据库。 因此,OSM 已成为希望在其应用程序和网站中使用地图数据的开发人员的流行资源。 但是,将 OpenStreetMap 数据转换为 OSM 对象并在项目中使用它需要经验和特定知识。
在本文中,我们将介绍获取 OpenStreetMap 数据的基础知识以及三种获取OSM数据的方法。
推荐:用 NSDT编辑器 快速搭建可编程3D场景
在讨论提取数据和查询示例之前,让我们先看看 OpenStreetMap 数据结构,因为需要这些知识来更好地理解查询示例。
OSM 数据库中的每个对象都分配有与其表关联的类型。 对象分为三种类型:节点、路径和关系。 每种对象都有唯一的 ID。 所以OSM中的每个对象都有一个ID和类型。 例如, osm_type=“way” 和 osm_id=67104773。
此外,每个对象可能具有描述其属性的标签,例如地址、开放时间、设施类型、颜色、参考文献、维基百科页面或其他信息。
节点(Node)是具有位置(坐标)的对象。 节点可以代表邮箱、树、地铁入口、市中心、建筑物编号等。
节点可以是独立的,也可以是关系的一部分。 例如,地铁入口可以是地铁站的一部分。
路线(way)是一条线或多边形,例如街道、河流、建筑物或边界。
与节点类似,路线可以是独立的,也可以是关系的一部分。 通常,街道和河流由一组方式表示,因此每个部分都可以有自己的标签,例如速度限制、车道数量、表面等。
关系(relation)是描述世界上某些结构的节点、道路和可能的其他关系的组,例如,关系“自行车道”描述了道路旁边的自行车道的结构。
关系也可以有标签 - 这些通常称为“关系上的标签”,因为它们直接应用于关系,而不是像节点或路径标签这样的单个成员。
OSM 数据库中的每个对象都可能有一组描述该对象的特征和属性的标签(tag)。 以下是如何标记建筑物的示例:
OpenStreetMap (OSM) 社区努力创建一种保持标签平衡且易于理解的方法。 文档门户解释了标签。
该文档不仅解释了每个标签的作用,还解释了为什么它会这样做,以便当你在网络上查看地图或使用根据 OSM 数据构建的应用程序时,可以了解正在查看的内容并拥有你的位置或路线的一些背景信息。
OSM 社区还创建了一系列用于在地图上标记道路和其他要素的指南。 这些指南在 OSM 行话中称为“风格指南”,它们解释了如何标记不同类型的事物,以便您的数据与其他人的数据保持一致。 风格指南非常重要,因为它有助于确保所有使用 OSM 数据的地图看起来都一样!
让我们看一下如何从 OSM 项目检索数据并使用它来构建新应用程序:
原始 OpenStreetMap 文件使用基于 XML 的格式。 XML 格式旨在添加有关节点、路径和关系的新信息,并跟踪对地图所做的更改。
最适合数据读取的替代格式由第三方工具和提取器生成。
以下是获取 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个表中查询。
Geofabrik 以 PBF 格式提供各大洲的每日 OSM 数据提取。 数据已从元数据(个人数据、用户 ID、变更集)中清除。 因此你可以使用它而无需担心数据保护法规。
BBBike 提供按城市和地区划分的 OSM 摘录。 提取内容只有 2-50 MB 大,你可以选择 PBF、XML、形状文件、矢量地图图块等数据格式。
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 非常适合小型和简单的查询,但它并不是更复杂的查询的最佳选择。
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,无需注册。
我们可以得出的结论是,OSM 是一个游戏规则改变者。 如果你想为不同平台开发开源应用程序,OSM 就是你应该开始寻找的源。 数据免费提供,更新速度快,并且有大量的工具可供使用。
现在你至少知道三种将 OSM 数据导入项目的方法。 工具的选择取决于你正在寻找什么类型的数据以及你拥有什么功能。
原文链接:3种获取OSM数据的方法 — BimAnt