OpenStreetMap是可编辑的全球地图。这意味着在地图上,您可以添加新地点或修复错误,甚至可以对其进行任何更改。 OpenStreetMap (OSM) 是一个成功的开放数据项目,由一个全球地图绘制者社区推动,该社区渴望将所有地理数据公开提供给所有人。拥有数百万注册会员,这是一项社区驱动的工作。

OSM 已成为一种流行的资源,用于为开发人员的应用程序和网站映射数据。任何人都可以维护有关道路、地点、建筑物、铁路轨道等的所有数据。但是,将 OpenStreetMap 数据转换为数据对象并在您的项目中使用它们需要技巧和特定的理解。

如何从 OpenStreetMap (OSM) 访问或下载数据?

有多种方法可以下载 OSM 数据,包括使用命令行工具(如 Curl 或 Wget)从 OSM 网站和第三方服务器(如Planet OSM或Geofabrik)导出数据.我们还向您介绍Geoapify Places API,它允许您按类别查询预先格式化的 OSM 数据。让我们仔细看看,好吗?

不过,在学习从 OSM 下载数据和查询之前,让我们看一下 OpenStreetMap 的数据结构。这些知识将帮助您理解查询示例。

OSM 对象及其属性:节点、方式、关系和标签

在 OSM 数据库中,所有对象都有一个 OSM ID 和一个 OSM 类型。 NodesWaysRelations 是 OSM 数据库对象的三种类型。

每个对象还可能包含标签。这些标签指定对象的属性和属性,例如地址、营业时间、便利设施类型或其他数据。

节点

节点是指定位置的项目,例如建筑物编号、邮箱、公共交通站点等都是节点的示例。

节点是可以独立存在或作为关系成员存在的特定位置。例如,地铁站可以包括地铁入口。

