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.pswp.cn/news/43596.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43596.shtml
英文地址,請注明出處:http://en.pswp.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、距離矢量協議 運行距離矢量路由協議的路由器周期性地泛洪自己的路由表。通過路由的交互,每臺路由器都從相鄰的路由器學習到路由,并且加載進自己的路由表中,然后再通告給其他相鄰路由器。 對于網絡中的所有…

Django框架使用定時器-APScheduler實現定時任務:django實現簡單的定時任務

一、系統環境依賴 系統:windows10 python: python3.9.0 djnago3.2.0 APScheduler3.10.1 二、django項目配置 1、創建utils包,在包里面創建schedulers包 utils/schedulers/task.py #1、設置 Django 環境,就可以導入項目的模型類這些了 …

AR/VR眼鏡轉接器方案,實現同時傳輸視頻快充方案

簡介 虛擬現實頭戴顯示器設備,簡稱VR頭顯VR眼鏡,是利用仿真技術與計算機圖形學人機接口技術多媒體技術傳感技術網絡技術等多種技術集合的產品,是借助計算機及最新傳感器技術創造的一種嶄新的人機交互手段。VR頭顯VR眼鏡是一個跨時代的產品。不…

AgentBench——AI智能體基準測試和排行榜

如果您有興趣了解有關如何對AI大型語言模型或LLM進行基準測試的更多信息,那么一種新的基準測試工具Agent Bench已成為游戲規則的改變者。這個創新工具經過精心設計,將大型語言模型列為代理,對其性能進行全面評估。該工具的首次亮相已經在AI社區掀起了波瀾,揭示了ChatGPT-4目…

Selenium 測試用例編寫

編寫Selenium測試用例就是模擬用戶在瀏覽器上的一系列操作,通過腳本來完成自動化測試。 編寫測試用例的優勢: 開源,免費。 支持多種瀏覽器 IE,Firefox,Chrome,Safari。 支持多平臺 Windows,Li…

day-23 代碼隨想錄算法訓練營(19)part09

669.修剪二叉搜索樹 思路一:根據二叉搜索樹的特性進行中間值與去區間值判斷,有三種情況:1.在區間中,所以左右子樹都可能在區間中; 2.在區間外面的左側,必然只有右子樹可能存在區間中;3.在區間外…

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的其實就是一個中間層,用于去連接不…

Vue3 setup語法糖 解決富文本編輯器上傳圖片64位碼過長問題 quill-image-extend-module

引言&#xff1a; 富文本編輯器傳圖片會解碼成64位&#xff0c;非常長導致數據庫會報錯第一種方法&#xff1a;將數據庫類型改成 mediumtext第二種辦法&#xff1a;本文中的方法 說明&#xff0c;本周文所用語法糖為Vue3 setup語法&#xff0c;即<script setup> 思路 攔…

HIVE SQL通過Lateral View + explode實現列轉行

原表&#xff1a; abAndy<碟中諜>,<諜影重重>,<007>MOMO<小鞋子>,<朋友啊你的家在哪里> 實現效果 abAndy<碟中諜>Andy<諜影重重>Andy<007>MOMO<小鞋子>MOMO<朋友啊你的家在哪里> 實現代碼&#xff1a; selec…

STM32 F103C8T6學習筆記8:0.96寸單色OLED顯示屏顯示字符

使用STM32F103 C8T6 驅動0.96寸單色OLED顯示屏: OLED顯示屏的驅動&#xff0c;在設計開發中OLED顯示屏十分常見&#xff0c;因此今日學習一下。一篇文章從程序到顯示都講通。 文章提供源碼、原理解釋、測試工程下載&#xff0c;測試效果圖展示。 目錄 OLED驅動原理—IIC通信…

無涯教程-Perl - undef函數

描述 此函數未定義EXPR的值。用于標量,列表,哈希,函數或類型范圍。在帶有諸如undef $hash {$key}之類的語句的哈希上使用&#xff1b;實際上將指定鍵的值設置為未定義的值。 如果要從哈希中刪除元素,請使用delete函數。 語法 以下是此函數的簡單語法- undef EXPRundef返回…

Java進階篇--迭代器模式

目錄 同步迭代器&#xff08;Synchronous Iterator&#xff09;&#xff1a; Iterator 接口 常用方法&#xff1a; 注意&#xff1a; 擴展小知識: 異步迭代器&#xff08;Asynchronous Iterator&#xff09;&#xff1a; 常用的方法 注意&#xff1a; 總結&#xff1a…

LeetCode 每日一題 2023/8/14-2023/8/20

記錄了初步解題思路 以及本地實現代碼&#xff1b;并不一定為最優 也希望大家能一起探討 一起進步 目錄 8/14 617. 合并二叉樹8/15 833. 字符串中的查找與替換8/16 2682. 找出轉圈游戲輸家8/17 1444. 切披薩的方案數8/18 1388. 3n 塊披薩8/19 2235. 兩整數相加8/20 8/14 617. 合…

【學習FreeRTOS】第9章——FreeRTOS任務調度

1.開啟任務調度器 vTaskStartScheduler() 作用&#xff1a;用于啟動任務調度器&#xff0c;任務調度器啟動后&#xff0c; FreeRTOS 便會開始進行任務調度【動態創建任務為例】 創建空閑任務如果使能軟件定時器&#xff0c;則創建定時器任務關閉中斷&#xff0c;防止調度器開…

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

Microsoft ISA 分析器工具&#xff0c;可分析 Microsoft ISA 服務器&#xff08;或 Forefront 威脅管理網關服務器&#xff09;的日志并生成安全和流量報告。支持來自 Microsoft ISA 服務器組件的以下日志&#xff1a; 數據包過濾器ISA 服務器防火墻服務ISA 服務器網絡代理服務…

透過源碼理解Flutter中widget、state和element的關系

1、framework源碼組成 Flutter中widget、state、element的源碼位于framework.dart中&#xff0c;整個文件6693行(版本Flutter 3.12.0-14.0.pre.28)。整個代碼可劃分為若干部分&#xff0c;主要包括key、widget、state、element四部分。 1.1 key 關于key的代碼65行到272行&am…