经纬度投影 球面墨卡托_真正的墨卡托投影转换详解

cdb315a892883f3996c376c16f6285c6.png

所谓天下文章一大抄,看你会抄不会抄。网上对于墨卡托投影的解释比较多,但是我发现很多都是是漏洞百出,无脑抄。例如:

X轴:由于赤道半径为6378137米,则赤道周长为2*PI*r = 20037508.3427892,因此X轴的取值范围:[-20037508.3427892,20037508.3427892]。
2 * Math.PI * 6378137 = 40075016.0019724

X轴取值范围确实是[-20037508.3427892,20037508.3427892],但是请不要闭着眼睛说这是周长(实际是半周长)

地理经度的取值范围是[-180,180],纬度不可能到达90°,通过纬度取值范围为[20037508.3427892,20037508.3427892] ,反计算可得到纬度值为85.05112877980659。因此纬度取值范围是[-85.05112877980659,85.05112877980659]

d00e458070ad5ccf29a57fbb1e3368bc.png

这跳的也跳快了,为啥纬度取值范围也要半周长,反计算过程又在哪?

663e18d49343f8fa14172a2c0a3cf948.png

墨卡托投影的模型:地球近似为正球体,球体中心有个发亮的光点,光点将球面上的每个点都投影到正切赤道的圆柱内表面上,将圆柱体内表面展开就是一张世界地图。

形象的理解:有个特殊的乒乓球(地球),这个乒乓球球体内中心点会发光,乒乓球卡在塑料水管内部,把塑料水管水管按有乒乓球阴影部分锯开碾平后水管内表面就是世界地图。

aab27d450b39b9dd07f3a7fae9c17993.png

在WebGIS中,经常有已知WGS84(EPSG:4326)经纬度[lng, lat],在Canvas2D上要显示该点就要换算成墨卡托投影(EPSG:3857),其实只要知道地球变成平面地图时的转换比率,那就能通过经纬度求出墨卡托的值。Openlayers以及Mapbox/sphericalmercator以及Mapbox/sphericalmercator都有转换函数,但是这个计算公式怎么来的呢?

假设有个Q点离P点无限近,地球半径为

equation?tex=R ,如下图

d2845d575a3fbddb8fd067152df5c01f.png

P的经纬度为

equation?tex=%5B%5Clambda%2C+%5Cvarphi%5D
equation?tex=%5Clambda
equation?tex=%5Cvarphi 都为弧度),相邻点Q的经纬度为
equation?tex=%5B%5Clambda+%2B+%5Cdelta%5Clambda%2C+%5Cvarphi+%2B+%5Cdelta%5Cvarphi%5D ,那么:

平行赤道的

equation?tex=%5Cvarphi 纬线所在圆的半径:
equation?tex=r+%3D+R+%5Ctimes+cos%5Cvarphi ,弧度
equation?tex=PM+%3D+r+%5Ctimes++%5Cdelta%5Clambda+%3D+R+++cos%5Cvarphi+%5Cdelta%5Clambda+ ,如下示意图

0a842b657180e40a9157917efcac44d6.png

equation?tex=tan%5Cangle%5Calpha+%5Capprox+%5Cfrac%7BPM%7D%7BQM%7D+%3D+%5Cfrac%7BRcos%5Cvarphi%5Cdelta%5Clambda%7D%7BR%5Cdelta%5Cvarphi%7D
equation?tex=tan%5Cangle%5Cbeta+%3D+%5Cfrac%7BP%27M%27+%7D%7BQ%27M%27+%7D+%3D+%5Cfrac%7B%5Cdelta+x%7D%7B%5Cdelta+y%7D

纬度方向比率:

equation?tex=%5Cfrac%7BP%27M%27+%7D%7BPM%7D+%3D+%5Cfrac%7B%5Cdelta+x%7D%7BR+cos%5Cvarphi+%5Cdelta%5Clambda%7D

经度方向比率:
equation?tex=%5Cfrac%7BP%27K%27%7D%7BPK%7D+%3D+%5Cfrac%7B%5Cdelta+y%7D%7BR%5Cdelta%5Cvarphi%7D

由于经度转变未发生形变,那么可以将它看做常量,得出

equation?tex=+%5Cdelta+x+%3D+R+%5Ctimes+%5Cdelta+%5Clambda

再利用极限求导概念,

equation?tex=y%27%28%5Cvarphi%29+%3D+%5Cfrac%7B%5Cdelta+y%7D%7B%5Cdelta%5Cvarphi%7D
那么:

维度方向转换比率:

equation?tex=%5Cfrac%7BP%27M%27+%7D%7BPM%7D+%3D+%5Cfrac%7B%5Cdelta+x%7D%7BR+cos%5Cvarphi+%5Cdelta%5Clambda%7D+%3D+%5Cfrac%7BR+%5Cdelta%5Clambda%7D%7BR+cos%5Cvarphi+%5Cdelta%5Clambda%7D+%3D+%5Cfrac%7B1%7D%7Bcos%5Cvarphi+%7D+%3D+sec%5Cvarphi