[地铁入口, 57th Street, New York](https://res.cloudinary.com/practicaldev/image/fetch/s--D4DHylyg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https: //dev-to-uploads.s3.amazonaws.com/uploads/articles/1pz7qcuhhjzcevn6mcq1.png)

方式

使用多边形来表示街道、河流、建筑物、道路或多边形是一种方式。像节点这样的方式可以独立存在,也可以作为关系的一部分存在。街道和河流通常由一组 Ways 表示,允许每个部分都有自己的一组标签,例如速度限制、车道数量、表面等。

[铁路站台, 57th Street, New York](https://res.cloudinary.com/practicaldev/image/fetch/s--Q6hlFBsk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https: //dev-to-uploads.s3.amazonaws.com/uploads/articles/vwc02apykjrkumapkajp.png)

关系

关系是节点、路径和其他关系的组合。关系定义了一个世界结构。例如,关系 Stop Area 描述了车站的结构 - 站台、地铁站入口、电梯。

[地铁站, 57th Street, New York](https://res.cloudinary.com/practicaldev/image/fetch/s--wXJTdW99--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https: //dev-to-uploads.s3.amazonaws.com/uploads/articles/pguwrhcw0qbi6ca7ba34.png)

标签

标签描述了 OSM 数据库中所有对象的特征和属性。

如何标记地铁站的示例如下:

标签

意义

名称u003d第 57 街 (F,)

OSM 对象的主要名称

网络u003d纽约地铁

指示 OSM 对象所属的系统

公共\运输u003d停止\区域

与公共交通相关的对象类型

地铁u003d是

表示对象属于地铁

类型u003d公共_transport

表示对象属于公共交通工具

OpenStreetMap (OSM) 社区一直在努力确保标签的平衡性和可理解性。文档不仅解释了每个标签的作用,还解释了它为什么这样做,因此您可以在查看网络上的地图或使用应用程序时了解您正在查看的内容并了解您的位置或路线的一些上下文使用 OSM 数据创建。

现在,让我们看看如何利用 OpenStreetMap 中的数据来创建新应用程序:

选项 1:获取 OSM 数据的快照。

以下是一些最流行的获取 OSM 原始数据的方法:

  • 通过使用 Planet OSM 网站

Planet OSM 为您提供每周 OSM 数据快照。您可以毫不费力地在 OSM 中找到所有对象。

有很多可靠的第三方软件可以将数据转换为不同的格式和数据库。例如,使用 Osm2pgsql 软件,您可以将所有数据传输到 Postgis 数据库中。从数据库中获取数据后,您可以使用 SQL 查询来处理数据。

下面是一个查询示例,可让您在特定区域查找地铁站(仅限节点):

with filterGeom as (select ST_Transform(ST_SetSRID(st_geomfromgeojson('{"type":"Polygon","coordinates":[[[-74.0091, 40.7747], [-73.9417, 40.7747], [-73.9417, 40.7455], [-74.0091, 40.7455], [-74.0091, 40.7747]]]}'), 4326), 3857) as w)
(select 
pop.osm_id,
pop.tags,
ST_AsGeoJSON(st_transform(way, 4326))::jsonb as geojson
from planet_osm_point pop, filterGeom
where 
((railway = 'station' and tags ? 'subway' and tags->'subway' = 'yes') 
    or (tags ? 'public_transport' and tags->'public_transport' = 'station' and tags ? 'subway' and tags->'subway' = 'yes') 
    or (tags ? 'public_transport' and tags->'public_transport' = 'station' and tags ? 'station' and tags->'station' = 'subway') ) 
and ST_Intersects(way, filtergeom.w))

进入全屏模式 退出全屏模式

  • 通过使用 Geofabrik 网站

Geofabrik 是一个提供每日 OSM 数据下载的网站。 Geofabrik 网站为您提供每个大陆 PBF 格式的 API 数据 Openstreetmap。该网站在不违反数据保护法的情况下共享数据。您不会收到个人信息、用户 ID 等元数据。

  • 使用 BBBike 网站

通过 BBBike 网站,您可以下载城市和地区的 OSM 数据。数据的大小仅限于 2 到 50 Mbs。您可以选择多种不同的数据格式来下载数据,例如 PBF、XML、形状文件和矢量地图切片。

选项 2:使用 Overpass API 代替 OSM API。

您可以借助Overpass API根据特定条件查询 OpenStreetMap 数据。它专为读取数据而设计,您可以使用Overpass QL(或 Overpass XML 作为替代)构建查询。在 Overpass QL 文档页面上,您可以发现查询示例。使用Overpass Turbo 交互式工具,您可以执行简短的查询并测试您的请求。您可以使用 Overpass Turbo 交互式在实时地图上测试您的请求。您可以搜索位置、使用标签、更改内容或仅使用地图。感谢简单易用的界面。

这是一个 Overpass 查询,它返回与上述类似的地铁站:

(
  node[railway=station][subway=yes]( 40.7455, -74.0091, 40.7747, -73.9417);
  node[public_transport=station][subway=yes]( 40.7455, -74.0091, 40.7747, -73.9417);
  node[public_transport=station][station=subway]( 40.7455, -74.0091, 40.7747, -73.9417);
);
out;

进入全屏模式 退出全屏模式

值得注意的是,您可以在单个请求中从多个表中查询数据。使用 node、rel 和方法从单个表中获取数据。使用nwnwrwrnr可以快速从多个表中查询数据。我们有一个开放的 Overpass API 实例列表,您可以免费使用。但是,它们确实有使用限制,因此您不能在生产应用程序中使用它们。

想要商业版的 Overpass API?Geoapify等公司以实惠的价格提供 Overpass API。如果您想了解更多信息,请联系我们。

选项 3:将 API 作为获取 OSM 数据的最简单方法

使用 Places API 将 OpenStreetMap (OSM) 数据集成到您的项目中很简单,该 API 按类别返回所选区域的位置。例如,如果您想要某个特定区域的餐馆信息,您需要运行一个 HTTP 请求,指定您想要的机构类型以及您需要搜索的区域。

Places API 提供经过处理和验证的数据,因此您无需处理开放数据可能存在的任何奇怪情况或错误。Geoapify Places API支持住宿、广告、餐厅和咖啡馆、休闲、娱乐、旅游等类别。

您可以通过 HTTP get 请求来获取 Places 数据。以下是返回纽约地铁站的 URL 示例:

https://api.geoapify.com/v2/places?categories=public_transport.subway&filter=rect:-74.0091,40.7455,-73.9417,40.7747&limit=100&apiKey=YOUR_API_KEY

进入全屏模式 退出全屏模式

API 返回一个 GeoJSON 对象。这可以通过地图库轻松可视化,包括 Leaflet、MapLibre GL 等。这是演示获取地铁站数据并将它们添加到 MapLibre GL 地图的 JSFiddle:

结论

我们可以有把握地得出结论,OSM 改变了游戏规则。如果您想为各种平台创建开源应用程序,OSM 是一个不错的起点。数据是开源的,快速更新和大量软件可以帮助您入门。您现在至少有三个选项可将 OSM 数据集成到您的项目中。您使用的软件取决于您要查找的数据类型和您的技能。

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