OpenStreetMap地圖數據介紹(轉)


原文鏈接:每日一讀 Packtpub.OpenStreetMap(1)

相信絕大多數人都知道Wiki,但要提起地圖,大家第一反應肯定是Google地圖。在沒看這本書之前,還真不知原來還有OpenStreetMap,一個類似於wiki的可供自由編輯的世界地圖,它是由用戶創造的,允許你查看,編輯或者使用世界各地的地理數據。

Making a Free, Editable Map of the World

簡要介紹了OpenStreetMap的歷史,從最初的Java到現在的Ruby on Rails.

Getting started at openstreetmap.org

從 http://www.openstreetmap.org/ 登進去后,可以看到兩個定位搜索引擎:Nominatim 和Geonames。書中建議注冊一個賬戶,那就建個唄。然后啰嗦的介紹了一通openstreetmap。

Gathering Data using GPS

顧名思義,用GPS來收集信息。苦於囊中羞澀,玩不起GPS,直接跳過了。但本章最后一小節還是照顧了我一下,Collecting information without a GPS。你收集不到數據,幫人家改改數據還是可以的。大體需要用到這么兩個網站:

http://downloads.cloudmade.com/ http://walking-papers.org/。瞧過以后,發現自己還是做不了。人家要你打印出來,手動畫上去。算了,咱沒那繪畫的天分。

How OpenStreetMap Records Geographical Features

OpenStreetMap 有自己的數據模型,跟普通的GIS數據模型還不一樣。

OpenStreetMap's design goals 設計目標

1.越簡單越好。

不由想起了自己的第一個項目,做一家礦產公司的資源管理系統,主要也是跟地圖打交道。因為提前把自己的模塊完成了,這時候自虐綜合症又纏上了我。沒事找事,非要跟風整個SSH進去。整完SSH后,又覺得論壇那塊不夠炫,鼓搗鼓搗,又把Fckeditor揉進去了。弄完后,得意洋洋,把代碼一合。隨后被老師揪過去問,怎么速度變這么慢了。。。。。 
2.帶有維基風格的編輯功能。

3.能夠記錄拓撲結構。

4.給地圖編輯者最大編輯自由,能夠隨心所欲標我所想。

The data structures used 數據結構

三種基本數據類型:nodes,ways 和 relations。

Nodes

節點就是空間中的點,數據類型中唯一用來標識位置信息的類型,其他兩種都依賴於他。看看書上的例子吧:

<osm version="0.6" generator="OpenStreetMap server"> 
    <node id="483034256" lat="55.9458449" lon="-3.2035477" version="1" 
        changeset="2369219" user="spytfyre" uid="166957" visible="true" 
        timestamp="2009-09-04T13:35:42Z"> 
        <tag k="name" v="The Blue Blazer" /> 
        <tag k="amenity" v="pub" /> 
    </node> 
</osm>

每個節點都至少有經度和緯度兩個屬性。不由得又想起了我的第一個項目,想起了自己跟老師討論要不要在Oracle數據庫中加經緯度字段的歲月。為什么人總忘不了第一次,不管結果多么凄慘。。。

lat="55.9458449" lon="-3.2035477" latitude 緯度 longitude 經度

<tag k="amenity" v="pub" /> tag里的k,v屬性,相信做Java的都可以猜得到,就是key,value。

image

Ways

“路”是什么?天下本沒路,走的人多了就有了。天下本沒有路,踩得“點”多了就有了。Ways就是一組排序好的Node。一條路至少得要兩個節點。同樣看個例子吧:

<osm version="0.6" generator="OpenStreetMap server"> 
    <way id="43157302" visible="true" timestamp="2009-10-26T10:45:09Z" 
        version="1" changeset="2954960" user="Ed Avis" uid="31257"> 
        <nd ref="540653724" /> 
        <nd ref="25507043" /> 
        <nd ref="107762" /> 
        <nd ref="25507038" /> 
        <nd ref="107759" /> 
        <tag k="highway" v="primary" /> 
        <tag k="lcn_ref" v="6a" /> 
        <tag k="name" v="Parliament Street" /> 
    </way> 
