日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Open Street Map维基世界地图初探--概念、开发

發(fā)布時(shí)間:2025/7/25 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Open Street Map维基世界地图初探--概念、开发 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

from: http://blog.csdn.net/viewcode/article/details/8179289

1. 什么是open street map(osm)?

2. 開發(fā)者應(yīng)該知道哪些概念?包括地圖的內(nèi)容、格式等

3. OSM開發(fā)有哪些環(huán)境?

4. libosmscout環(huán)境的搭建

5. libosmscout的使用示例、配置文件


1. 什么是OSM?

Open Street Map 維基世界地圖,一個(gè)開源的在線地圖項(xiàng)目,包括軟件和地圖數(shù)據(jù)。

官網(wǎng)介紹

http://wiki.openstreetmap.org/wiki/Zh-hans:Main_Page

中文網(wǎng)頁

http://wiki.openstreetmap.org/wiki/Main_Page

OSM與其他地圖 如google地圖的區(qū)別在哪里?

正如官網(wǎng)所說,它提供了一種方式,讓任何人能編輯地圖,能為OSM增加地圖數(shù)據(jù)(當(dāng)然如果是錯(cuò)誤的,別人是有權(quán)修改的)。而且,其他地圖大部分都不是免費(fèi)的,或者需要授權(quán)使用, google地圖是免費(fèi)的,但它也是被別人授權(quán)的,無法隨意編輯或在自己的軟件中使用的。

所以,人們也可以免費(fèi)地使用OSM數(shù)據(jù),包括開發(fā)等。


對OSM的常見問題,可以瀏覽

http://wiki.openstreetmap.org/wiki/FAQ


對于大部分人而言,為OSM繪圖是比較有趣的事。

有關(guān)為地圖增加數(shù)據(jù)(繪圖)的詳細(xì)介紹如下:

http://wiki.openstreetmap.org/wiki/Zh-hans:Map_Making_Overview


而對于開發(fā)者而言,更關(guān)心如何使用OSM數(shù)據(jù),用于開發(fā),一個(gè)必要的開發(fā)介紹和資源入口:

http://wiki.openstreetmap.org/wiki/Develop

里面介紹了 OSM的API, 如何下載map data,map data的數(shù)據(jù)格式和數(shù)據(jù)結(jié)構(gòu),常用的開發(fā)工具(已經(jīng)開發(fā)好的小工具),地圖要素(有哪些數(shù)據(jù)),與OSM相關(guān)的支持的框架(庫和組件)。


OSM自身的框架描述:

http://wiki.openstreetmap.org/wiki/Component_overview


下面先介紹一些與開發(fā)相關(guān)的概念和環(huán)境。

2. OSM相關(guān)的一些概念

地圖數(shù)據(jù)的存儲(chǔ)方式是xml結(jié)構(gòu),后綴名可以是xml或osm。


地圖的數(shù)據(jù)結(jié)構(gòu),即地圖要素包括1?Node,?2?Way,?3?Relation4?Tag5?Common attributes

這些地圖要素,與普通的地圖或?qū)Ш揭馗拍钕嗤?/p>

Node是空間點(diǎn),包括經(jīng)緯坐標(biāo),或高度信息。其他一些可選信息,如name等,在tag子數(shù)據(jù)中表示。類似于shape point 或attribution point

way表示線或區(qū)域,能包含2-2000個(gè)node點(diǎn)信息。它道路與區(qū)域描述的主要形式。類似于link、edge的概念

relation表示不同的元素間的關(guān)系,將不同元素間的關(guān)系描述出來。類似于connection的概念

tag表示一個(gè)元素中包含的一個(gè)特征,或者說是包含的一小塊數(shù)據(jù),如highway=residential,住宅區(qū)內(nèi)的道路。類似于attribution的概念,不過tag的作用遠(yuǎn)不止attribution的描述。

Common attributes就是node、way、relation的共同屬性,包括id, usr, version, timestamp等meta的信息。

更詳細(xì)的描述參見:

http://wiki.openstreetmap.org/wiki/Data_Primitives

及每個(gè)元素的子鏈接。


有關(guān)tag類型的詳細(xì)介紹和分類在這里有介紹:

http://wiki.openstreetmap.org/wiki/Map_Features


3. 開發(fā)框架

OSM目前提供了API 0.6版本的開發(fā)接口,xapi是extended api擴(kuò)展的接口。而這些接口是用于web或Java應(yīng)用開發(fā)的。如下介紹

http://wiki.openstreetmap.org/wiki/Databases_and_data_access_APIs

如果是使用其他語言開發(fā),就必須使用其他的庫或組件,這里列舉了各種語言支持的庫和組件。

http://wiki.openstreetmap.org/wiki/Develop/Frameworks


對于我而言,我采用的c++開發(fā)語言,目的是讀取OSM數(shù)據(jù),并解析,選取一些數(shù)據(jù),我就選用libosmscout庫。

所以,下面我就介紹libosmscout的開發(fā)環(huán)境設(shè)置。


4. libosmscout環(huán)境的搭建

