前陣子一直有朋友問我經(jīng)緯度轉換成google像素索引值的問題,今天整理一下,寫給大家看看
簡單說明一下:
google的地圖采用將地球圓表面投影成平面的方式進行貼圖
假設zoom=15;
橫坐標從左至右像素為0-256*2的15次冪,也就是每增加一級,地圖大小橫縱坐標加倍,256為一個標準圖片的大小
顯示-180度到+180的范圍,經(jīng)度越大x越大
縱坐標從上到下像素為0-256*2的15次冪,顯示+85到-85度的范圍,緯度越小y越大
我們先看一下經(jīng)度的轉換
經(jīng)度的轉換,我就不多說了,均勻分布,大家簡單的看一下下面的公式就明白了
經(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;
}
維度的這個轉換,單純去理解不是很好理解,我也沒有太深入的了解,從公式來看,采用了一種非線性變化,也就是靠近赤道的地方單位像素表現(xiàn)的緯度間距大,越靠近兩極越小,可能是因為 經(jīng)度在靠近兩極的方向均勻變化,導致緯度也要進行拉伸,否則 靠近兩極的地方,地理形狀就該發(fā)生變化了,總之上面的轉換公式大家還是可以研究一下的,google維度的表示范圍是-85到+85,這個可以求出來!
上面得到的像素XY是像素的坐標,并非是google地圖取地圖的那個XY那個XY是把像素所標除以256得到的商,也就是每張圖片的大小
---------------chen------------------
matlab里
經(jīng)緯度到網(wǎng)格,6是級別
x=112.5
(x+180)/360*(256*(2^6))/256
y=31.95216224
y=36.59788913
(0.5-log( (1+sin(y*pi/180))/(1-sin(y*pi/180)) )/(4*pi) ) *(256*(2^6))/256
聯(lián)系客服