JAVA代碼根據經緯度範圍計算WGS84與Google全球墨卡托包含的切片數目與拼接映像像素尺寸

來源:互聯網
上載者:User

標籤:範圍   切圖   log   system   mat   項目   double   return   Google地圖   

根據項目需求編寫的代碼。

適用情境:在網路地圖上,比如天地圖與Google地圖,使用者用滑鼠在地圖上拉一個矩形框,希望下載該矩形框內某一層級的瓦片資料,並將所有瓦片拼接成一個完整的,包含地理座標的tif映像。

那麼在下載瓦片與拼接瓦片之前,使用者希望能看到待下載的瓦片數量與待拼接映像的像素尺寸,再決定是否拼接。

該java代碼根據該矩形框的經緯度範圍與使用者指定的瓦片層級,計算需要下載的瓦片數量與待拼接結果映像的像素尺寸。

支援EPSG4326經緯度與EPSG3857Google全球墨卡托投影。經緯度瓦片切圖規則與天地圖相同,從第一層開始切,第一層包含兩個瓦片。Google全球墨卡托從第0層開始切,第0層一個瓦片。

public class Main {

private void LonLatToTile(double lon,double lat,int zoom,int[] txy)
{
double resFact = 180.0 / 256.0;
double[] pxy = new double[]{0.0,0.0};
double res = resFact / Math.pow(2,(double)zoom);
pxy[0] = (180.0 + lon) / res;
pxy[1] = (90.0 - lat) / res;

txy[0] = (int)(Math.ceil(pxy[0]/256.0) - 1);
txy[1] = (int)(Math.ceil(pxy[1]/256.0) - 1);
}

private void LatLonToMeters(double lon, double lat,double[] mxy)
{
double m_originShift = 2 * 3.141592653589793 * 6378137 / 2.0;

mxy[0] = lon * m_originShift / 180.0;
mxy[1] = Math.log( Math.tan((90 + lat) * 3.141592653589793 / 360.0 )) / (3.141592653589793 / 180.0);

mxy[1] = mxy[1] * m_originShift / 180.0;
}

private void MetersToTile(double mx, double my, int zoom, int[] txy)
{
double m_initialResolution = 2 * 3.141592653589793 * 6378137 / 256;
double m_originShift = 2 * 3.141592653589793 * 6378137 / 2.0;

double res = m_initialResolution / Math.pow(2,(double)zoom);
double px = (mx + m_originShift) / res;
double py = (m_originShift - my) / res;

txy[0] = (int)( Math.ceil( px / (float)(256) ) - 1 );
txy[1] = (int)( Math.ceil( py / (float)(256) ) - 1 );
}

// 計算經緯度輸出瓦片數量與待拼接映像像素尺寸
public int getGeodeticSize(double minLon, double maxLon, double minLat, double maxLat, int zoom, int[] pixSize){

int[] tminxy = new int[]{0,0};
int[] tmaxxy = new int[]{0,0};

LonLatToTile(minLon,minLat,zoom-1,tminxy);
LonLatToTile(maxLon,maxLat,zoom-1,tmaxxy);

pixSize[0] = (1+Math.abs(tmaxxy[0]-tminxy[0])) * 256;
pixSize[1] = (1+Math.abs(tmaxxy[1]-tminxy[1])) * 256;

int tnum = (1+Math.abs(tmaxxy[0]-tminxy[0])) * (1+Math.abs(tmaxxy[1]-tminxy[1]));

return tnum;
}
// 計算Google投影輸出瓦片數量與待拼接映像像素尺寸
public int getMercatorSize(double minLon, double maxLon, double minLat, double maxLat, int zoom, int[] pixSize){

double[] oULxy = new double[]{0,0};
double[] oDRxy = new double[]{0,0};
LatLonToMeters(minLon,maxLat,oULxy);
LatLonToMeters(maxLon,minLat,oDRxy);
double ominx = oULxy[0];
double omaxx = oDRxy[0];
double ominy = oDRxy[1];
double omaxy = oULxy[1];

int[] tminxy= new int[]{0,0};
int[] tmaxxy = new int[]{0,0};
MetersToTile(ominx,ominy, zoom, tminxy);
MetersToTile(omaxx,omaxy, zoom, tmaxxy);

pixSize[0] = (1+Math.abs(tmaxxy[0]-tminxy[0])) * 256;
pixSize[1] = (1+Math.abs(tmaxxy[1]-tminxy[1])) * 256;

int tnum = (1+Math.abs(tmaxxy[0]-tminxy[0])) * (1+Math.abs(tmaxxy[1]-tminxy[1]));

return tnum;
}

public static void main(String[] args) {
System.out.println("Hello World!");
double minLon = 119.54384371341310;
double maxLon = 119.93413672204591;
double minLat = 33.068895415323247;
double maxLat = 33.433168890047206;
int zoom = 13;

Main e=new Main();

int[] pixSize= new int[]{0,0};
int tnum;
tnum = e.getGeodeticSize(minLon, maxLon, minLat, maxLat, zoom, pixSize);
System.out.println("經緯度資料瓦片數:" + tnum + " 映像尺寸:" + pixSize[0] + "*" + pixSize[1]);
tnum = e.getMercatorSize(minLon, maxLon, minLat, maxLat, zoom, pixSize);
System.out.println("Google資料瓦片數:" + tnum + " 映像尺寸:" + pixSize[0] + "*" + pixSize[1]);

}


}
運行結果:


JAVA代碼根據經緯度範圍計算WGS84與Google全球墨卡托包含的切片數目與拼接映像像素尺寸

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.