首先,一些术语:
我们的弧线从p1到p2绘制。
我们的第三个点是p3。
相交于大圆的虚拟点是p4。
p1由lat1,lon1定义;p2由lat2,lon2定义;以此类推。
dis12是从p1到p2的距离;等等。
bear12是从p1到p2的方位角;等等。
dxt是横跨距离。
dxa是横跨弧线的距离,也就是我们的目标!
请注意,横跨式公式依赖于相对方位角bear13-bear12
我们有3种情况要处理。
情况1:相对方位角是钝角。因此,dxa=dis13。
![Case 1](https://istack.dev59.com/A7vnt.webp)
情况2.1:相对方位角是锐角,且p4在我们的弧线上。因此,dxa=dxt。
![Case 2.1](https://istack.dev59.com/ensbU.webp)
情况2.2:相对方位角是锐角,且p4在我们的弧线之外。因此,dxa=dis23
![enter image description here](https://istack.dev59.com/OW0Qe.webp)
算法:
步骤1:如果相对方位角是钝角,则dxa=dis13
完成!
步骤2:如果相对方位角是锐角:
2.1:找到dxt。
2.3:找到dis12。
2.4:找到dis14。
2.4:如果dis14>dis12,则dxa=dis23。
完成!
2.5:如果我们到达这里,则dxa=abs(dxt)
MATLAB代码:
function [ dxa ] = crossarc( lat1,lon1,lat2,lon2,lat3,lon3 )
lat1=deg2rad(lat1); lat2=deg2rad(lat2); lat3=deg2rad(lat3);
lon1=deg2rad(lon1); lon2=deg2rad(lon2); lon3=deg2rad(lon3);
R=6371000;
bear12 = bear(lat1,lon1,lat2,lon2);
bear13 = bear(lat1,lon1,lat3,lon3);
dis13 = dis(lat1,lon1,lat3,lon3);
diff = abs(bear13-bear12);
if diff > pi
diff = 2 * pi - diff;
end
if diff>(pi/2)
dxa=dis13;
else
dxt = asin( sin(dis13/R)* sin(bear13 - bear12) ) * R;
dis12 = dis(lat1,lon1,lat2,lon2);
dis14 = acos( cos(dis13/R) / cos(dxt/R) ) * R;
if dis14>dis12
dxa=dis(lat2,lon2,lat3,lon3);
else
dxa=abs(dxt);
end
end
end
function [ d ] = dis( latA, lonA, latB, lonB )
R=6371000;
d = acos( sin(latA)*sin(latB) + cos(latA)*cos(latB)*cos(lonB-lonA) ) * R;
end
function [ b ] = bear( latA,lonA,latB,lonB )
b=atan2( sin(lonB-lonA)*cos(latB) , ...
cos(latA)*sin(latB) - sin(latA)*cos(latB)*cos(lonB-lonA) );
end
示例输出:演示所有情况。请参见下面的地图。
>> crossarc(-10.1,-55.5,-15.2,-45.1,-10.5,-62.5)
ans =
7.6709e+05
>> crossarc(40.5,60.5,50.5,80.5,51,69)
ans =
4.7961e+05
>> crossarc(21.72,35.61,23.65,40.7,25,42)
ans =
1.9971e+05
地图上的同样输出:
演示了情况1:
![Case 1 on map](https://istack.dev59.com/XcbQZ.webp)
演示了情况2.1:
![Case 2.1 on map](https://istack.dev59.com/Do2TL.webp)
演示了情况2.2:
![Case 2.2 on map](https://istack.dev59.com/FYp8v.webp)
http://www.movable-type.co.uk/scripts/latlong.html提供公式,
http://www.darrinward.com/lat-long/?id=1788764生成地图图像。