24

未知のターゲット位置 (緯度と経度の座標) が存在します。緯度と経度の座標ペアが 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 点間の距離を計算する方法を理解しています。私が漠然としているのは、この入力でそのポイントを計算するために必要な数学です。

4

4 に答える 4

43

ウィキペディアでは、代数についてかなり徹底的に説明しています: 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 が XY 平面にあるように回転することにより、座標を単純化することです。

変換するには、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 * ( 1/d ) である p1a の方向の単位ベクトルが必要です。この単位ベクトル (お好みで p1a_hat と呼びます) と p2a の内積をとると、p2b の X 座標になります。ウィキペディアの記事では、この値を「I」と呼んでいます

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

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

(ちなみに、ウィキペディアでは座標変換の計算方法が異なります。私は可能な限り三角関数を避けたいと思っています)。

于 2010-05-19T03:44:04.387 に答える
3

私は新しくできた GIS Stack 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

于 2010-08-04T22:19:27.947 に答える
1

Paul Bourke Geometryのページ

2 つの円の交点

于 2010-05-12T02:10:30.390 に答える
0

次の 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 に変換し、地球の地殻に沿った曲線距離から直線距離までの距離を変換できるはずです。そこから、それらのどれが共通点。フロートの不完全性によるわずかな誤差を許容することを忘れないでください。

于 2010-05-11T19:27:39.070 に答える