我使用JOSM用于查看和下載地圖數(shù)據(jù),JOSM只能查看較小的地圖數(shù)據(jù),其內(nèi)存支持400多MB,對于更大的數(shù)據(jù)不支持。OSMOSIS用于數(shù)據(jù)轉(zhuǎn)換或分割等。

地圖數(shù)據(jù)下載,以下鏈接里包括各個(gè)地區(qū)或整個(gè)地圖的下載路徑:

http://wiki.openstreetmap.org/wiki/Planet.osm


libosmscout各個(gè)模塊的介紹:?

http://wiki.openstreetmap.org/wiki/Libosmscout

閑話少說,環(huán)境搭建(非qt版部分):

a. 使用Git從sourceforge上把源碼都下載下來

http://sourceforge.net/projects/libosmscout/

b. libosmscout支持windows版本,我使用的是vs2008,所以首先查看README.VisualStudio.txt,里面包含了詳細(xì)的build windows版本的步驟。

c. 依據(jù)readme,將zlib、libxml2、google protocol buffers、protoc.exe下載下來,并配置好。其中zlib、libxml2的版本要匹配,否則會(huì)有很因?yàn)榘姹静黄ヅ涞逆溄渝e(cuò)誤。

d. 依據(jù)readme,設(shè)置環(huán)境變量EXTRALIBS_HEADERS、EXTRALIBS_DEBUGLIBS。

e. 然后編譯,這時(shí),若有與DECLARE_COEFFS(SINECOEFF_SSE)相關(guān)的編譯錯(cuò)誤,就查看SSEMath.cpp中,有關(guān)math的一系列代碼是否是有效的,若無效,加入#define?OSMSCOUT_HAVE_SSE2。這個(gè)是我遇到的其vs工程中自帶的問題,可能是個(gè)小bug吧。

f. 此時(shí)libosmscout工程、libosmscout-import工程、import工程、demo_AddressLookup工程都能編譯通過。有關(guān)qt部分的工程我沒編譯,這里就不寫了。


訂閱郵件列表,用于知曉它的修改變換,及咨詢問題:

https://lists.sourceforge.net/lists/listinfo/libosmscout-development


5. libosmscout使用示例與配置

在使用demo_AddressLookup之前,要獲取OSM地圖數(shù)據(jù)及將osm地圖數(shù)據(jù)轉(zhuǎn)換為libosmscout需要的binary數(shù)據(jù)。

如果手上拿的的有xml格式的數(shù)據(jù),可以使用osmosis工具將xml格式的數(shù)據(jù)轉(zhuǎn)換為osm格式。轉(zhuǎn)換命令示例:

osmosis --read-xml file="planetin.xml" --write-xml file="planetout.osm" 更豐富的,強(qiáng)大的示例在

http://wiki.openstreetmap.org/wiki/Osmosis#Example_Usage

或使用JOSM工具從服務(wù)器上下載地圖數(shù)據(jù),并保存為osm格式,這種方法能直接打開地圖數(shù)據(jù)并查看。


然后,使用編譯好的import.exe,將osm格式的數(shù)據(jù)轉(zhuǎn)換為binary數(shù)據(jù)。在運(yùn)行程序之前,將libosmscout\map.ost復(fù)制到程序當(dāng)前目錄下,因?yàn)閕mport需要默認(rèn)的map.ost參數(shù)文件。建立一個(gè)用于輸出結(jié)果的文件夾(libosmscout的binary地圖作為輸入或輸出都是文件夾的形式),如轉(zhuǎn)換planet.xml,運(yùn)行命令I(lǐng)mport.exe planetout.osm --destinationDirectory planet

更詳盡的命令參數(shù),請參看源碼或import的命令提示。

import的輸出會(huì)包含很多dat和idx文件,dat是數(shù)據(jù)文件,idx是dat的索引文件,更詳細(xì)的說明在libosmscout\libosmscout\ProcessResult.txt中,libosmscout\libosmscout\Resource.txt是一些算法和程序所占資源的說明。

并且map.ost是可以編輯的,可以增加或刪除一些選項(xiàng),如以下一些必要類型保留,其他我都刪除,并添加了highway_crossing類型。這樣能減少自己不需要的生成的binary數(shù)據(jù),當(dāng)然就會(huì)提高效率。

