给出另外两个点和标题确定点

时间:2016-05-06 18:06:08

标签: javascript coordinates latitude-longitude intersection

我正在开发一个在各个点都有无线电接收器的项目。当这些接收器接收到信号时,它们以以下形式输出它们的位置和朝向该信号的航向:

{
  "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来说,它有点棘手,特别是代码。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

考虑到位置(纬度)和所涉及的距离,我认为一个平面可能是接收器附近地球表面的良好(局部)近似。

从具有已知斜率(航向)的已知点传递的线(光线)的参数方程是:

x = x 0 +tcosα
y = y 0 +tsinα

角度应以弧度为单位,因此要从航向(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:

enter image description here

对于较长距离或较高纬度,您应该使用一些更好的近似值,例如您可以找到here的公式。