如何使用方向角和速度来计算下一次的纬度和经度

jty*_*999 11 gps geolocation latitude-longitude

我知道我当前的位置({lat:x,lon:y}),我知道我的速度和方向角度; 如何预测下一次的下一个位置?

Dav*_*den 11

首先,根据您当前的速度和已知的时间间隔("下次")计算您将要行驶的距离:

distance = speed * time
Run Code Online (Sandbox Code Playgroud)

然后你可以使用这个公式来计算你的新位置(lat2/lon2):

lat2 =asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
dlon=atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(lat2))
lon2=mod( lon1-dlon +pi,2*pi )-pi
Run Code Online (Sandbox Code Playgroud)

有关Javascript中的实现,请参阅此页面LatLon.prototype.destinationPoint上的功能

更新那些希望更加充实的上述实现的人,这里是Javascript:

  /**
  * Returns the destination point from a given point, having travelled the given distance
  * on the given initial bearing.
  *
  * @param   {number} lat - initial latitude in decimal degrees (eg. 50.123)
  * @param   {number} lon - initial longitude in decimal degrees (e.g. -4.321)
  * @param   {number} distance - Distance travelled (metres).
  * @param   {number} bearing - Initial bearing (in degrees from north).
  * @returns {array} destination point as [latitude,longitude] (e.g. [50.123, -4.321])
  *
  * @example
  *     var p = destinationPoint(51.4778, -0.0015, 7794, 300.7); // 51.5135°N, 000.0983°W
  */
  function destinationPoint(lat, lon, distance, bearing) {
     var radius = 6371e3; // (Mean) radius of earth

     var toRadians = function(v) { return v * Math.PI / 180; };
     var toDegrees = function(v) { return v * 180 / Math.PI; };

     // sin?2 = sin?1·cos? + cos?1·sin?·cos?
     // tan?? = sin?·sin?·cos?1 / cos??sin?1·sin?2
     // see mathforum.org/library/drmath/view/52049.html for derivation

     var ? = Number(distance) / radius; // angular distance in radians
     var ? = toRadians(Number(bearing));

     var ?1 = toRadians(Number(lat));
     var ?1 = toRadians(Number(lon));

     var sin?1 = Math.sin(?1), cos?1 = Math.cos(?1);
     var sin? = Math.sin(?), cos? = Math.cos(?);
     var sin? = Math.sin(?), cos? = Math.cos(?);

     var sin?2 = sin?1*cos? + cos?1*sin?*cos?;
     var ?2 = Math.asin(sin?2);
     var y = sin? * sin? * cos?1;
     var x = cos? - sin?1 * sin?2;
     var ?2 = ?1 + Math.atan2(y, x);

     return [toDegrees(?2), (toDegrees(?2)+540)%360-180]; // normalise to ?180..+180°
  }
Run Code Online (Sandbox Code Playgroud)

  • 接受的答案是最糟糕的.没有定义,也没有任何单位.lat1必须是弧度,必须说明,d是什么? (4认同)

小智 7

在JS中用于计算给定轴承和距离的lat和lng:

//lat, lng in degrees. Bearing in degrees. Distance in Km
calculateNewPostionFromBearingDistance = function(lat, lng, bearing, distance) {
  var R = 6371; // Earth Radius in Km

  var lat2 = Math.asin(Math.sin(Math.PI / 180 * lat) * Math.cos(distance / R) + Math.cos(Math.PI / 180 * lat) * Math.sin(distance / R) * Math.cos(Math.PI / 180 * bearing));
  var lon2 = Math.PI / 180 * lng + Math.atan2(Math.sin( Math.PI / 180 * bearing) * Math.sin(distance / R) * Math.cos( Math.PI / 180 * lat ), Math.cos(distance / R) - Math.sin( Math.PI / 180 * lat) * Math.sin(lat2));

  return [180 / Math.PI * lat2 , 180 / Math.PI * lon2];
};

calculateNewPostionFromBearingDistance(60,25,30,1)
[60.007788047871614, 25.008995333937197]
Run Code Online (Sandbox Code Playgroud)