質問

なんだろうけど、日本人に最も効率的な表現のための緯度経度の座標?精度レベルで十分のための消費者のGPSデバイス

ほとんどの実装でも使用 double 各ユニット、がんの疑いが float 固定点フォーマットで差し障りありません。さんに心から聞こえる人のため圧縮しや店舗の大型の配列には、これらの値です。

編集:

その他の言葉をいただきました最低限の精度を表現するために必要な緯度経度、消費者レベルデバイス?

役に立ちましたか?

解決

個人的には、32ビットの10進固定小数点表現を使用し、Evanの回答と私のコメントに従って1,000,000で除算します。

ただし、スペースが本当に限られている場合は、いくつかの追加のアイデアがあります:

  • ワイヤーで26ビット固定小数点表現を使用できます。これには、緯度と経度をバイトの大きな配列にマーシャリングおよびアンマーシャリングする必要がありますが、32ビット値表現で各場所に12ビット節約できます-ほぼ19%の節約になるので、価値があります。

  • 極に近づくにつれて経度値の精度が低くなるという事実を活用できます。赤道で必要なのは26ビットだけです。したがって、経度のエンコードに使用されるビット数が緯度の値に依存するスキームを作成できます。

  • データに他の圧縮可能な属性がある場合-たとえば、すべてのポイントが通常非常に近い場合-デルタコーディングスキームを使用するなど、特定の利点を活用できます(最初のポイント以外の各ポイントをエンコードできます)最後のポイントからのデルタとして)。

他のヒント

地球の円周は約40.000 kmまたは24900マイル。

1桁の精度(3フィート)でGPS精度を桁違いに解決できるようにする必要があります。

したがって、40.000.000個の異なる値を保存するには精度が必要です。それは少なくとも26ビットの情報です。 32ビットのfloatまたはintで十分です。

編集:コメントからいくつかのポイントを追加しました。32ビット値は十分な精度を提供できるはずです。

32ビットの固定小数点表現を使用します。値が次の場合:

42.915512 -99.521654 values * 100000 int32_t 's (負の値も可能)。

int32_t lat = 42915512;
int32_t lon = -99521654;

これは単純で正確な妥協点です( 5 小数点は通常十分で、いつでも 1000000 に上げられます)必要に応じて 6 を取得します)。

ユーザーに表示するには、 caf が示唆することを実行します。

  

...ユーザーに表示するには-整数を使用   除算とモジュロ、例えば printf(" Lat =   %d。%06d \ n"、lat / 1000000、abs(lat)%   1000000)

これらは、相対的な順序が維持されるため、効率的な方法で比較可能/ソート可能になります。

編集:もう1つの利点は、ネットワーク経由で送信したり、ポータブル形式でバイナリ形式でディスクに保存できることです。

フロートは、消費者レベルのGPSデバイスが要求された精度に近い場所にあったとしても、GPS座標を保存するのに十分すぎるほどです。これが真実だと思わない場合は、次の2つの簡単な実験を試してください。

  1. 複数のGPSデバイスをフィールド上の1つの場所に移動し、各デバイスで測定された座標を書き留めます。内部に戻って、各デバイスのポイントをマップにプロットします(Googleがこれを行うものを持っていると思います)。ポイントがどれだけ離れているかに驚かれます(それらはすべて同じスポットを正確に測定しているはずですが)。
  2. (おそらく)最も正確なデバイスを用意し、衛星を修正できるが雨が降らない場所に置き、数日間にわたって測定した一連の測定値を記録します。すべての測定値をプロットします(#1のように)。繰り返しますが、ポイント(すべて同じまたはほぼ同じである必要があります)がマップ全体をさまよい、時には数百フィートも移動することに驚くでしょう。

私は長年GPS対応PDAのアプリケーションを書いてきましたが、疑わしい顧客のために何度もこれを検証してきました(このように賭けても勝ちました)。これよりも高い精度を達成する高品質のGPSデバイスがありますが、より高価なチップセットを使用すると精度が向上し、デバイスは数日間または数週間にわたって1つの場所に残され、測定値は時間の経過とともに平均化されます。

4バイトの浮動小数点数は、デバイス自体よりもはるかに正確です。もちろん、2Xファクターが問題にならない限り、代わりにdoubleを使用してもまったく問題はありません。

経度179度で23ビットの精度は10メートル未満の精度を提供します。これは通常のGPSデバイスが提供する最高の精度です。赤道で:

% gps distance "0.0, 179.0" "0.0, $((179 * (1 + 2**-23)))"
From 0.0, 179.0 to 0.0, 179.00002133846283 is 7.79 feet E
From 0.0, 179.0 to 0.0, 179.00002133846283 is 2.38 meters E

したがって、Cコンパイラで float として知られているIEEE 754単精度浮動小数点数は、表現にちょうど適しています。拡張計算にフロートを使用することに注意してください!丸め誤差により、ランチが食べられない場合があります。数値アナリストに相談してください。

GarminのIMGマップ形式では、ボックスのエッジを設定するためにフロートを使用して境界ボックス内に座標を保存します。ボックス内の座標は、必要な精度に応じて最小値と最大値の間で線形である可変ビット数を使用して定義されます。

例: minlat = 49.0、maxlat = 50.0、minlon = 122.0、maxlon = 123.0、ビット数= 16

値:
32768,32768は49.5、122.5に変換されます
16384,0は49.25、122.0

精度を低くする必要がある場合、ビット数= 4で同じ出力を生成できます
8,8は49.5、122.5に変換されます
4,0は49.25、122.0です

の場合は保存大型の配列には、これらの値は、いくつかの簡単な場合のデルタの圧縮、および店舗の中州には、大幅に軽減することができるサイズのデータストリームです。できな中州からの"キーポイント"

K D D D D D D D D D D K D D D D...

k+dを取得すdポイント

の中州にすべての参考前K、再構築の任意の点が必要となりのK D

はincrimental中州

K I I K

この場合複数の和を希望の位置にします。そのデータは小さい。でreconsturct

k+i+i+iの4点

その両方を組み合わせることができ

K D I I I D I I I D I I I K

このようなmpeg-2IPBフレームがこのように決してない4以上の金額任意の位置、または一部のデルタおよびIncrimentalました。

緯度と経度の両方の値を単一の32ビット整数に詰め込むことができます。解像度は最低でも〜2.4メートル/ピクセル(赤道で)です。再帰的なタイルシステムを使用します。レベルごとに2ビットを使用すると、16レベルを32ビットで保存できます。 Virtual Earthのタイルに関するこの記事を見ると、それがどのように機能するかを知ることができます。システム。これはメルカトルを使用しているため、極に問題が生じます。代わりに、異なる投影法を使用しても、非常に類似した結果が得られます。

これはラフフィルターにも使用でき、最初のNビットが同じになるため、特定の親タイル内のポイントを検索できます(したがって、検索はビットマスキングになります)。

地球が3959マイル(または5280フィート/ mi = 20903520フィート)の半径 'R'を持つ完全な球体(それではないが、十分に近い)であると仮定すると、円周は131340690フィート(2×PIを使用) ×R)。

