緯度/経度をある程度の量だけオフセットするアルゴリズム


108

緯度と経度のペアとデカルト座標(x、y)のメートル単位のベクトル変換を指定すると、新しい座標が得られるアルゴリズムを探しています。逆ハーバーシンのようなもの。距離とヘディング変換を使用して作業することもできますが、これはおそらくより遅くなり、それほど正確ではありません。理想的には、組み込みシステムで作業しているので、アルゴリズムは高速でなければなりません。精度は重要ではありませんが、10メートル以内であれば良いでしょう。


地球を球体としてうまくモデル化できますか?
暗闇

1
ええ、それは<1kmのオフセットを期待しているので問題ありません。
トーマスO

回答:


107

変位が大きすぎず(数キロメートル未満)、極が正しくない場合は、y方向の111,111メートル(111.111 km)が1度(緯度)であり、 111,111 * x方向のcos(緯度)メートルは1度(経度)です。


3
@トーマス:実際には、極に非常に近いことができます。1400 mの等しいx変位とy変位を使用してUTM計算をチェックしました(合計変位は2 kmです)。結果は8.6メートル以上まで良好です。最悪の緯度(この方向と変位の量について)は81度です。北に移動すると近似値は実際に正確になり、誤差は89.6度を超えるまで10メートル未満に留まります。
whuberの

60
ちなみに、111,111のこれらのマジックナンバーは、いくつかの歴史を知ることで簡単に覚えることができます。フランスは元々、メートルを10 ^ 7メートルが赤道から北極までのパリ子午線に沿った距離になるように定義しました。したがって、10 ^ 7/90 = 111,111.1メートルは、2世紀前のフランスの測量士の能力の範囲内の緯度1度に相当します。
whuber

3
したがって、式で、たとえば10.0 N、10.0 Eからy方向に+ 100m移動したい場合、100/111111を追加するだけですか?x方向に+ 100m移動すると、100÷(111,111×(cos 10))になりますか?これが正しいことを確認するだけです。
トーマスO

5
@Thomasはい、そうです。2番目の式、赤道から極に向かって移動するにつれて経度の度合いが小さくなるため、見かけのx変位を(1未満の数値で除算することにより)拡張することに注意してください。唯一の潜在的な問題は、あなたとあなたのソフトウェアプラットフォームが「cos」の意味に同意することです:cos(10)を10ラジアンではなく10 の余弦として解釈する方が良いでしょう!(そうでない場合、10度= 10 * pi / 180ラジアンは単純な変換を示しています。)この時点で、@ haakon_dによって提供されるコードは完全に理解できるはずです。
whuber

7
誰かがこの回答を編集して、「メートル」を「km」に置き換えようとしました。彼らはおそらく小数点のヨーロッパの意味でコンマ「、」を読んでいたでしょう。私はコンマを使用して長い数字列を3つのグループと小数点「。」に分けるというアメリカの慣習(国際出版物の慣習でもあると思います)に従います。コンマの代わりに。(この使用法は以前のコメントで明確に示されています。)あいまいさを避けるために、コンマとポイントの意味を明確に示すために回答を編集しました。
whuber

56

リードマンが答えで言うように、ウィリアムズの航空公式は非常に貴重な情報源であり、最大1 kmの変位で10メートル以内の精度を維持するには、これらの複雑なものを使用する必要があります。

ただし、約200mを超えるポイントオフセットで10mを超えるエラーを受け入れたい場合は、単純なフラットアース計算を使用できます。誤差は最大1kmまでのオフセットに対して50m未満になると思います。

 //Position, decimal degrees
 lat = 51.0
 lon = 0.0

 //Earth’s radius, sphere
 R=6378137

 //offsets in meters
 dn = 100
 de = 100

 //Coordinate offsets in radians
 dLat = dn/R
 dLon = de/(R*Cos(Pi*lat/180))

 //OffsetPosition, decimal degrees
 latO = lat + dLat * 180/Pi
 lonO = lon + dLon * 180/Pi 

これは返されるはずです:

 latO = 51,00089832
 lonO = 0,001427437

7
これは、私の値である111,111メートル/度を111,319.5に置き換えたことを除いて、これが私が提供した答えと同一であることを指摘したいだけです。あなたの値は、高緯度ではわずかに良くなりますが、低緯度ではわずかに悪くなります(0〜約40度)。どちらの値も、記載されている精度の要件を満たしています。
whuber

1
コードを提供するための+1。予想よりも正確であることに注意してください(通常、誤差は2000 mで5 m未満です)。
whuber

1
これはRの値を除いてあなたと同じ解決策であるが、簡潔さのために省略したという回答にコメントを追加する必要があるのだろうかと思いました。精度に関しては、システムに回転エラーを加えない限り、あなたは正しいです。ローカル投影座標系で測定されたオフセットを使用すると、回転誤差が非常に大きくなる場合があります。
haakon_d

1
これはすばらしい点です。暗黙的に、x変位は少なくとも真の東西に近く、y変位は南北に近いと仮定しています。そうでない場合は、緯度経度に相当するものを計算する前に、同等のEWおよびNS変位(「東向き」および「北向き」だけでなく)に変換する必要があります。
whuberの

Aviation Formulary方程式のd距離パラメーターはラジアン単位です(例:(距離/地球の半径))。
user1089933

23

私は航空処方集は、ことがわかり、ここで式とアルゴリズムのこれらのタイプに最適です。あなたの問題については、「緯度/経度の半径と距離を指定」をご覧くださいここ

このアルゴリズムは、三角関数の使用を低く抑えたい場合など、使用するには少し複雑すぎる可能性があることに注意してください。


これをありがとう-理想的に見えます。距離がメートルであるか他の測定値であるかどうかはわかりませんが。
トーマスO

2

最初にポイントを投影するのが理にかなっているかもしれません。次のような擬似コードを作成できます。

falt_coordinate = latlon_to_utm(original_koordinate)
new_flat_coordinate = flat_coordinate + (x,y)
result_coordinate = utm_to_latlon(new_flat_coordinate)

ここで、(x、y)は目的のオフセットです。

utm(フラット座標系)を使用する必要はありません。フラット座標系は、お住まいの地域で有効です。

どのソフトウェアを使用していますか?


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.