2016-08-04 9 views
1

私はGPS座標(緯度/経度)を正規化するアルゴリズムを開発しようとしています。つまり、A(lat1、lon1)とB(lat2、lon2)の2点を与えられていますが、AB(同じ円弧)で線形で、AとBから特定の距離に置かれた点Cを挿入したい例:AからBまでの距離は0.5kmであり、ABの円弧上の点からCまでの距離をAから0.1kmにします。ポイントCの座標はどのようにして計算できますか? 与えられた目的のためには、地球を完全な球体として近似するだけで十分です。 私はこの記事を見つけましたが、それは中点のみの式を与えます(そして、私はそれを完全に理解していないので、適応します)。 midpoint between two latitude and longitude ありがとうございます。2地理座標間の中間点

編集:私はこれを試してみましたが、使用割合が1であるので、それは間違った答えに

public static void normalizedPoint(double lat1, double lon1, double lat2, double lon2, double dist){ 
     double constant=Math.PI/180; 
     double angular = dist/6371; 
     double a = Math.Sin(0* angular)/Math.Sin(angular); 
     double b = Math.Sin(1*angular)/Math.Sin(angular); 
     double x = a * Math.Cos(lat1) * Math.Cos(lon1) + b * Math.Cos(lat2) * Math.Cos(lon2); 
     double y = a * Math.Cos(lat1) * Math.Sin(lon1) + b * Math.Cos(lat2) * Math.Sin(lon2); 
     double z = a * Math.Sin(lat1) + b * Math.Sin (lon2); 
     double lat3 = Math.Atan2(z, Math.Sqrt(x*x + y*y)); 
     double lon3 = Math.Atan2(y, x); 
     Console.WriteLine(lat3/constant + " " + lon3/constant); 
    } 

を与える限り、私は、元の数式を理解されるように(これは2元ポイントの一つを返す必要がありますが、それはしません)。また変数distは2点からの距離であり、適切に計算されます(同じウェブサイトでチェックされます)。

編集2:2つの地理的なポイント(lat1、lon1、lat2 lon2)とそれらの間の距離を入力座標として提供しています。私は中間点(lat3、lon3)を取得しようとしています。

+0

あなたはリンク先のWebサイトを見ましたか?あなたは*中間点*の下で必要な数式を持っています。 –

+0

ありがとう、私はリンクをチェックしたが、私は彼らが持っていたテキストの壁に気づかなかったと思う。それを書き留めて、それが正しく動作するかどうかを試してみてください:) – Dante

+0

私の最初の質問は、コメントにコードを正しく整列させる方法があまりよく分かりません。とにかく私があなたが言及したリンクされた記事から理解するものによって、私はこれらの関係で最初の点を得るべきです。私は代わりにいくつかの厄介な負の数を取得しています。 – Dante

答えて

0

私は疑問をリンク上の回答で指摘するように、あなたはラジアンではなくを使用するようにすべての入力を変更する必要があります。

lat2ではなくlon2を使用したzのエラーもあると思います。それらの修正で

、私はあなたが探している答えを得る:もちろん

public static void normalizedPoint(double lat1, double lon1, 
             double lat2, double lon2, 
             double dist) 
    { 
     double constant = Math.PI/180; 
     double angular = dist/6371; 
     double a = Math.Sin(0 * angular)/Math.Sin(angular); 
     double b = Math.Sin(1 * angular)/Math.Sin(angular); 
     double x = a * Math.Cos(lat1* constant) * Math.Cos(lon1* constant) + 
        b * Math.Cos(lat2* constant) * Math.Cos(lon2* constant); 
     double y = a * Math.Cos(lat1* constant) * Math.Sin(lon1* constant) + 
        b * Math.Cos(lat2* constant) * Math.Sin(lon2* constant); 
     double z = a * Math.Sin(lat1* constant) + b * Math.Sin(lat2* constant); 
     double lat3 = Math.Atan2(z, Math.Sqrt(x * x + y * y)); 
     double lon3 = Math.Atan2(y, x); 
     Console.WriteLine(lat3/constant + " " + lon3/constant); 
    } 

、上記の大幅同じSin/Cos値の繰り返し計算を避け、角度のみのものを変換することにより簡略化することができ、など

呼び出し:

normalizedPoint(47.20761, 27.02185, 47.20754, 27.02177, 1); 

私は出力を得る:

47.20754 27.02177 
関連する問題