</osm>

看起來倒確實蠻簡單的,至少比我的第一次那個簡單,O(∩_∩)O~。ref 屬性告知走的是哪個“點”,簡單明了。

image

Relations

關系這東西挺復雜的。可以有節點,有路子,還有其他關系,亂亂的。總之就是一堆基本數據類型及其組合形成的東東。來看個關系:

<osm version="0.6" generator="OpenStreetMap server"> 
    <relation id="113421" visible="true" timestamp="2009-11-03T10:08:27Z" 
        version="2" changeset="3023369" user="Jonathan Bennett" uid="5352"> 
        <member type="node" ref="270186" role="via" /> 
        <member type="way" ref="4418767" role="from" /> 
        <member type="way" ref="4641665" role="to" /> 
        <tag k="restriction" v="no_right_turn" /> 
        <tag k="type" v="restriction" /> 
    </relation> 
</osm>

暈了吧,這家伙的意思是說,“不准右拐”。書上也說了,這是 OpenStreetMap 最不成熟的數據類型。

Changesets

除了三個基本數據類型外,還有Changesets這么一個小弟。顧名思義,就是用來表示變化的。

<osm version="0.6" generator="OpenStreetMap server"> 
    <changeset id="1787116" user="Jonathan Bennett" uid="5352" 
        created_at="2009-07-10T09:52:28Z" closed_at="2009-07-10T09:52:31Z" 
        open="false" min_lon="-4.4224237" min_lat="56.1382502" max_lon="-3.9613266" 
        max_lat="56.6330162"> 
        <tag k="created_by" v="JOSM" /> 
        <tag k="comment" v="Additions and edits to NCR7" /> 
    </changeset> 
</osm>

可以看到,變化的信息並沒有體現在這里,你要到數據庫里把對應的XML下下來才知道。描述和內容是分離的。

The tagging system

大家已經看到很多tag標簽了,tag干嘛用的呢。tag 是一個鍵值對,用來告訴你真實世界的情況。一個Key當然只能有一個valuse,但我想要有多個怎么辦呢。有辦法,客管請看:

<osm version="0.6" generator="OpenStreetMap server"> 
    <node id="107775" lat="51.5072647" lon="-0.1278328" version="29" 
        changeset="2628959" user="EdinburghGael" uid="170586" visible="true" 
        timestamp="2009-09-25T23:04:28Z"> 
        <tag k="place" v="city" /> 
        <tag k="name:zh" v="倫敦" /> 
        <tag k="name:sv" v="London" /> 
        <tag k="name:sk" v="Londyn" /> 
        <tag k="name:ru" v="Лондон" /> 
        <tag k="name:fi" v="Lontoo" /> 
        <tag k="name:es" v="Londres" /> 
        <tag k="name:gv" v="Lunnin" /> 
        <tag k="name:zh_pyt" v="Lúndūn" /> 
        ... 
        <tag k="is_in" v="England, United Kingdom, UK, Great Britain,Europe" /> 
        <tag k="capital" v="yes" /> 
        <tag k="name:fr" v="Londres" /> 
        <tag k="name:cy" v="Llundain" /> 
    </node> 
</osm>

其實就是加前綴或者后綴啦,是不是有點像Java里的國際化。

“Any tags you like”

大意就是你可以隨意應用tag,沒有限制。其實就是可以自定義tag,告訴 OpenStreetMap 這個tag 的含義是什么,代表的什么意思。說是沒有限制,其實還是有限制的,"Don't tag for the renderer"。就是不要動原來的描繪器。

這章最后列出了幾個網址,介紹了核心tag和常用第三方工具:

http://wiki.openstreetmap.org/wiki/Map_Features http://osmdoc.com/en/tags/ http://tagwatch.stoecker.eu/ 

http://www.google.com/cse/home?cx=015487330990472192076:qvmeg3q9qus 

看完這一章后,有點想我的第一個項目了。“呀哈,我是不是可以把他再完善完善(⊙o⊙)?”。。。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM