2013-04-08 18 views
5

2つのGPSポイント間の距離を計算するための円滑な方法を探しているので、「xメートル上に移動してy左のメーター - 私は(0,0)として私のポジションを持ち、他のポジションは(x、y)の距離を私のポジションからメートルで表示している二次元座標系で作業することができます2つのGPSポイント間の(x、y)の距離を計算する

私のアイデアは、半正矢式を用いて点間の距離を計算することであった。(これは私の斜辺を返す)

それに加えて、私はこの二点間の方位を算出しています。これは私のアルファである。

この2つの値を使用して、私は問題を解決するために基本的な三角関数を使いたいと思っていました。

だから私は計算しようとしました:catheti_1 = sin(alpha) * hypotenuse, catheti_2 = cos(alpha) * hypotenuse

多分私は何か間違っていますが、私の結果は今は役に立たない。

私の質問は次のとおりです。2つのGPSポイント間のx方向とy方向の距離をどのように計算できますか?

私は、次の手順でアルファを計算しています:私はちょうどあなたのコードを実装し

public static double bearingTo(GPSBean point1, GPSBean point2) { 
    double lat1 = Math.toRadians(point1.latitude); 
    double lat2 = Math.toRadians(point2.latitude); 
    double lon1 = Math.toRadians(point1.longitude); 
    double lon2 = Math.toRadians(point2.longitude); 

    double deltaLong = lon2 - lon1; 

    double y = Math.sin(deltaLong) * Math.cos(lat2); 
    double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) 
      * Math.cos(lat2) * Math.cos(deltaLong); 
    double bearing = Math.atan2(y, x); 

    return (Math.toDegrees(bearing) + 360) % 360; 
} 
+0

「アルファ」はどうやって計算していますか? – Barranka

+0

アルファのためのメソッドを追加しました;) – Frame91

+0

@Borian No.この2点の間に直接距離が必要ないので、重複していません。私はharversineの式について知っていますが、taxicabのジオメトリを "walk"しなければなりません;) – Frame91

答えて

5

基準点としてNYCとボストンのおおよその座標を使用して、そしてhttp://www.movable-type.co.uk/scripts/latlong.htmlで見られるような(半正矢式を実施しているあなたに)表示されませんでした:

long1 = -71.02; lat1 = 42.33; 
long2 = -73.94; lat2 = 40.66; 

lat1 *=pi/180; 
lat2 *=pi/180; 
long1*=pi/180; 
long2*=pi/180; 

dlong = (long2 - long1); 
dlat = (lat2 - lat1); 

// Haversine formula: 
R = 6371; 
a = sin(dlat/2)*sin(dlat/2) + cos(lat1)*cos(lat2)*sin(dlong/2)*sin(dlong/2) 
c = 2 * atan2(sqrt(a), sqrt(1-a)); 
d = R * c; 

私はこのコードを実行すると、私は上記のサイトからの回答と一致するd = 306を取得。

ベアリングの場合、私は52度をもう一度得て、サイトが与えたものに近くなります。

あなたのコードの残りの部分を見ることなく、答えが異なる理由を知ることは難しいです。

注:2つの点が近くにある場合、すべての種類の近似を行うことができますが、このコードは正常に機能するはずです。式は、経度、緯度の差のsinを使用しているため罪の違い)。

補遺:

は、xのコードを使用して、Y(あなたの質問では)、私は距離のための賢明な値を取得 - 120メートル以内に「適切」な答えと一致する(1ので、悪くないとします直線近似であり、もう一つは地球の曲率に従う)。だからあなたのコードは基本的にはOKだと思います。

(数値度)緯度/経度で指定された2点間の距離(km)で距離を算出する
+0

おかげで。私はタイプミスを訂正し、いくつかの可能な値を得た後、私自身もそれをテストしました。たぶんそれはタイプミスだったかもしれません;) – Frame91

+0

@richard - 間違いを修正してくれてありがとう! – Floris

+0

ようこそ、@フロリス:-) – Richard

2

使用半正矢式

から:半正矢式 - R. W.フォームからSinnott、

空と望遠鏡、巻68、NO 2 "半正矢の徳"、1984

http://www.census.gov/cgi-bin/geo/gisfaq?Q5.1

使用例:

result.value = LatLon.distHaversine(lat1.value.parseDeg(), long1.value.parseDeg(), * lat2.value.parseDeg(), long2.value.parseDeg()); 

のJavascript:

LatLon.distHaversine = function(lat1, lon1, lat2, lon2) { 
    var R = 6371; // earth's mean radius in km 
    var dLat = (lat2-lat1).toRad(); 
    var dLon = (lon2-lon1).toRad(); 
    lat1 = lat1.toRad(), lat2 = lat2.toRad(); 
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLon/2) * Math.sin(dLon/2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c; 

    return d; 
} 
関連する問題