首先直接说问题本质:
图层分辨率计算方式不一致,
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();