10

緯度と経度の2つのWGS84座標があります。これらのポイントはかなり接近しており、たとえば1メートルしか離れていません。

これらの点の間の線の方位角、つまり北への角度を計算する簡単な方法はありますか?

素朴なアプローチは、デカルト座標系を想定し(これらの点が非常に接近しているため)、次のように使用することです。

sin(a)= abs(L2-L1)/ sqrt(sqr(L2-L1)+ sqr(B2-B1))

a =方位角L1、L2 =経度B1、B2=緯度

座標が赤道から離れるにつれて誤差は大きくなります。これは、2つの経度間の距離が、2つの緯度間の距離(一定のまま)よりもますます小さくなるためです。

非常に複雑な数式をいくつか見つけましたが、それらは非常に接近しているポイントには行き過ぎであり、非常に高い精度は必要ないためです(小数点以下2桁で十分ですが、1つでも問題ありません。 GPSが返すもののように、とにかく精度を低下させる他の要因です)。

たぶん、緯度に応じておおよその縦方向の補正係数を決定し、次のようなものを使用することができます。

sin(a)= abs(L2 * f-L1 * f)/ sqrt(sqr(L2 * f-L1 * f)+ sqr(B2-B1))

ここで、fは補正係数です。

ヒントはありますか?

(これにはライブラリを使用したくありません。特に、ランタイムライセンスが必要なライブラリは使用しません。MPLされたDelphiソースがあれば素晴らしいでしょう。)

4

6 に答える 6

10

テキストで参照している式は、2 点間の大圏距離を計算するためのものです。ポイント間の角度を計算する方法は次のとおりです。

uses Math, ...;
...

const
  cNO_ANGLE=-999;

...

function getAngleBetweenPoints(X1,Y1,X2,Y2:double):double;
var
  dx,dy:double;
begin
  dx := X2 - X1;
  dy := Y2 - Y1;

  if (dx > 0) then  result := (Pi*0.5) - ArcTan(dy/dx)   else
  if (dx < 0) then  result := (Pi*1.5) - ArcTan(dy/dx)   else
  if (dy > 0) then  result := 0                          else
  if (dy < 0) then  result := Pi                         else
                    result := cNO_ANGLE; // the 2 points are equal

  result := RadToDeg(result);
end;
  • 2 つの点が等しい状況を処理することを忘れないでください (結果が cNO_ANGLE に等しいかどうかを確認するか、関数を変更して例外をスローします)。

  • この機能は、平面上にいることを前提としています。あなたが言及した短い距離では、これはすべて問題ありませんが、世界中の都市間のヘディングを計算する場合は、地球の形を数える何かを調べたいと思うかもしれません。

  • この関数には、平面に既にマップされている座標を指定することをお勧めします。ただし、大まかな概算を取得するために、WGS84 Latitude を Y に (および lon を X に) 直接フィードすることもできます。

于 2009-03-17T04:33:23.480 に答える
5

これがC#ソリューションです。0、45、90、135、180、225、270、315 の角度でテスト済み。

編集以前の醜いソリューションを、Wouter のソリューションの C# 翻訳に置き換えました。

public double GetAzimuth(LatLng destination)
{
    var longitudinalDifference = destination.Lng - this.Lng;
    var latitudinalDifference = destination.Lat - this.Lat;
    var azimuth = (Math.PI * .5d) - Math.Atan(latitudinalDifference / longitudinalDifference);
    if (longitudinalDifference > 0) return azimuth;
    else if (longitudinalDifference < 0) return azimuth + Math.PI;
    else if (latitudinalDifference < 0) return Math.PI;
    return 0d;
}
public double GetDegreesAzimuth(LatLng destination)
{
    return RadiansToDegreesConversionFactor * GetAzimuth(destination);
}
于 2009-06-26T19:48:26.930 に答える
3

このリンクを見つけました

http://williams.best.vw.net/avform.htm

への回答で与えられた

緯度/経度 + 距離 + 方位 --> 緯度/経度

これは有望に見えます。特に、最後に与えられた平らな地球の近似値はそうです。

于 2009-03-13T19:07:56.210 に答える
2

これは、小さな違いに対してのみ機能します。それ以外の場合は、「latitudinalDifference/longitudinalDifference」だけではできません。

于 2009-09-14T09:43:15.413 に答える
0

経度に基づいた補正係数を実装することをお勧めします。特定のスポットからxマイル以内のすべてのジオコーディングされたレコードを返すために、1回シミュレーションルーチンを実装し、シミュレーションの問題が発生しました。残念ながら、私はもうコードを持っておらず、修正番号に到達した方法を思い出せないようですが、あなたは正しい方向に進んでいます。

于 2009-03-13T16:22:54.593 に答える