对于地图显示的一些分析

537 阅读4分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

墨卡托(Mercator)投影

墨卡托(Mercator)投影,是一种"等角正切圆柱投影”,荷兰地图学家墨卡托(Gerhardus Mercator 1512-1594)在1569年拟定,假设地球被围在一中空的圆柱里,其标准纬线与圆柱相切接触,然后再假想地球中心有一盏灯,把球面上的图形投影到圆柱体上,再把圆柱体展开,这就是一幅选定标准纬线上的“墨卡托投影”绘制出的地图。墨卡托投影没有角度变形,由每一点向各方向的长度比相等,它的经纬线都是平行直线,且相交成直角,经线间隔相等,纬线间隔从标准纬线向两极逐渐增大。墨卡托投影的地图上长度和面积变形明显,但标准纬线无变形,从标准纬线向两极变形逐渐增大,但因为它具有各个方向均等扩大的特性,保持了方向和相互位置关系的正确。在地图上保持方向和角度的正确是墨卡托投影的优点,墨卡托投影地图常用作航海图和航空图,如果循着墨卡托投影图上两点间的直线航行,方向不变可以一直到达目的地,因此它对船舰在航行中定位、确定航向都具有有利条件,给航海者带来很大方便。“海底地形图编绘规范”(GB/T 17834-1999,海军航保部起草)中规定1:25万及更小比例尺的海图采用墨卡托投影,其中基本比例尺海底地形图(1:5万,1:25万,1:100万)采用统一基准纬线30°,非基本比例尺图以制图区域中纬为基准纬线。基准纬线取至整度或整分。

image.png

墨卡托投影坐标系取零子午线或自定义原点经线(L0)与赤道交点的投影为原点,零子午线或自定义原点经线的投影为纵坐标X轴,赤道的投影为横坐标Y轴,构成墨卡托平面直角坐标系。

墨卡托投影思想是GIS的基石,GPS设备采集的数据是标准的wgs84坐标,各家地图从数据提供商拿到的经纬度数据经过国测局gcj02加密的结果。地球的纬度不可能取到+-90,范围在-85-85。
地图数据处理、渲染都需要转化成平面的笛卡尔坐标系。而墨卡托投影则定义了如何从球面坐标系投影到二维的平面。二维的单位是米,也可以是像素。

墨卡托投影坐标的公式:

f(x)=ln[tan(π4Φ2)]f(x) = \ln \big[\tan(\frac{\pi} {4} - \frac{\Phi} {2}) \big]

F(Φ) = ln[ tan(π/4 +Φ/2 ) ]  与T(Φ) =  tan(Φ)的函数曲线如下:

image.png

绿色为T函数,蓝色为F函数,对比发现,当原点附近F函数与y=x函数曲线非常接近,当Φ无限趋近正负π/2时候,tan函数已经趋于无穷,而F函数值仍然处于设定值范围内。F函数趋向无穷的条件值被推迟。
Φ的取值范围为-π/2,π/2,即[-1.57,1.57],地球经纬度近似-85,85,所以最终Φ的取值为-1.5,1.5,即上图中黑色粗线指向的区间。此时F函数值正好位于-π,π。
通过F函数,处理后的纬度值跟经度值范围一致。
从上图可以看出F(Φ) = ln( tan(π/4 + Φ/2) ) 也是关于原点对称的,F(Φ) = -F(-Φ)。通过三角函数可以证明。

经纬度转墨卡托坐标、墨卡托坐标转经纬度 算法函数


/**
    w84转为墨卡托坐标(经纬度转墨卡托)\
    WGS84是地理坐标的一种,地理坐标本身有很多种,web墨卡托是投影坐标

    lon :    w84经度
    lat :    w84纬度
*/
PG.Tool.forwardMercator = function(lon, lat) {
    lon = parseFloat(lon);
    lat = parseFloat(lat);
    var x = lon * 20037508.34 / 180;
    var y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);
    y = y * 20037508.34 / 180;       
    return [x,y];
};

/**
    将墨卡托坐标转为w84(墨卡托转经纬度)

    x :    墨卡托经度
    y :    墨卡托纬度
*/
PG.Tool.inverseMercator = function(x, y) {
    var lon = (x / 20037508.34) * 180;
    var lat = (y / 20037508.34) * 180;
    lat = 180/Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);
    return [lon, lat];
}