相信絕大多數人都知道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。
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 屬性告知走的是哪一個「點」,簡單明瞭。
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⊙)?」。。。。。。