给定另外两个点和航向确定点
Determining Point given two other points and headings
我正在进行一个项目,该项目在各个点都有无线电接收器。当这些接收器接收到信号时,它们会以以下形式输出它们的位置和指向该信号的航向:
{
"current": [
{
"heading": 292.5,
"id": 1,
"lat": 43.08429,
"lon": -77.674126,
"name": "node1"
},
{
"heading": 90,
"id": 2,
"lat": 43.084537,
"lon": -77.681288,
"name": "node2"
}
]
}
我需要获取这些信息并找到信号的经纬度。
我一直在考虑处理这个问题的方法是找到包含每个节点可能的纬度和经度的直线方程。然后,我可以找到这些线相交的位置。虽然这在理论上很棒,但我发现实施起来有点困难。
我假设 0 度是北。在上面的示例中,找到 node2
的直线方程很容易,因为它只是一条指向东的直线 y = -77.681288
。
对于 node1
这有点棘手,尤其是编码。有什么想法吗?
考虑到所涉及的位置(纬度)和距离,我认为平面可能是接收器附近地球表面的良好(局部)近似值。
从已知点以已知斜率(航向)通过的线(射线)的参数方程为:
x = x0 + t cosα
y = y0 + t sinα
角度应以弧度为单位,因此要从航向(0° 为北)转换为弧度(0 为东):
function heading_to_radians() {
var angle = 90.0 - heading;
if ( angle < -180.0 ) angle = angle + 360.0;
if ( angle > 180.0 ) angle = angle - 360.0;
return angle * Math.PI / 180.0;
}
两条线的交点可以用:
var alpha = heading_to_radians(heading1),
ca = Math.cos(alpha),
sa = Math.sin(alpha),
beta = heading_to_radians(heading2),
cb = Math.cos(beta),
sb = Math.sin(beta),
dx = longitude2 - longitude1,
dy = latitude2 - latitude1,
t, k, den, longitude3, latitude3;
if ( ca > 0.01 || ca < -0.01 ) {
k = sa / ca;
den = cb * k - sb;
t = ( dy - dx * k) / den;
} else {
k = ca / sa;
den = sb * k - cb;
t = ( dx - dy * k) / den;
}
longitude3 = longitude2 + t * cb;
latitude3 = latitude2 + t * sb;
根据您的示例数据,结果是经度 -77.67472231 和纬度 43.084537 或根据 GoogleMaps:
对于更长的距离或更高的纬度,您应该使用一些更好的近似值,例如您可以找到的公式 here。
我正在进行一个项目,该项目在各个点都有无线电接收器。当这些接收器接收到信号时,它们会以以下形式输出它们的位置和指向该信号的航向:
{
"current": [
{
"heading": 292.5,
"id": 1,
"lat": 43.08429,
"lon": -77.674126,
"name": "node1"
},
{
"heading": 90,
"id": 2,
"lat": 43.084537,
"lon": -77.681288,
"name": "node2"
}
]
}
我需要获取这些信息并找到信号的经纬度。
我一直在考虑处理这个问题的方法是找到包含每个节点可能的纬度和经度的直线方程。然后,我可以找到这些线相交的位置。虽然这在理论上很棒,但我发现实施起来有点困难。
我假设 0 度是北。在上面的示例中,找到 node2
的直线方程很容易,因为它只是一条指向东的直线 y = -77.681288
。
对于 node1
这有点棘手,尤其是编码。有什么想法吗?
考虑到所涉及的位置(纬度)和距离,我认为平面可能是接收器附近地球表面的良好(局部)近似值。
从已知点以已知斜率(航向)通过的线(射线)的参数方程为:
x = x0 + t cosα
y = y0 + t sinα
角度应以弧度为单位,因此要从航向(0° 为北)转换为弧度(0 为东):
function heading_to_radians() {
var angle = 90.0 - heading;
if ( angle < -180.0 ) angle = angle + 360.0;
if ( angle > 180.0 ) angle = angle - 360.0;
return angle * Math.PI / 180.0;
}
两条线的交点可以用:
var alpha = heading_to_radians(heading1),
ca = Math.cos(alpha),
sa = Math.sin(alpha),
beta = heading_to_radians(heading2),
cb = Math.cos(beta),
sb = Math.sin(beta),
dx = longitude2 - longitude1,
dy = latitude2 - latitude1,
t, k, den, longitude3, latitude3;
if ( ca > 0.01 || ca < -0.01 ) {
k = sa / ca;
den = cb * k - sb;
t = ( dy - dx * k) / den;
} else {
k = ca / sa;
den = sb * k - cb;
t = ( dx - dy * k) / den;
}
longitude3 = longitude2 + t * cb;
latitude3 = latitude2 + t * sb;
根据您的示例数据,结果是经度 -77.67472231 和纬度 43.084537 或根据 GoogleMaps:
对于更长的距离或更高的纬度,您应该使用一些更好的近似值,例如您可以找到的公式 here。