每日一讀 Packtpub.OpenStreetMap(1)

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

Making a Free, Editable Map of the Worldgit

簡要介紹了OpenStreetMap的歷史,從最初的Java到如今的Ruby on Rails.數據庫

Getting started at openstreetmap.orgapi

http://www.openstreetmap.org/ 登進去後,能夠看到兩個定位搜索引擎:Nominatim 和Geonames。書中建議註冊一個帳戶,那就建個唄。而後囉嗦的介紹了一通openstreetmap。數據結構

Gathering Data using GPSdom

顧名思義,用GPS來收集信息。苦於囊中羞澀,玩不起GPS,直接跳過了。但本章最後一小節仍是照顧了我一下,Collecting information without a GPS。你收集不到數據,幫人家改改數據仍是能夠的。大致須要用到這麼兩個網站:ide

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。

p_w_picpath

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 屬性告知走的是哪一個「點」,簡單明瞭。

p_w_picpath

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⊙)?」。。。。。。

相關文章
相關標籤/搜索