从初始位置,方位和距离得到的位置

时间:2013-03-19 03:40:27

标签: java geolocation coordinates

我尝试从此site实现该功能。

  

φ2= asin(sin(φ1)* cos(d / R)+ cos(φ1)* sin(d / R)* cos(θ))

     

λ2=λ1+ atan2(sin(θ)* sin(d / R)* cos(φ1),cos(d / R)-sin(φ1)* sin(φ2))

//import static  java.lang.Math.*;      
public static LatLng fromBearingDistance(double lat1, double lon1, double brng, double d) {     
    double R = 6371.0;      
    double lat2 = Math.asin( Math.sin(lat1)*Math.cos(d/R) + 
              Math.cos(lat1)*Math.sin(d/R)*Math.cos(brng) );
    double lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(d/R)*Math.cos(lat1), 
                     Math.cos(d/R)-Math.sin(lat1)*Math.sin(lat2));
    return new LatLng(lat2,lon2);   
}

我的功能的结果是:0.0905,1.710当呼叫应为53.188 0.133

fromBearingDistance(53.32055555555556f, 1.7297222222222224f,
        96.02166666666666f, 124.8f);

与样本网站的坐标相同。

这可能会发生什么? - 代码实际上就像是喜欢的。我改变的唯一事情是双打的变速器。

我使用this网站将度数转换为十进制。

1 个答案:

答案 0 :(得分:2)

我认为问题的一部分可能是您的纬度,经度和方位值看起来是度数,而您链接的页面上的公式要求它们以弧度为单位。如果向下滚动页面底部,页面作者实际上提供了计算的javascript实现,作为表示位置的LatLon对象的方法。这个方法似乎与您尝试的方法相匹配。注意他在计算之前做的第一件事就是将所有东西都转换成弧度,而他做的最后一件事就是转换回度数。

/**
 * Returns the destination point from this point having travelled the given distance
 * (in km) on the given initial bearing (bearing may vary before destination is reached)
 *
 *   see http://williams.best.vwh.net/avform.htm#LL
 *
 * @param   {Number} brng: Initial bearing in degrees
 * @param   {Number} dist: Distance in km
 * @returns {LatLon} Destination point
 */
LatLon.prototype.destinationPoint = function(brng, dist) 
{
  dist = typeof(dist)=='number' ? dist : typeof(dist)=='string' && dist.trim()!='' ? +dist : NaN;
  dist = dist/this._radius;  // convert dist to angular distance in radians
  brng = brng.toRad();  // 
  var lat1 = this._lat.toRad(), lon1 = this._lon.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));
  lon2 = (lon2+3*Math.PI) % (2*Math.PI) - Math.PI;  // normalise to -180..+180º

  return new LatLon(lat2.toDeg(), lon2.toDeg());
}

java.lang.Math类具有从度数到弧度来回转换的方法,因此使用它们来改造代码应该非常容易。