google地圖經(jīng)緯度偏移修正算法完美解決方案由于受到國(guó)家一些法律法規(guī)限制,所有的電子地圖服務(wù)提供商都需要給地圖數(shù)據(jù)加上偏移和加密,,因此廣受大家關(guān)注的google地圖也不例外,。但是作為一些用慣了免費(fèi)服務(wù)的網(wǎng)友們,,始終對(duì)google MAP上的標(biāo)注偏移很頭疼,我收集了一些資料,,今天在這里和大家一起分享,。 所謂的地圖數(shù)據(jù)加密偏移,其實(shí)就是用一個(gè)偏移算法對(duì)地圖的經(jīng)緯度做一個(gè)加減偏移量,,從而達(dá)到與實(shí)際地圖不一致,。這個(gè)偏移算法本身是沒有什么規(guī)律可言的,每 家地圖服務(wù)商都有一套自己的加密偏移算法,,既然算法上沒有什么規(guī)律可言,,但是對(duì)于算法中生成的偏移量是否有規(guī)律呢?這個(gè)是可以肯定的,,但是偏移算法中生成 的偏移量是有規(guī)律而言的,。偏移量的規(guī)律很難得到,要是能拿到這個(gè)偏移量,,就可以說是破解了某一個(gè)地圖服務(wù)商的地圖加密,。 那我們?cè)趺唇鉀Q這個(gè)偏差呢!我在網(wǎng)上找到了一個(gè)強(qiáng)人破解google map偏移的方法 畢竟做地圖開發(fā)的都存在衛(wèi)星圖和地圖的切換,誰不想讓切換以后的地圖對(duì)上呢,!后來我發(fā)現(xiàn)google的地圖服務(wù),,ditu.gogle開始的都沒有偏 差,maps.google開頭的服務(wù)就有偏差,,我就開始查找google的取偏移量算法,,事前我還是圖破解google手機(jī)版本的數(shù)據(jù),沒有成功,,估計(jì) 是使用了自己的壓縮或加密算法,,最后也沒有找到規(guī)律,后來才嘗試破解web版本的不過web版本的接口我對(duì)于js不是特別熟悉,,所以本次破解放棄了分析源 代碼的步驟,,而是直接采用排除法那就是把地圖部分訪問的全部地址,一個(gè)接一個(gè)封殺掉,,查找那個(gè)起偏移做用的網(wǎng)址 http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18& vp=39.111195,117.148067 最后找到了就是這個(gè),,記住每次測(cè)試用清理瀏覽器緩存哦,使用fixfox的fildder和adblock就夠了 然后就是分析每次返回內(nèi)容的規(guī)律,,皇天不負(fù)有心人啊,,我總算是搞定了,下面是我整理的接口 Google 中國(guó)地圖偏移接口
1. 接口地址:http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=39.111195,117.148067 (注:.cn和.com都可以,,我用國(guó)內(nèi)服務(wù)器就會(huì)選擇.cn用美國(guó)服務(wù)器就會(huì)選擇.com) 2. 返回內(nèi)容中的有效部分: 3. (39.111195, 117.148067, 18, [9, -2, 18, -4, 37, -8, 74, -16, 149, -33, 298, -67, 596, -135, 1193, -270]) 4. Spn參數(shù)暫時(shí)未知實(shí)際意義,,但是需要上發(fā)spn參數(shù),任意兩個(gè)小數(shù)用逗號(hào)分開Vp參數(shù)緯經(jīng)度值,,用逗號(hào)分隔,,z參數(shù)為地圖縮放級(jí)別,,無實(shí)際意義 5. 取回的部分中有效數(shù)字為[9, -2, 18, -4, 37, -8, 74, -16, 149, -33, 298, -67, 596, -134, 1192, -268]這個(gè)數(shù)組總共有8組數(shù)字,每?jī)蓚€(gè)為一組,,分為別從11級(jí)到18級(jí)的地圖和衛(wèi)星圖的偏移像素?cái)?shù)量,,我們前一組數(shù)字精確的等于后一組數(shù)字除二,我們 為了得到最精確的偏移,,故選擇第18級(jí)的偏移量1193,,-270,1193為x方向上精度的偏移像素,,-270為y方向上維度偏移像素 6. 經(jīng)緯度的偏移轉(zhuǎn)換我們需要江經(jīng)緯度39.111195,117.148067轉(zhuǎn)化為18級(jí)像素值25620917 和 55392414,,然后分別加上偏移量-270,1193,然后再轉(zhuǎn)化為經(jīng)緯度39.11231854918217 和117.15446412563324,,即位偏移后的經(jīng)緯度 google的地圖采用將地球圓表面投影成平面的方式進(jìn)行貼圖 假設(shè)zoom=15; 橫坐標(biāo)從左至右像素為0-256*2的15次冪,,也就是每增加一級(jí),,地圖大小橫縱坐標(biāo)加倍,256為一個(gè)標(biāo)準(zhǔn)圖片的大小 顯示-180度到+180的范圍,,經(jīng)度越大x越大 縱坐標(biāo)從上到下像素為0-256*2的15次冪,,顯示+85到-85度的范圍,緯度越小y越大 我們先看一下經(jīng)度的轉(zhuǎn)換 經(jīng)度的轉(zhuǎn)換,,我就不多說了,,均勻分布,大家簡(jiǎn)單的看一下下面的公式就明白了 經(jīng)度到像素X值 public static double lngToPixel(double lng, int zoom) { return (lng + 180) * (256L << zoom) / 360; } 像素X到經(jīng)度 public static double pixelToLng(double pixelX, int zoom) { return pixelX * 360 / (256L << zoom) – 180; } 緯度到像素Y public static double latToPixel(double lat, int zoom) { double siny = Math.sin(lat * Math.PI / 180); double y = Math.log((1 + siny) / (1 – siny)); return (128 << zoom) * (1 – y / (2 * Math.PI)); } 像素Y到緯度 public static double pixelToLat(double pixelY, int zoom) { double y = 2 * Math.PI * (1 – pixelY / (128 << zoom)); double z = Math.pow(Math.E, y); double siny = (z – 1) / (z + 1); return Math.asin(siny) * 180 / Math.PI; } 維度的這個(gè)轉(zhuǎn)換,,單純?nèi)ダ斫獠皇呛芎美斫?,我也沒有太深入的了解,從公式來 看,,采用了一種非線性變化,,也就是靠近赤道的地方單位像素表現(xiàn)的緯度間距大,越靠近兩極越小,,可能是因?yàn)?經(jīng)度在靠近兩極的方向均勻變化,,導(dǎo)致緯度也要進(jìn)行拉伸,否則 靠近兩極的地方,,地理形狀就該發(fā)生變化了,,總之上面的轉(zhuǎn)換公式大家還是可以研究一下 的,google維度的表示范圍是-85到+85,,這個(gè)可以求出來,! 上面得到的像素XY是像素的坐標(biāo),并非是google地圖取地圖的那個(gè)XY那個(gè)XY是把像素所標(biāo)除以256得到的商,,也就是每張圖片的大小 |
|