尽管在某些投影中,大地测量学的确看起来有点像正弦波,但该公式是错误的。
这是等角投影中的一个测地线。显然这不是正弦波:
(背景图片取自http://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/Equirectangular-projection.jpg/800px-Equirectangular-projection.jpg。)
由于所有等角投影都是该坐标的仿射变换(其中x坐标是经度,y坐标是纬度),而正弦波的仿射变换仍然是正弦波,因此我们不能期望任何形式的测地线等角投影为正弦波(赤道绘制为水平线除外)。因此,让我们从头开始,制定正确的公式。
让这样的测地线的方程式为
latitude = f(longitude)
以便找到功能f。(这种方法已经放弃了子午线,不能以这种形式编写,但是完全可以通用。)转换为3D笛卡尔坐标(x,y,z)可以得出
x = cos(l) cos(f(l))
y = sin(l) cos(f(l))
z = sin(f(l))
其中l是经度,假定单位半径(不失一般性)。由于球体上的测地线是与平面的交点(穿过其中心),因此必须存在一个恒定的向量(a,b,c),该向量指向测地线的极点之间,为此
a x + b y + c z = 0
无论l的值是多少。求解f(l)得到
f(l) = ArcTan(-(a cos(l) + b sin(l)) / c)
如果c为非零。显然,当c接近0时,我们在极限中获得了一对相差180度的子午线,准确地说就是我们一开始就放弃的测地线。所以一切都很好。顺便说一句,尽管有出现,它仅使用了两个等于a / c和b / c的参数。
请注意,所有测地线都可以旋转,直到它们以零度经度越过赤道。这表明f(l)可以用f0(1-l0)来表示,其中l0是赤道交叉点的经度,f0是本初子午线测地线交叉点的表达式。由此我们得出等效公式
f(l) = ArcTan(gamma * sin(l - l0))
其中-180 <= l0 <180度是赤道交叉点的经度(当测地线向东移动时进入北半球),伽马为正实数。这不包括子午线对。当gamma = 0时,它指定赤道的起始点为经度l0;在这种情况下,如果我们希望唯一的参数化,我们可能总是取l0 = 0。仍然只有两个参数,这次由l0和gamma给出。
使用Mathematica 8.0创建图像。实际上,它创建了一种“动态操纵”,其中可以控制矢量(a,b,c)并立即显示相应的测地线。(这很酷。)首先,我们获得背景图像:
i = Import[
"http://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/\
Equirectangular-projection.jpg/800px-Equirectangular-projection.jpg"]
这是完整的代码:
Manipulate[
{a, b, c} = {Cos[u] Cos[v], Sin[u] Cos[v], Sin[v]};
Show[Graphics[{Texture[i],
Polygon[{{-\[Pi], -\[Pi]/2}, {\[Pi], -\[Pi]/2}, {\[Pi], \[Pi]/2}, {-\[Pi], \[Pi]/2}},
VertexTextureCoordinates -> {{0, 0}, {1, 0}, {1, 1}, {0, 1}}]}],
Plot[ArcTan[(a Cos[\[Lambda]] + b Sin[\[Lambda]]) / (-c)], {\[Lambda], -\[Pi], \[Pi]},
PlotRange -> {Automatic, {-\[Pi]/2, \[Pi]/2}}, PlotStyle -> {Thick, Red}]],
{u, 0, 2 \[Pi]}, {v, -\[Pi]/2, \[Pi]}]
rotation
,amplitude
和offset
)?