開源地圖MapBox自定義(二):基本概念

上篇介紹了基本的mapbox安裝和配置問題,本篇開始介紹mapbox的工作邏輯。
因地圖和數據相關的東西,國內一向敏感,因此特事先聲明:

本博客系列僅借用開源地圖mapbox,試圖從代碼和設計角度說明一款開源地圖是如何實現的,僅作爲研究和學習之用。不會提供具體的數據格式的解析相關內容,更不會提供任何數據。示例數據使用的是mapbox提供的數據。如有相信或使用本博客或相關的代碼而導致的任何問題或後果,本人不負任何責任。

csdn也有markdown編輯了,以後的博客儘量採用markdown編輯器來寫,當作對自我的要求吧,markdown也是比較火的標記語言,很方便用來展示一些所需的格式,也很方便的導出html,pdf等格式,各大瀏覽器也基本支持。
活到老而學到老,最近看mapbox源代碼,再想想之前的公司所做的跨平臺地圖,mapbox真的高的不是一點半點。學無止境啊。


基本概念

很多人都用過高德或者百度的地圖sdk(當然主要原因還是404的問題,不然應該都是用google了吧)。事實上,對於GIS相關行業的同學,使用的更多的是arcgis之類的sdk,和百度/高德的sdk相比,方向和側重性是完全不同的。

百度和高德更側重於顯示用戶在地圖上的附加的標記(因爲用戶並不會關心數據怎麼來,數據格式是什麼,用戶更關心怎麼在地圖上的合適位置顯示出自己業務相關的東西。例如滴滴打車和摩拜ofo,更關心的是怎麼在地圖上顯示出用戶附近的車子,車子很多的時候顯示多少個圖標既不顯得擁擠又能看出來我有很多車,用戶點了圖標應該彈出來什麼窗口)。
而GIS應用則完全不同,首先關心的是數據和座標系的問題,每個客戶都有自己的數據,數據依賴的座標系不同,很多客戶爲了數據保密,還都是各種加密。其次各種業務更可能是顯示的千奇百怪。與數據相關的座標系,更是各種火星座標系(不知道火星座標系的梗的同學,建議去搜索一下),至於業務,則跟普通互聯網地圖要求同樣高。。。(開發GIS相關的同學,不容易啊。。)。

好了,言歸正傳,對於一款普通地圖sdk,首先有幾個基本概念和地圖元素是必須要弄明白的,否則可能會和通用理解有偏差,從而走入各種誤區。

mapview

mapview對外是一個控件,可以認爲是一個自定義的view。該view能顯示地圖,並且提供了一些能夠控制和改變內部顯示的元素的API(API也可能不由mapview直接給出,而是通過某個中間類或中間模塊間接給出)。
當把sdk提供給第三方使用時,第三方使用的第一步便是顯示該mapview。

layer

layer是顯示在mapview上的“一層”元素,是一個邏輯概念。mapview上可以放置多個layer,layer內的顯示內容通常是通過相應的API由用戶給出,用戶可以很方便的控制一個layer的顯示/顯示或其他相關操作。

視口

視口可以簡單理解爲屏幕範圍內mapview控件所顯示的位置,但真正表示的不僅僅是控件所在的屏幕上的物理像素位置和大小,同時也表示所顯示的邏輯地理範圍。

比例尺和分辨率

比例尺和分辨率的概念一向比較容易迷惑人,甚至很多人都搞不清楚這兩個名詞到底是什麼關係。
比例尺是一個比例單位,表示圖上一條線段的長度與地面相應線段的實際長度之比。比例尺事實上是有3種表示方法的,但作爲mapview的開發者,更關注的是線段表示長度,例如,當前地圖上50公里的距離應該畫幾釐米長,隨着地圖的放大或縮小,該長度可能會變長/變短,畫到幾釐米的時候,應該切換顯示的公里單位(從50公里換成25公里之類)。
分辨率是當前顯示的一個像素能代表的地面長度。例如一個像素表示的距離是100米,則1km在地圖上顯示的長度是10個像素。
兩者之間的表示意思其實是很相似的,都是表示一個比例關係,但是其中的差別體現在設備DPI的區別。例如兩個同樣物理尺寸的設備上顯示相同分辨率的地圖,均爲1像素表示100米,A設備的DPI是B設備的兩倍,也就是屏幕是1釐米之內的物理像素是另外一個兩倍,則A設備一屏幕內顯示的地理長度和寬度均會是B設備的兩倍,也就是4倍的地理面積。
正因爲如此,所以二者換算時,需要帶入DPI進行換算。具體的換算邏輯爲:
1釐米對應的英寸inpcm=1/2.54,(1英寸爲2.54釐米)
1釐米表示的像素長度ppcm=1釐米對應的英寸inpcm*DPI
1釐米表示的地理長度gpcm=1釐米表示的像素長度ppcm*分辨率res

數據的在線/離線/緩存

在線數據一般比較容易理解,就是從服務器獲取來的數據。
緩存數據則是在使用在線瀏覽時,下載並暫時緩存在本地的數據,當無網絡可用時,可直接使用該緩存數據顯示,此過程用戶一般是無感知的。
離線數據則是用戶主動下載到本地的,以供無網絡時顯示或減少網絡流量請求。

Marker

marker是一個很容易迷惑人的概念,也是附加到地圖上的附屬物中最複雜的一個。和一般附加到地圖上的點線面不同,marker一般會自帶圖片顯示,甚至還有偏移的錨點,marker的點擊和選中事件在部分mapview的設計中,甚至有自己的獨立定義。

在很多mapview的設計中,marker都不像一般的點線面,永遠隨着地圖拖動而同步移動,而是在移動過程中,marker並不是實時移動,而等待地圖移動完畢,marker才一次移動到位(之所以需要這樣設計,是因爲除3維紋理貼圖外,大部分圖片的顯示都是通過正交投影貼到地圖上顯示的,這裏有一個座標換算的過程,頻繁的座標換算會極大影響效率,後續的博客會單獨講marker或其他帶圖片的特殊元素實現)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章