close

介紹   

  OSM(開放街圖)是由Stephen Coast創建,目的是創造一個自由且開放的地理資訊創作,每個都可以個人名義簡單註冊並且上傳更新地理資訊,當然大家都可以很簡易並且無須任何費用使用所有OSM任何資源,可以說是地圖版的維基百科,目前由英國非營利組織OpenStreetMap基金會贊助維運

  可能很多人會覺得google地圖就很好用了,為什麼還要用OSM呢?其實OSM概念跟維基百科一樣,世界上有那麼大量的地理訊息要如何將這些訊息資料化呢?最好的方法就是動用群眾的力量,利用簡單的器材與手機GPS功能就可以簡易的更新整個世界地理資訊了,但是更深層面來說,街景與地理位置都是我們一起產生的訊息,的些訊息資料化後放在網路上應該是公正公開並且無須費用,而不是由一些大公司把持著,當我們需要這些訊息時在跟我們收取費用,所以可以想想我們在網路上產生的任何是屬於該公司私有還是屬於我們的?FB或是Twitter是否可以直接把你我的數據賣給其他公司營利使用(事實上Twitter已經將使用者資料出售給DataSift.GNIP等公司)?假如你跟我一樣支持網路資訊平等公開化就一起支持OSM吧~

  由於OSM是由許多散布在世界上的使用者自行更新的資料,所以很多人可能會懷疑這樣的資料的正確性,的確沒有人可以百分之百保證OSM的資料都是正確的,但是大家有想過Google maps資料真的正確嗎?當一條路段已經改變了,Google maps有能力立刻知道並且改變嗎?但是假如OSM使用人數夠多,OSM制度能夠立刻更改成新版本的路況,甚至當同路段資料量夠大還可以利用大數據的方式由雜亂資料運算出最正確的路況,而且我們可以看到維基百科目前狀況,在某些專業搜尋中幾乎是信任的資料,現在有許多公司也在使用OSM,例如:Foursquare.MapBox據說FB亞洲區也是使用OSM,所以我認為OSM的方向基本上正確,說不一定在未來的一天它會替代Google Maps成為主要的地圖使用方法

使用教學

 OSM支援在官網直接查詢.網頁地圖鑲嵌.更新資料API.路程計算API.手機行動裝置在線離線使用..等,這邊挑選官網查詢.網頁地圖鑲嵌.路程計算API.離線地圖做說明,其他部分可能要去OSM官網看囉~

1.官網查詢

可以點官網此連結到OSM查詢頁面,大概看一下頁面應該很好理解,跟google maps一樣,可以搜尋地址.景點名稱.經緯度找到地圖上該點位置,也可以兩點路線規劃,比較特別的是按下"開始製圖"可更新地圖,而且可以很簡單的註冊,基本上只要填上Email密碼暱稱就可以了,而且OSM非常強調不會主動蒐集個人資訊或與其他第三方分享你的email個人訊息,所以基本上是很保護隱私的站台,有機會的話可以多多貢獻地理資訊~

1448694566920  

2.網頁地圖鑲嵌

OSM有提供OpenLayers的方法,其實OpenLayers是一個簡單呈現地理資訊的js方法,第一步先去OpenLayers官網下載整JS,然後再把JS引用進來

 <script src="js/OpenLayers-2.13.1/OpenLayers.js"></script>

第二步把HTML架構好,用個id為testMap的div裝地圖

<div id="testMap"></div>

第三步把Javascript部分完成

 

<script>
function init() {
map = new OpenLayers.Map("testMap");
var mapnik = new OpenLayers.Layer.OSM();
var fromProjection = new OpenLayers.Projection("EPSG:4326"); // Transform from WGS 1984
var toProjection = new OpenLayers.Projection("EPSG:900913"); // to Spherical Mercator Projection
//經度,緯度
var position = new OpenLayers.LonLat(121.564101, 25.033493).transform(fromProjection, toProjection);
//放大比例
var zoom = 15;
var markers = new OpenLayers.Layer.Markers("Markers");
map.addLayer(markers);
markers.addMarker(new OpenLayers.Marker(position));
map.addLayer(mapnik);
map.setCenter(position, zoom);
}

</script>

這段javascript是利用OpenLayers方法將OSM引用進來,設定畫面預設經緯度與地圖呈現大小,然後插上標記,最後當body onload時呼叫init(),其實就這麼簡單就可以將地圖鑲嵌在頁面上了

1448782169691  

按此處下載範例

 3.路程計算器(Open Source Routing Machine)

Open Source Routing Machine是利用OSM做出的路程計算器,OSRM有做一系列路程查詢API,但是因為這API沒有使用數量的限制,所以API並無法擔保使用效能與速度,目前這API是設定為demo用,假如有重要商業用途還是建議可以自己架一個OSRM伺服器,OSRM API都是以GET方式取得Json資料,例如:viaroute方法是取多點開車最短的距離與時間,所以只要將多點經緯度帶入網址參數即可,如此範例網址http://router.project-osrm.org/viaroute?loc=25.033493,121.564101&loc=21.901880,120.851948&instructions=true,最後會回傳這兩點最短路線如何行走與總距離時間等訊息。

4.OsmSharp 離線使用範例(.NET C#)

 OsmSharp主要專門針對最佳路徑與旅行業務問題(TSP),支援多種平台架構,例如:iOS.Android.Windows等,並且可離線使用,在這邊就只挑.NET路線計算介紹,其他部分可看OsmSharp官網,官網都有詳細功能介紹與完整範例唷~

第一步必須先下載.NET OsmSharp SDK,然後加入參考,或是在NuGet使用指令安裝

PM> Install-Package OsmSharp

1450081548270  

然後下載地圖查詢檔案,OSM維基百科有提到,官方會定期更新這些檔案,OSM也有提供各地區單獨地圖查詢檔案,這邊是以台灣台北做為範例(taipei.osm.pbf)

最後將計算路程程式完成

 

//取得台北地圖資料
var router = Router.CreateLiveFrom(
new PBFOsmStreamSource(new FileInfo(Server.MapPath("taipei.osm.pbf")).OpenRead()), new OsmRoutingInterpreter());
//101經緯度
var resolved1 = router.Resolve(Vehicle.Car, new GeoCoordinate(25.033493, 121.564101));
//中正紀念堂經緯度
var resolved2 = router.Resolve(Vehicle.Car, new GeoCoordinate(25.036636, 121.517716));
//計算
var route = router.Calculate(Vehicle.Car, resolved1, resolved2);
//儲存XML資料
var GpxFile = new FileInfo(Server.MapPath("route.gpx")).OpenWrite();
route.SaveAsGpx(GpxFile);
GpxFile.Close();
//兩點距離
var intDistance = route.TotalDistance;

這樣就可以在離線狀態取到兩點最佳路徑資訊了

按此處下載範例

 需要整個完整全部範例可按下載所有範例(.NET專案)


arrow
arrow
    創作者介紹
    創作者 Art Chen 的頭像
    Art Chen

    以最謙卑的眼看世界

    Art Chen 發表在 痞客邦 留言(2) 人氣()