雖然百度地圖有自己的 JavaScript API,,但是有時候,一個項目已經(jīng)用 OpenLayers 做了很多功能,,不可能棄之不用,,同時,又想使用百度地圖,,該怎么辦呢,?所以很多人想使用 OpenLayers 調(diào)用百度地圖,,本文就討論一下其可能性和實現(xiàn)原理。 一,、 地圖調(diào)用原理分析我們以百度地圖為例,,分析其地圖調(diào)用原理,我們都使用過百度地圖,,在網(wǎng)速不快的情況下,,肯定有過感受,地圖是一塊一塊加載的,,從這里我們就可以看出,,地圖是被切成了很多塊的小圖片,調(diào)用時按照一定規(guī)則請求需要的“切片”,,可視區(qū)域以外的“切片”不加載,,這樣可以減小數(shù)據(jù)傳輸數(shù)據(jù)量,使地圖加載更快,。 我們 F12 查看瀏覽器的網(wǎng)絡(luò)圖片請求,,可以證實我們看到的現(xiàn)象,每一個圖片切片都是 256*256 尺寸的圖片:
仔細看每一個請求: http://online0.map./onlinelabel/?qt=tile&x=707&y=217&z=12&styles=pl&udt=20151021&scaler=1&p=1,, 其中,,http://online0.map./onlinelabel/?,表示百度地圖的圖片緩存地址,;qt=tile 表示請求類型(Quest Type)為 切片(tile),;x=707&y=217,請求的切片位于整張地圖中的坐標(biāo)位置,;z=12,,是指當(dāng)前的地圖縮放級別是 第 12 級,為什么會分級呢,?因為瀏覽地圖時我們注意到地圖是可以放大縮小的,,放大后我們可以看到地物的更多細節(jié),同時 z 值會越大,;styles=pl,,可能是返回地圖的樣式;udt=20151021,,應(yīng)該是上一次切片的更新時間(Update DateTime)是2015年10月21號,,為什么需要更新地圖呢?因為地圖是真實世界的抽象,,真實世界就是處在不斷的變化中的,,所以地圖要實時更新;至于后兩個參數(shù) scaler=1&p=1 ,本人不是百度的員工,,就不太清楚是什么了,。 所有的“切片”請求,一共有 21 個,,用網(wǎng)格形式表示“切片”布局如下圖(其中橫坐標(biāo)和縱坐標(biāo)是由請求 URL 中的 x 和 y 參數(shù)決定的):
那么我們清楚了地圖請求的原理,,下一步就是要驗證一下請求百度的地圖是否需要一定的權(quán)限呢?我們點擊每一個請求的 URL ,,可以看到其對應(yīng)的圖片,,說明不需要特殊的權(quán)限便可以訪問百度的切片地圖,這樣我們就可以自己編寫程序來調(diào)用百度的切片地圖,。 二,、 編寫調(diào)用程序現(xiàn)在,我們要著手編寫程序調(diào)用百度地圖了,,最終的結(jié)果是在瀏覽器中顯示地圖,,那么我們首先要根據(jù)用戶的交互確定兩個主要的參數(shù):縮放級別、視圖中需要的切片 x y 索引,。然后構(gòu)造相應(yīng)的請求 URL,,再按照相應(yīng)的索引拼接地圖切片,這樣我們就能完成調(diào)用地圖了,。 好了,,講完原理,我們是否要馬上就開始著手編寫嗎,?不要這么著急下手,,我們在開始一項任務(wù)的時候,首先在比如 GitHub 的開源項目網(wǎng)站上尋找一下是否有已經(jīng)實現(xiàn)你需要功能的開源項目,,要盡量避免重復(fù)造輪子,。OpenLayers 便是我們理想的 JavaScript 工具庫,實現(xiàn)了大部分我們需要的操作,,所以我們不必再需要自己從頭開始構(gòu)建,。 首先貼出實現(xiàn)調(diào)用效果圖:
2.1 關(guān)鍵代碼下面是調(diào)用的關(guān)鍵代碼:
注: 我們分析一下以上的關(guān)鍵代碼,,首先,初始化一個圖片切片地圖數(shù)據(jù)源,, 然后,,使用圖片切片地圖數(shù)據(jù)源初始化一個 切片圖層: 三、 總結(jié)結(jié)果表明,,使用 OpenLayers 3 可以成功調(diào)用百度地圖,。文章里主要講了百度地圖的切片地圖的調(diào)用原理,并簡要闡釋了切片地圖的組織結(jié)構(gòu),,以及使用 OpenLayers 3 調(diào)用百度地圖的關(guān)鍵代碼,。 本文并沒有對其他的地圖做實驗,如 谷歌地圖,、必應(yīng)地圖,、騰訊地圖、搜狗地圖,、天地圖等地圖,。如果需要使用相關(guān)地圖,你可以使用本文的方法檢查其可用性,,找出其請求規(guī)律,,然后根據(jù)實際情況構(gòu)造 URL ,替換關(guān)鍵代碼中 tileUrlFunction 中 return 的URL,。 好的,,就寫到這里,,有什么問題,可以到文章下面評論,。 參考文章 |
|
來自: primivite_ > 《geoserver》