1

地理座標(緯度、経度)を使用しています。壁の各コーナーの座標があります。

左下10cm右の点の座標を教えてください。それが可能かどうかはわかりません。

ありがとう。

4

1 に答える 1

3

簡単な方法

緯度と経度は非ユークリッド サーフェス (球面 2 空間) 上の座標系であるため、直接操作するのはかなり厄介です。

以下をお勧めします。2 つの座標を 3D デカルト ベクトルに変換します。

z = R * sin(latitude);
Rcoslat = R * cos(latitude);
x = Rcoslat * cos(longitude);
y = Rcoslat * sin(longitude);

地球のR = 6378 km(平均)半径で。ほとんどのコンピューター言語のほとんどの三角関数は引数をradiansで受け取ることに注意しpi/180sin()くださいcos()

壁の側面の両方の座標に対してこれを行うと、2 つのベクトルが得られます

v1 = (x1 y1 z1)
v2 = (x2 y2 z2)

これらのベクトルの違いから、進むべき適切な方向がわかります。

v3 = v1-v2  (if v1 is your leftmost coordinate)
v3 = v2-v1  (if v2 is your leftmost coordinate)

の長さはv3壁の幅です。それを 10cm 延長して、新しいベクトルを取得します。

L  = sqrt( v3x*v3x + v3y*v3y + v3z*v3z )  (width of the wall)
v4 = v3/L * (L+10cm) = v3 * (1 + 10cm/L)

単位をジャグリングする必要があることに注意してください。Rキロメートルで取得すると、キロメートルも単位にLなるからです。

新しいベクトルを取得したので、それを緯度/経度に戻すことができます。

hypotxy   = hypot( v4x, v4y)
latitude  = atan2( v4z, hypotxy )
longitude = atan2( v4y, v4x )

は 4象限atan2逆正接であり、数値のオーバーフロー/アンダーフローのリスクを大幅に減らしhypot(a,b)て計算するかなり標準的な方法です。ほとんどのコンピューター言語でsqrt(a*a+b*b)は の出力はradiansであることに注意してください。したがって、緯度/経度を度数で求める場合は、結果に を掛ける必要があります。atan2180/pi

より正確な方法

上記の方法は、小さな縮尺 (通常の日常の壁など) ではほとんど目立たない簡略化のために、いくつかのエラーを発生させます。しかし、あなたの壁が実際には万里の長城である場合、これらのエラーがかなり受け入れられなくなることがわかります.

発生したエラーは、次の仮定によるものです。

  1. 緯度と経度は球上の座標です。通常、そうではありません。それらがある程度の品質の GPS 受信機からのものである場合、それらは地球の参照楕円体上の座標を記述します。これらの座標とデカルト ベクトルとの間の変換は、もう少し複雑です。

  2. 差分ベクトルv3はまさにベクトルです。ベクトルは直線セグメントですが、点v1と点を結ぶ実際の線v2はわずかに湾曲しています (地球は平らではないため)。したがって、v3findに拡張するとエラーが発生します。v4実際に曲線を延長する必要があります。繰り返しますが、これは単純に (地球が再び球体であると仮定し、クロス積とドット積を使用して)、またはより正確に (地球の参照楕円体上の線を延長して) 行うことができます。

これらの修正は非常に具体的で、非常に長くなり、非常に醜いものになる可能性があるため、このままにしておきます。とにかく、上記の「簡単な方法」で十分だと思います。

それにもかかわらず、より正確にそれを行う必要がある場合: 頭が良ければ、既存の Geo ソフトウェア ライブラリを使用することになります。あなたが賢ければ、すべての式と関連情報を調べて自分で実装を行い、実装にエラーと副作用があることを発見し、それらを修正して、これから再び学びます:)

于 2012-09-21T08:53:46.047 に答える