[cpp] view plaincopy
  • OST??
  • ??
  • TYPES??
  • ??TYPE?"highway_crossing"?=?NODE?("highway"=="crossing")???
  • ??
  • ??//?Do?not?delete?the?following?type,?they?are?required?by?the?GenCityStreet?import?step??
  • ??TYPE?"boundary_administrative"?=?WAY?AREA?("boundary"=="administrative")?OR??
  • ???????????????????????????????????RELATION?("type"=="boundary"?AND?"boundary"=="administrative")?OPTIONS?MULTIPOLYGON?IGNORESEALAND??
  • ??
  • ??//?Do?not?delete?the?following?types,?they?are?required?by?the?GenCityStreet?import?step??
  • ??TYPE?"place_city"?=?NODE?AREA?("place"=="city")??
  • ??TYPE?"place_town"?=?NODE?AREA?("place"=="town")??
  • ??TYPE?"place_village"?=?NODE?AREA?("place"=="village")??
  • ??TYPE?"place_hamlet"?=?NODE?AREA?("place"=="hamlet")??
  • ??TYPE?"place_suburb"?=?NODE?AREA?("place"=="suburb")??
  • ??
  • END??

  • 自己的一個(gè)小的demo,打印地圖中highway_crossing的node(前提:自己生成的輸入地圖中有highway_crossing的數(shù)據(jù))。 [cpp] view plaincopy
  • #include?<iostream>??
  • #include?<iomanip>??
  • #include?<vector>??
  • ??
  • #include?<osmscout/Database.h>??
  • #include?<osmscout/TypeConfigLoader.h>??
  • ??
  • using?namespace?std;??
  • const?static?size_t?RESULT_SET_MAX_SIZE?=?1000;??
  • ??
  • int?main(int?argc,?char*?argv[])??
  • {??
  • ??std::string??????????????????????map;??
  • ??map=argv[1];??
  • ??
  • ??osmscout::DatabaseParameter?databaseParameter;??
  • ??//databaseParameter.SetDebugPerformance(true);??
  • ??osmscout::Database??????????database(databaseParameter);??
  • ??
  • ??if?(!database.Open(map.c_str()))?{??
  • ????std::cerr?<<?"Cannot?open?database"?<<?std::endl;??
  • ??
  • ????return?1;??
  • ??}??
  • ??
  • ??double?minlat?=?0.f;??
  • ??double?minlon?=?0.f;??
  • ??double?maxlat?=?0.f;??
  • ??double?maxlon?=?0.f;??
  • ??database.GetBoundingBox(minlat,?minlon,?maxlat,?maxlon);??
  • ??
  • ??std::cout?<<?"?"?<<?minlat?<<?"?"?<<?minlon?<<?"?"?<<?maxlat?<<?"?"?<<?maxlon?<<?std::endl;??
  • ??
  • ??std::vector<osmscout::NodeRef>?nodes;??
  • ??std::vector<osmscout::WayRef>?ways;??
  • ??std::vector<osmscout::WayRef>?areas;??
  • ??std::vector<osmscout::RelationRef>?relationWays;??
  • ??std::vector<osmscout::RelationRef>?relationAreas;??
  • ??
  • ??osmscout::TypeConfig?typeConfig;??
  • ??
  • ??clock_t?startTime?=?clock();??
  • ??
  • ??if?(!osmscout::LoadTypeData(map,typeConfig))?{??
  • ??????std::cerr?<<?"Cannot?load?'types.dat'!"?<<?std::endl;??
  • ??????return?false;??
  • ????}??
  • ????std::cout?<<?"typeID:"?<<?typeConfig.GetTypeId("highway_crossing")?<<?endl;??
  • ??
  • ??osmscout::TypeSet?types;??
  • ??types.SetType(typeConfig.GetTypeId("highway_crossing"));??
  • ??std::cout?<<?types.HasTypes()?<<?std::endl;??
  • ??
  • ??database.GetObjects(minlon,?minlat,?maxlon,?maxlat,types,?nodes,?ways,?areas,?relationWays,?relationAreas);??
  • ??clock_t?endTime?=?clock();??
  • ??
  • ??std::cout?<<?"Time:"?<<?(endTime?-?startTime)?<<?std::endl;??
  • ??
  • ??std::cout?<<?"nodes:?"?<<?nodes.size()?<<?"?ways:"?<<?ways.size()?<<?"?areas:"?<<?areas.size()?<<?std::endl????
  • ??????<<?"relationWays:"?<<?relationWays.size()?<<?"?relationAreas:"?<<?relationAreas.size()?<<?std::endl;??
  • ??
  • ??for?(unsigned?int?i=0;?i<nodes.size();?++i)??
  • ??{??
  • ??????std::cout?<<?i?<<?"GetLat:"?<<?nodes[i].Get()->GetLat()?<<?std::endl;??
  • ??????std::cout?<<?i?<<?"GetLon:"?<<?nodes[i].Get()->GetLon()?<<?std::endl;??
  • ??????std::cout?<<?i?<<?"GetId:?????????"?<<?nodes[i].Get()->GetId()?<<?std::endl;??
  • ??????if?(nodes[i].Get()->GetTagCount()?>?0)??
  • ??????{??
  • ??????????std::cout?<<?i?<<?"GetTagCount:"?<<?nodes[i].Get()->GetTagCount()?<<?std::endl;??
  • ??????????std::cout?<<?i?<<?"GetTagKey:"?<<?nodes[i].Get()->GetTagKey(0)?<<?std::endl;??
  • ??????????std::cout?<<?i?<<?"GetTagValue:"?<<?nodes[i].Get()->GetTagValue(0)?<<?std::endl;??
  • ??????}??
  • ??????std::cout?<<?i?<<?"GetType:"?<<?nodes[i].Get()->GetType()?<<?std::endl;??
  • ??}??
  • ??
  • ??database.Close();??
  • ??
  • ??std::cout?<<?"database?close?..."?<<?std::endl;??
  • ??
  • ??return?0;??
  • }??

  • 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的Open Street Map维基世界地图初探--概念、开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。