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)
小智 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)
| 归档时间: |
|
| 查看次数: |
8771 次 |
| 最近记录: |