経度360度は131340690フィートをカバーします。 180度の緯度は65670345フィートをカバーします。

緯度/経度を3フィートの精度で保存する場合、43780230(131340690/3)の経度値と21890115(65670345/3)の緯度値を保存できる必要があります。 43780230は保存に25.38ビット(log(43780230)/ log(2))を必要とし、21890115は保存に24.38ビット(log(21890115)/ log(2))を必要とします-または50ビット(または6.25バイト)未満。

だから、緯度と経度を6バイトだけで保存したい場合、精度はどうなりますか? 6バイトは48ビットです。これは、緯度が23.5ビット、経度が24.5ビットであることを意味します(経度には2倍の値があり、1ビットで24.5-23.5 = 1ビットです)。したがって、23.5ビットを使用すると、0〜11863282(11863283値)の数値を表すことができます。 65670345フィートを11863283の値で割った値は5.53フィートです(経度の精度値も同じです)。

下線:したがって、緯度と経度の両方で5.5フィートの精度で生活できる場合は、両方の値を6バイトにまとめることができます。

*注意事項:緯度と経度は、球体の周りの位置情報を保存するのに恐ろしいというコメントについて(極に保存する情報が少ないため)–まあ、それらのコメントは数学に耐えられません!それを理解しましょう。地球のあらゆる平方フィートの中心にある地面に杭を記録して配置できる、新しい完璧なシステムを設計したいとしましょう。地球の表面積(Rが3959マイル、球体の表面積の公式)は5490965469267303 SQ FTです。これは、多くのステークが52.29ビットを表すために必要です。現在、既存の緯度と経度のシステムは長方形のシステムを使用しています。長方形の幅は地球の円周で、長方形の高さは円周の1/2です)– 131340690 * 65670345(上記参照)、または8625188424838050 SQ FT –表示するには52.94ビットが必要です(このシステムは配置します)極の周りの地面に「多すぎる」杭)。したがって、衝撃的な答えは、新しい完全なシステムと古い緯度/経度システムの両方が、地球上の単一の場所を格納するために53フィートの実際のビットを必要とし、1フィートの精度になります!

long / latが球体にデータを保存するひどい方法であるという事実を誰も投稿していないことに驚いています(誰かが経度は極の近くでより低い精度を要求すると言及しました)。

基本的に、データ位置をXおよびY座標としてメートル単位で保存できます。地球の周りにぴったり収まる立方体を想像してみてください(母は大丈夫ほぼ収まります)。 3番目の座標は地球のリディアスに由来する可能性があるため、3つの座標すべてではなく、XとYの位置のみを保存する必要があります。r=平方根[x ^ 2 + y ^ 2 + z ^ 2] 。

したがって、緯度/経度をメートル単位のx / yに変換します。座標(地球の直径)ごとに合計12756200mだけが必要です。したがって、合計値の範囲は0〜25,512,400(長/緯度を使用しているため40,000,000であると主張する人)だけで、+ /-0.5mまで正確になります。

その結果、位置ごとにわずか25ビットになります。もし私があなたなら、私はちょうど2m以内の精度を行い、位置ごとに24ビットを使用します。それはきちんとした3バイトだからです。

また、ウェイポイント情報をパスに保存している場合、各ウェイポイントを最後のウェイポイントからのオフセットとして保存できます。 24ビットx / y座標で開始するように。次に、x / yメーターを加算/減算することにより位置を調整する16ビットの「更新」を行います。 16ビットでは、ウェイポイントの更新は400m以上離れています。そのため、デバイスが飛行機用ではなく、頻繁に更新されるものではないことがわかっている場合は、これも受け入れられる可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top