首先直接說問題本質:
圖層分辨率計算方式不一致,
arcgis 通常有兩個分辨率矩陣:
天地圖通常只有一個:
綜合來看上面的兩個服務 arcgis 有一個96dpi和90.7dpi( 25.4 / 0.28)的瓦片矩陣, 如果用90.7得當然不能和天地圖96dpi得數據對得上, 有兩種解決方法:
1: 不用arcgis 90.7dpi得矩陣, 用96的, 這種需要切片的時候設定
2: 使用90.7dpi的矩陣,但是顯示的時候轉成真實分辨率 也就是ScaleDenominstor 轉分辨率, 即比例尺轉分辨率
但是比例尺轉分辨率跟橢球和dpi都相關
有以下轉換函數:
//地球的半徑
double m_dblEarthRadius; //地球半徑 天地圖請用6378137, arcgis服務請用6371000.7900074287815054264449
//PI圓周率
double m_dblPI; //3.1415926....
//DPI屏幕分辨率 像素/英寸 (Point/Inch)
double m_dblDPI;//96 或者90
//英寸/米
double m_dblInchPerMeter; //0.02539999918
//是否是經緯度單位
bool m_bDegreeUnit; // web墨卡託用false, cscg2000用true
//分辨率
double m_dblResolution; // 輸入參數
//比例尺
double m_dblScale; //輸入參數
//從分辨率計算出比例尺
double Scale()
{
double dblRes = m_dblResolution;
//如果是度,經緯度則換算成M單位。
if(m_bDegreeUnit)
dblRes = m_dblEarthRadius * m_dblResolution * m_dblPI / 180.0;
//一個像素的M大小
//double dblInch = m_dblInchPerMeter * (1.0 / dblDPI);
double dblM = m_dblInchPerMeter / m_dblDPI;
//計算比例尺分母
m_dblScale = dblRes / dblM;
return m_dblScale;
}
//從比例尺計算出分辨率
double Resolution()
{
//一個像素的M大小
//double dblInch = m_dblInchPerMeter * (1.0 / dblDPI);
double dblM = m_dblInchPerMeter / m_dblDPI;
//從屏幕分辨率計算實際長度。
double dblRealLen = dblM * m_dblScale;
//如果是度則需要轉換。
if(m_bDegreeUnit)
dblRealLen = dblRealLen / (m_dblEarthRadius * m_dblPI / 180);
m_dblResolution = dblRealLen;
return m_dblResolution;
}
//計算arcgis分辨率
m_dblEarthRadius= 6371000.7900074287815054264449;
m_dblPI= 3.14159265358979323846;
m_dblDPI=25.4 / 0.28;
m_dblInchPerMeter= 0.02539999918
m_bDegreeUnit = true; // web墨卡託用false, cscg2000用true
m_dblScale = 944940.476190;
m_dblResolution = Resolution();
//計算天地圖分辨率
m_dblEarthRadius= 6378137
m_dblPI= 3.14159265358979323846;
m_dblDPI= 96;
m_dblInchPerMeter= 0.02539999918
m_bDegreeUnit = true;
m_dblScale = 944940.476190;
m_dblResolution = Resolution();