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