首页 文章

给出另外两个点和 Headers 确定点

提问于
浏览
0

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

{
  "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 的直线方程式很简单,因为它只是一条指向East的线, y = -77.681288 .

对于 node1 来说,这有点棘手,尤其是代码 . 有任何想法吗?

1 回答

  • 1

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

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

    x = x0tcosα
    y = y0tsinα

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

相关问题