经度方向转换比率:
equation?tex=%5Cfrac%7BP%27K%27%7D%7BPK%7D+%3D+%5Cfrac%7B%5Cdelta+y%7D%7BR%5Cdelta%5Cvarphi%7D+%3D+%5Cfrac%7B%5Cfrac%7By%27%28%5Cvarphi%29%7D%7B%5Cdelta%5Cvarphi%7D%7D%7BR%5Cdelta%5Cvarphi%7D+%3D+%5Cfrac%7By%27%28%5Cvarphi%29%7D%7BR%7D

equation?tex=+tan%5Cangle%5Calpha+%3D%5Cfrac%7B+Rcos%5Cvarphi+%5Cdelta%5Clambda%7D%7BR%5Cdelta%5Cvarphi%7D+%3D+%5Cfrac%7B+%5Cdelta+x+cos%5Cvarphi%7D%7BR%5Cdelta%5Cvarphi%7D%3D%5Cfrac%7Btan%5Cangle%5Cbeta%5Ctimes%5Cdelta+y%5Ctimes+cos%5Cvarphi%7D%7BR%5Cdelta%5Cvarphi%7D%3Dtan%5Cangle%5Cbeta%5Ctimes+y%27%28%5Cvarphi%29%5Ctimes+%5Cfrac%7Bcos%5Cvarphi%7D%7BR%7D

由于墨卡托投影为了保证投影后达到等角航线(航向角和经度所成的夹角保持不变),那么可以认定

equation?tex=%5Cangle%5Calpha%3D%5Cangle%5Cbeta

ff9203ff3c4b92891d9f4ca33fe9fd17.png


等等,各位看到这里肯定会问,墨卡托设计的为什么需要等角航线?为什么是要和经度夹角而不是维度夹角?其实我写的时候也想了下,我们不妨大胆猜测下:

墨卡托设计出来的投影是为了航海用的,当时航海导航全靠指南针,指南针指向南北两极,与经线平行,那么要根据地图找到航行路线上的陆地的话,一定要根据地图上的所指的角度进行航线行驶(想象下航海电影中主角拿出地图,地图上压着个指南针,然后用尺子画出两点的直线,再量下这条直线和经线的夹角,最后指挥舵手往哪里哪里打几度方向。电影果然没欺骗我们)。

回归正题,由于

equation?tex=%5Cangle%5Calpha+%3D+%5Cangle%5Cbeta ,那么
equation?tex=tan%E2%88%A0%5Calpha+%3D++tan%E2%88%A0%5Cbeta+%5Ctimes+y%27%28%5Cvarphi%29+%5Ctimes+%5Cfrac%7Bcos%CF%86%7D%7BR%7D+ 可得出
equation?tex=+y%27%28%5Cvarphi%29+%3D+%5Cfrac%7BR%7D%7Bcos%5Cvarphi%7D%3D+R+%5Ctimes+sec%CF%86

那么根据

44c17e7039674eba13c569dd387c58d4.png

equation?tex=y%27%28%5Cvarphi%29 的原函数为
equation?tex=y%28%5Cvarphi%29+%3D+R+%5Ctimes+ln+%7Ctan%28%5Cfrac%7B%5Cvarphi%7D%7B2%7D+%2B+%5Cfrac%7B%5Cpi%7D%7B4%7D%29%7C
equation?tex=y 的反函数
equation?tex=y%5E%7B-1%7D 称为高德曼函数
equation?tex=gd%28x%29 ,
equation?tex=y%28x%29+%3D+gd%5E%7B-1%7D%28x%29 (这里由于为了和截图对应需要把
equation?tex=%5Cvarphi 变为了
equation?tex=x

0dde37dd2b3ba4242044bd099fb708e7.png

b8eb37f9551eaac87011db9be0269b4d.png

在Web中,需要对地图进行缩放,为了更好的计算缩放比例,设定横宽比1。之前由于地图的x的取值范围为

equation?tex=%5B-%5Cpi+R%2C+%5Cpi+R%5D , 那么y的取值范围也为
equation?tex=%5B-%5Cpi+R%2C+%5Cpi+R%5D ,于是可以求得Web下的墨卡托投影的最大纬度值为:

5a875f107dd3ae8066804bb6832ce91b.png

而EPSG:4326转EPSG:3857就很好计算了

// 弧度版
const x = R * lng 
const y = R * Math.log(Math.tan((Math.PI*0.25) + (0.5 * lat)))

// 角度版
const radians = Math.PI / 180
const x = R * lng * radians
const y = R * Math.log(Math.tan((Math.PI*0.25) + (0.5 * lat * radians)))

参考资料:

https://en.wikipedia.org/wiki/Mercator_projection​en.wikipedia.org
  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值