离线地图----百度地图2.0 转自开源中国
鑒于許多人詢問百度地圖2.0怎么搞?因為搞過1.3,所以感覺2.0應該也是不難搞的。因此本文整理一下2.0版離線程序的過程。
本過程完全基于1.3版的離線程序,因此許多資源如何下載就不重復了。瓦片都是一樣的,相關的文件只有兩個:第一個是api主文件,暫且命名apiv2.0.min.js吧,這樣和apiv1.3.min.js格式就完全一致了。另一個是模塊插件文件,命名為getmodulesv2.0.js。
?
1. 下載api主文件
api文件的地址請訪問http://api.map.baidu.com/api?v=2.0。在線版使用該鏈接引入百度地圖的js,還需要增加一個ak參數,就是應用注冊時拿到的應用代碼。這個代碼是私有的,我就補貼出來了。事實證明無需這個代碼能拿到主api文件,并且是完全沒有問題的。
從這個地址拿到的是一段代碼,里面有一個鏈接,打開它就能拿到api主文件了。
2. 修改api主文件
2.1 加載模塊短路處理
搜索下面的代碼:“Pb(e.aG.MP+"&mod="+a.join(","))”,不包括兩端的中文引號
替換成為:“Pb("js/getmodules2.0.js")”
?
2.2 加載瓦片改為離線瓦片
搜索下面的代碼:”Uc.getTilesUrl“,不包括兩端的中文引號
將其實現改為:Uc.getTilesUrl=function(a,b,c){var x=a.x,y=a.y,e=1,z=b;return "tiles/"+z+"/"+x+"/"+y+".png";}
這時基本上就修改好了,只是還存在一個問題,就是非法調用的問題。
2.3 去掉ak驗證
ak驗證是通過jsonp來實現的,具體在哪里調用的不清楚,但只要把jsonp工具移除就Ok了。
function?Pb(a,?b)?{if?(b)?{var?c?=?(1E5?*?Math.random()).toFixed(0);z._rd["_cbk"?+?c]?=?function(a)?{b?&&?b(a);delete?z._rd["_cbk"?+?c]};a?+=?"&callback=BMap._rd._cbk"?+?c}var?d?=?K("script",?{type?:?"text/javascript"});d.charset?=?"utf-8";d.src?=?a;d.addEventListener???d.addEventListener("load",?function(a)?{a?=?a.target;a.parentNode.removeChild(a)},?q)?:?d.attachEvent&&?d.attachEvent("onreadystatechange",?function()?{var?a?=?window.event.srcElement;a?&&?("loaded"?==?a.readyState?||?"complete"?==?a.readyState)&&?a.parentNode.removeChild(a)});setTimeout(function()?{document.getElementsByTagName("head")[0].appendChild(d);d?=?p},?1) }把這個方法找到,里面的內容不解釋了,自己看吧。把里面的代碼都清空就O了。
修正!2.1步驟里面調用了該方法加載模塊代碼,因此清空是不行的!運行沒問題,但擴展就不行了!改成這樣:
function?Pb(a,?b)?{if?(/^http/.test(a))//這里判斷一下,如果是調用外部資源就退出去好了return;if?(b)?{var?c?=?(1E5?*?Math.random()).toFixed(0);z._rd["_cbk"?+?c]?=?function(a)?{b?&&?b(a);delete?z._rd["_cbk"?+?c]};a?+=?"&callback=BMap._rd._cbk"?+?c}var?d?=?K("script",?{type?:?"text/javascript"});d.charset?=?"utf-8";d.src?=?a;d.addEventListener???d.addEventListener("load",?function(a)?{a?=?a.target;a.parentNode.removeChild(a)},?q)?:?d.attachEvent&&?d.attachEvent("onreadystatechange",?function()?{var?a?=?window.event.srcElement;a?&&?("loaded"?==?a.readyState?||?"complete"?==?a.readyState)&&?a.parentNode.removeChild(a)});setTimeout(function()?{document.getElementsByTagName("head")[0].appendChild(d);d?=?p},?1) };向大家道歉!
2.4 本地工具資源的引用
搜索“z.url.domain.main_domain_cdn.baidu[0]”,能夠找到z.ma的定義,將其置為空串即可。z.ma="";
2.5 去掉對blank.gif調用
搜索“nb=o,setTimeout”,去掉對blank.gif的調用,把function體內的代碼都清除即可,即:
function(a){a&&(nb=o,setTimeout(function(){}, 50))};
如果你要求不嚴格,這步可以不做。
3. 下載模塊代碼
從2.1步驟中可以知道,模塊是通過一個連接下載下來的,再次訪問這個連接可以獲得一個js文檔,命名為getmodules2.0.js丟到js文件夾中就行了。當然,2.1里面怎么寫,這里就怎么做。
這個地址大約是這樣的:
http://api0.map.bdimg.com/getmodules?v=2.0&t=20140707&mod=newvectordrawlib_hmclwu
如果要擴展就得自己查看模塊路徑啦。
?
好了,其他的都還用1.3的內容。可能有一些擴展功能不兼容,但總體上是一樣的。Enjoy it!
?
代碼下載點擊這里
補記:
事情總是戲劇性發展,這是始料未及的。
我已開始研究這個2.0版本的時候,我在本地建立的文件夾是v2.0,然后一切很順利,跑起來也很正常。但是IE下一直不正常,我就繼續在研究(我主要用火狐,觀察比較方便)。結果發現,除了上面把加載模塊的代碼給錯誤的屏蔽了之外,如果我的代碼拷貝到別的文件夾下就運行不正常,癥狀和IE一樣。再進一步發現,v2.0這個文件夾改名為別的也出現這樣的錯誤。
一開始以為是緩存的問題,清緩存,還是不行,必須文件夾在我一開始的位置上,名字都不能變,改名就不行,換位置也不行。
經過進一步的跟蹤,發現問題出現在load方法上:
var?load=function(a,b,c){var?d=this.gb(a);if(d.Bd==this.Fj.Zp)c&&b();else{if(d.Bd==?this.Fj.hG){this.bK(a);this.jN(a);var?e=this;e.zC==q&&(e.zC=o,setTimeout(function(){for(var?a=[],b=0,c=e.Md.En.length;b<c;b++){var?d=e.Md.En[b],l="";ja.Gy.VJ(d)?l=ja.Gy.get(d):(l="",a.push(d+"_"+Qb[d]));e.Md.Pv.push({DM:d,EE:l})}e.zC=q;e.Md.En.length=0;alert(a);//這里很重要!幫助我們找到我們需要加載的模塊!0==a.length?e.LK():Pb("js/getmodules.js")//這里原先是:Pb(e.aG.MP+"&mod="+a.join(","))},1));d.Bd=this.Fj.vP}d.Pu.push(b)} }問題就在于,a是一個數組,是統計到底哪些模塊是沒有加載進來的,需要發起請求來到網絡上去再加載。
好了,當目錄在我原先的v2.0里面的時候,a數組為空,并不需要再加載,因此調用的是e.LK(),這個方法到底干了寫什么,我也不清楚,太亂了。但是目錄換了,好家伙,a數組是一個好長的東西,長度15,是否會更長,我也不知道。
看到我alert一下了吧,在火狐底下是可以復制這個對話框里面的內容的。然后把它放在步驟3給出的連接后面去下載這些代碼,然后放在2.1里面規定的js里面,然后就一切搞定,IE下也表現正常了。這個文件一下子膨脹到了433KB,真是恐怖啊!
后來收集了幾次,列出如下:
map_3uc0wi,scommon_ktwwno,mapclick_pispkz,oppc_kh0en0,vectordrawlib_o0famu,style_fcoka2,tile_5r2pa2,navictrl_vohbha,canvablepath_x52cuy,common_5w45zj,symbol_fwsijz,marker_25gtk1,draw_o13qo0,drawbysvg_wqhg4u,poly_qwgivy
canvablepath_x52cuy,common_5w45zj,symbol_fwsijz,marker_25gtk1,draw_o13qo0,drawbysvg_wqhg4u,poly_qwgivy
copyrightctrl_4v1wlk
hotspot_41pssw
現在我仍然不明白,我的v2.0目錄咋就不需要這些東西呢?因為不需要,所以也就不加載getmodules.js里面的內容了,這也導致擴展成問題了。到底什么時候需要,什么時候不需要呢?
好在這個加載過程是被動態調用的,就是你需要的時候才去加載。因此擴展的時候一定把功能跑全了,每彈出這個對話框的時候,都意味著要加載額外的代碼。收集這些信息,一次性加載到getmodules.js里面就OK了。不會重復加載模塊的。
?
為了兼容IE9以下的版本,需要在demo.html里面增加一句:
<meta?http-equiv="X-UA-Compatible"?content="IE=edge,chrome=1">在此謝過@woodj
總結
以上是生活随笔為你收集整理的离线地图----百度地图2.0 转自开源中国的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fckeditor漏洞_三十,文件上传漏
- 下一篇: 全国计算机b级试题及答案,全国计算机等级