web-dev-qa-db-ja.com

3つの緯度と経度のポイント、および3つの距離を使用した三辺測量

不明なターゲット位置(緯度と経度の座標)が存在します。緯度と経度の座標ペアが3つあり、各ペアについて、ターゲットの場所までの距離がキロメートル単位です。ターゲット位置の座標を計算するにはどうすればよいですか?

たとえば、次のデータポイントがあるとします

37.418436,-121.963477   0.265710701754km
37.417243,-121.961889   0.234592423446km
37.418692,-121.960194   0.0548954278262km

私が欲しいのは、それを入力として受け取り、出力として37.417959,-121.961954を返す関数の内臓はどのように見えるでしょうか?

http://www.movable-type.co.uk/scripts/latlong.html から、2点間の距離を計算する方法を理解しています。オーバーラップの1つのポイント。私がぼんやりしているのは、この入力でそのポイントを計算するために必要な数学です。

24
nohat

ウィキペディアはここで代数のかなり徹底的な議論をします: http://en.wikipedia.org/wiki/Trilateration

ウィキペディアのエントリでは実際にはカバーされていない最初のステップは、緯度/経度座標をデカルト座標に変換することです。

x0 = cos( lon0 ) * cos( lat0 ) , y0 = sin( lon0 ) * cos( lat0 ) , z0 = sin( lat0 )
x1 = cos( lon1 ) * cos( lat0 ) , y1 = sin( lon1 ) * cos( lat1 ) , z1 = sin( lat1 )
x2 = cos( lon2 ) * cos( lat0 ) , y2 = sin( lon2 ) * cos( lat2 ) , z2 = sin( lat2 )

(計算を簡単にするために、私は物事を曖昧にしているので、キロメートルではなく「地球半径」の単位で作業しています)

あなたのデータについては、私は

         p0            p1           p2
X   -0.420442596  -0.420430618  -0.42040255
Y   -0.67380418   -0.673826567  -0.673825967
Z    0.607631426   0.607614889   0.607634975

ウィキペディアの記事で説明されている次のステップは、p0が原点になるように点を平行移動し、次にp1がX軸上にあり、p2がX-Y平面上にあるように回転することにより、座標を単純化することです。

変換するには、p1とp2からp0を引くだけです。

    p0a      p1a          p2a
X   0    1.19779E-05   4.00462E-05
Y   0   -2.23864E-05  -2.17865E-05
Z   0   -1.65372E-05   3.5486E-06

回転はそれほど難しくありません。 p1bは(x、y)=(d、0)を取得します。ここで、dは原点からp1aまでの距離です(ピタゴラスの定理)

P2bの場合、p2aを2つのコンポーネントに分解する必要があります。1つはp1aに平行(x軸上)、もう1つはp1aに垂直(「b」座標系でy軸上)です。

これを行うには、p1aの方向の単位ベクトルが必要です。これはp1a *(1/d)です。この単位ベクトル(必要に応じてp1a_hatと呼びます)とp2aの内積を取ります。これが、p2bのX座標です。ウィキペディアの記事では、この値を「I」と呼んでいます。

これでY座標が簡単になりました。原点からp2までの長さは、座標変換では変更できません。したがって、ピタゴラスの定理を使用してp2aの長さを計算してから、ピタゴラスの定理を「後方」に使用して、長さを同じに保つためにp2bのY座標を取得する必要があります。それはウィキペディアが「J」と呼ぶ変数です。 (Jが正か負かを判断するために、あいまいさを残しておきます)。

これで、ウィキペディアの記事で計算に使用される3つの変数d、IおよびJが得られました。地球の半径を掛けることで、それらをキロメートルに戻すことができます。ここから残りの計算を実行できるはずです

(ちなみに、ウィキペディアでは座標変換の計算が異なります。可能な限りトリガーを避けたいと思います)。

41
Dan Menes

新しく形成されたGISStack Exchangeでこの質問をしたところ、そこでもいくつかの良い回答が得られました。

https://gis.stackexchange.com/questions/66/trilateration-using-3-latitude-and-longitude-points-and-3-distances

受け入れられた答えは、Pythonで(おそらく)実用的な解決策を持っています:

https://gis.stackexchange.com/questions/66/trilateration-using-3-latitude-and-longitude-points-and-3-distances/415#415

2
nohat
1
Martin Beckett

次の9つの円点A、B、Cと距離d1、d2、d3を考えてみましょう。

  • Aの中心、半径d1
  • Aの中心、半径d2
  • Aの中心、半径d3
  • Bの中心、半径d1
  • Bの中心、半径d2
  • Bの中心、半径d3
  • Cの中心、半径d1
  • Cの中心、半径d2
  • Cの中心、半径d3

これらはあなたの可能なサークルです。これで、これらをカリングできます。これは、d1がAで使用されているかどうかがわかっているため、Bでは使用されないためです。

これにより、エントリが可能になります。ここで、A1は、中心Aと半径D1の円を意味します。

  • {A1、B2、C3}
  • {A1、B3、C2}
  • {A2、B1、C3}
  • {A2、B3、C1}
  • {A3、B1、C2}
  • {A3、B2、C1}

地球の半径と、地殻に沿った曲線距離から直線距離までの距離を知ることで、緯度/整数をX、Y、Zに変換できるはずです。そこから、どちらが交差するかを確認できます。共通点。フロートの不完全性による小さな許容誤差を考慮することを忘れないでください。

0
corsiKa