百度地图下载、拼接与坐标改正思路与实例
地圖下載器有很多種,大多數(shù)據(jù)下載器對(duì)用戶有限制,并且下載的數(shù)據(jù)坐標(biāo)不能夠辦好與GPS套合,坐標(biāo)精度不高,作者通過對(duì)百度瓦片數(shù)據(jù)的分塊編號(hào)、坐標(biāo)依移及坐標(biāo)解算等方面進(jìn)行分析,自己完成下載、拼圖與坐標(biāo)解算等,并能夠與GP數(shù)據(jù)很好套合。
1、百度瓦片規(guī)則(注意與GOOGLE 的分幅規(guī)則有很大的不同)
(1)經(jīng)緯度
這個(gè)就不多說了,不熟悉的可以翻翻地理書。但需要注意的是即便同是經(jīng)緯度坐標(biāo)也可能屬于不同的坐標(biāo)體系。一般GPS設(shè)備獲取的經(jīng)緯度屬于WGS84坐標(biāo)系,這是一個(gè)比較通用的坐標(biāo)體系。由于某些原因國(guó)內(nèi)不能直接使用WGS84坐標(biāo),因此百度地圖API的經(jīng)緯度是經(jīng)過加密偏移的。
(2)平面坐標(biāo)
前面說過,球面上的形狀需要經(jīng)過投影才能變換為平面上的形狀,變換后就需要有一個(gè)平面坐標(biāo)系統(tǒng)來描述地圖上某個(gè)位置。百度地圖API默認(rèn)使用墨卡托投影(Mercator Projection),同樣需要注意的是由于投影參數(shù)不同,同樣是墨卡托投影也會(huì)有所差別。
平面坐標(biāo)系的原點(diǎn)與經(jīng)緯度的原點(diǎn)一致,即赤道與0度經(jīng)線相交的位置:
在百度地圖API中,平面坐標(biāo)是以最大級(jí)別18級(jí)為基準(zhǔn)的。就是說在18級(jí)下,平面坐標(biāo)的一個(gè)單位就代表了屏幕上的1個(gè)像素。平面坐標(biāo)與地圖所展示的級(jí)別沒有關(guān)系,也就是說在1級(jí)和18級(jí)下,天安門位置的平面坐標(biāo)都是一致的。
(3)像素坐標(biāo)
在第18級(jí)下,我們直接將平面坐標(biāo)向下取整就得到了像素坐標(biāo),而在其他級(jí)別下可以通過如下公式進(jìn)行換算(這里取整為向下取整)像素坐標(biāo)= |平面坐標(biāo) ×2 zoom-18|
(4)圖塊坐標(biāo)(瓦片編號(hào))
百度地圖API在展示地圖時(shí)是將整個(gè)地圖圖片切割成若干圖塊來顯示的,當(dāng)?shù)貓D初始化或是地圖級(jí)別、中心點(diǎn)位置發(fā)生變化時(shí),地圖API會(huì)根據(jù)當(dāng)前像素坐標(biāo)計(jì)算出視野內(nèi)需要的圖塊坐標(biāo)(也叫圖塊編號(hào)),從而加載對(duì)應(yīng)的圖塊用以顯示地圖。
百度地圖的圖塊坐標(biāo)原點(diǎn)與平面坐標(biāo)一致,從原點(diǎn)向右上方開始編號(hào)為0, 0:
如何知道某個(gè)位置的圖塊坐標(biāo)呢?通過如下公式計(jì)算即可(這里為向下取整):
圖塊坐標(biāo) = |像素坐標(biāo) ÷ 256|256實(shí)際上是每個(gè)圖塊的寬度和高度,我們用像素坐標(biāo)除以這個(gè)數(shù)就知道圖塊坐標(biāo)了。還以天安門為例,在第4級(jí)下天安門所在的圖塊編號(hào)為:3, 1,而在第18級(jí)下,圖塊編號(hào)為:50617, 18851
(以上內(nèi)容整理 jz1108的"百度地圖API詳解之地圖坐標(biāo)系統(tǒng)“)
2、百度與GOOGLE分塊的比較
百度是從中心點(diǎn)經(jīng)緯度(0,0)度開始計(jì)算瓦片,在第1級(jí)時(shí)百度將世界地圖分為4塊。
(1)編號(hào)規(guī)則不同
中心點(diǎn)右上部分(中國(guó)地區(qū))占1塊。
谷歌是從左上角經(jīng)緯度(-180,85.00..)度開始計(jì)算瓦片,在第1級(jí)時(shí)谷歌將世界地圖分為1塊。
(2)圖幅分辨率不同
百度分辨率計(jì)算公式:
Double res = math.pow(2,(18 - n)) // n為層數(shù)(1-18)
谷歌分辨率計(jì)算公式:
Double tileSize=256 //瓦片尺寸(256*256)
Double initialResolution = 2 * math.pi * 6378137 / tileSize //6378137為球體半徑
Double res = initialResolution /math.pow(2,zoom) //zoom為層數(shù)(0-21)
?
這是因?yàn)樵谶@級(jí)百度的地圖分辨率為65536米/像素,分辨率=math.pow(2,(18 - n))。
WGS84球體周長(zhǎng):40075016.685578488,球體周長(zhǎng)一半為20037508.34米。
瓦片個(gè)數(shù)=20037508.34/(65536*256)=1.19。
?
因此GOOGLE 與百度的瓦片基本上對(duì)不上號(hào),同一層每一圖塊的地理范圍也不同。
?
?
(以上部分來源于"百度與谷歌地圖瓦片組織方式對(duì)比“,修正其中有誤的地方,其中有關(guān)計(jì)算圖號(hào)對(duì)應(yīng)的設(shè)想可以商討)
(3)百度地理坐標(biāo)與實(shí)際投影平面坐標(biāo)不一至
如圖,相應(yīng)的經(jīng)緯度在地圖上對(duì)應(yīng)的平面坐標(biāo)與實(shí)際計(jì)算值相關(guān)較大,此位置大約2公里,不同的位置還不一樣,赤道位置為0。因此要正確使用百度地圖首先要改正百度地圖本身的坐標(biāo)位置偏移。
(3)地理位置的誤差
在消除上述誤差后,所獲取的地理坐標(biāo)與實(shí)際位置地理坐標(biāo)還不一樣,這就是國(guó)內(nèi)所謂的BM要求,加入了位置偏差,大約一百多米,要經(jīng)過計(jì)算消除。下圖為13層圖像拼接坐標(biāo)改正后與GPS數(shù)據(jù)的疊加效果。
3、百度地圖的下載
百度地圖下載的工具很多,(GOOGLE下載最多,前幾年還使用一個(gè)叫"稻歌"的軟件,利用WEB緩存進(jìn)行處理,有點(diǎn)意思,但下載要瀏覽所有地圖,從而才能在系統(tǒng)緩存中留下地圖鏈接,通過下載地圖鏈接即可下載地圖瓦片,從而實(shí)現(xiàn)地圖下載;其它軟件下載通過分析地圖軟件的圖片地址,解算并下載圖片,這種方式下載速度快,但要考慮地圖服務(wù)器不斷變動(dòng)的實(shí)際情況,更新相應(yīng)的地址生成方式。目前比較明確的有百度、GOOGLE、高德、騰訊、OpenStreet等地圖,但一起沒有找到凱立德地圖瓦片的下載地址。
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的百度地图下载、拼接与坐标改正思路与实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python过年倒计时 倒计时窗口 py
- 下一篇: MFC之CString对象的各种函数