【问题标题】:How to find the angle between two coordinatess in mapbox如何在mapbox中找到两个坐标之间的角度
【发布时间】:2020-05-15 09:25:57
【问题描述】:

我在mapbox上工作,根据我当前的latlong,随机距离226mt和随机度179 degrees,我计算了另一个latlong如下。

function findpos(){
    var ptt = new mapboxgl.LngLat(latitude,longitude);
    var ptt2 = destinationPoint(179.85, 0.226, ptt);

    return ptt2;
}


  Number.prototype.toRad = function() {
   return this * Math.PI / 180;
}

Number.prototype.toDeg = function() {
   return this * 180 / Math.PI;
}

function destinationPoint(brng, dist, pointA) {
   dist = dist / 6378.1;
   brng = brng.toRad();

   var lat1 = pointA.lat.toRad(), lon1 = pointA.lng.toRad();

   var lat2 = Math.asin(Math.sin(lat1) * Math.cos(dist) +
                        Math.cos(lat1) * Math.sin(dist) * Math.cos(brng));

   var lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(dist) *
                                Math.cos(lat1),
                                Math.cos(dist) - Math.sin(lat1) *
                                Math.sin(lat2));

   if (isNaN(lat2) || isNaN(lon2)) return null;
   console.log("des ",lon2,lat2);
   return new mapboxgl.LngLat(lat2.toDeg(), lon2.toDeg());
}

到目前为止还可以。但是现在我想找到两个纬度之间的角度或方位,并找到了这个

// Converts from degrees to radians.
function toRadians(degrees) {
  return degrees * Math.PI / 180;
};

// Converts from radians to degrees.
function toDegrees(radians) {
  return radians * 180 / Math.PI;
}


function bearing(startLat, startLng, destLat, destLng){
  startLat = toRadians(startLat);
  startLng = toRadians(startLng);
  destLat = toRadians(destLat);
  destLng = toRadians(destLng);

  y = Math.sin(destLng - startLng) * Math.cos(destLat);
  x = Math.cos(startLat) * Math.sin(destLat) -
        Math.sin(startLat) * Math.cos(destLat) * Math.cos(destLng - startLng);
  brng = Math.atan2(y, x);
  brng = toDegrees(brng);
  return (brng + 360) % 360;
//  return brng;
}  

它计算一个度数并给出一个结果。但是当我决定通过上面的函数findpos() 放置已经计算的纬度来仔细检查这个函数时,我应该得到179.85 degrees 的答案,但我得到的角度是270 degree

代码的哪一部分是正确的?我创建了一个工作示例here,并在控制台中记录了这些值。有谁能帮帮我吗?

【问题讨论】:

  • 不知道你从哪里得到这些计算;您只需要const y = destLat - startLat; const x = destLng - startLng; 然后return toDegrees(Math.atan2(y, x));,结果:179.32707567621796(我还创建了一支合适的笔:codepen.io/khrismuc/pen/PoPdyOg?editors=0010
  • @ChrisG 原来你是对的。非常感谢。如果您可以将其写为答案,我将接受它作为答案。
  • 等等,抱歉,您使用的是球体公式。当我这样做时,我得到了 89 度。然而,对于短距离,简单的公式可以正常工作。
  • @ChrisG 这个公式能正常工作多少距离?对于上述短距离,这在世界任何地方都能正常工作吗?
  • 我会说它对于 500 公里以下的距离来说已经足够近了?理想情况下,您也应该靠近赤道;在极点附近,误差会变大,因为经度线与方形网格的偏离越来越远。如果我们在谈论更大的距离,还有方位会不断变化的有趣皱纹,这就是为什么公式只计算初始方位的原因。所以这真的取决于你到底需要这个。

标签: javascript jquery mapbox mapbox-gl-js mapbox-gl


【解决方案1】:

您正在使用mapboxgl.LngLat() 函数。函数名称已经包含了它希望您传递经度和纬度的顺序——> 首先是经度,然后是纬度。您正在通过第一个纬度,然后是经度。这肯定会出问题。

您的代码:

function findpos(){
    var ptt = new mapboxgl.LngLat(latitude,longitude);
    var ptt2 = destinationPoint(179.85, 0.226, ptt);

    return ptt2;
}

试试这个:

function findpos(){
    var ptt = new mapboxgl.LngLat(longitude,latitude);
    var ptt2 = destinationPoint(179.85, 0.226, ptt);

    return ptt2;
}

这部分代码与此类似:

return new mapboxgl.LngLat(lat2.toDeg(), lon2.toDeg());

【讨论】:

    【解决方案2】:

    查看Turf 文档

    它提供了两种不同的方法。你可以试试:

    http://turfjs.org/docs/#bearing

    http://turfjs.org/docs/#rhumbBearing

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-22
      • 1970-01-01
      • 2010-12-25
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      相关资源
      最近更新 更多