緯度と経度はどのくらい正確に保存する必要がありますか?


103

私はこの質問をここで読んでいました:

緯度と経度のデータをSQLデータベースに格納するときに使用するデータ型は何ですか?

そして、一般的なコンセンサスは、Decimal(9,6)を使用する方法にあるということです。私にとっての問題は、これが本当にどれほど正確に必要なのかということです。

たとえば、GoogleのAPIは次のような結果を返します。

"lat": 37.4219720,
"lng": -122.0841430

-122.0841430のうち、何桁必要ですか。私はいくつかのガイドを読みましたが、これらを理解するのに十分な意味がありません。

より正確に言えば、正確な位置から50フィート以内で正確にしたい場合、小数点をいくつ格納する必要がありますか?

おそらく、より良い質問は実際にはプログラミング以外の質問でしょうが、それは次のとおりです。各小数点がどれほど正確かを示しますか?

これは簡単ですか?

  1. リストアイテム
  2. x00 = 6000マイル
  3. xx0 = 600マイル
  4. xxx = 60マイル
  5. xxx.x = 6マイル
  6. xxx.xx = .6マイル
  7. 等?

7
惑星の表面は完全な球ではなく、極からの距離も主要な主要な要因であるため、座標の精度はそれらの座標がどこにあるかに依存します。ただし、小数点以下3桁は平均で約120メートル/ 400フィートです。4つの小数は... 12メートル/ 40フィート、などだろう
マルク・B

1
GISのstackexchangeでこの質問を参照してください:gis.stackexchange.com/questions/8650/...
Flimm

回答:


191

赤道での精度と小数点以下の桁数

decimal  degrees    distance
places
-------------------------------  
0        1.0        111 km
1        0.1        11.1 km
2        0.01       1.11 km
3        0.001      111 m
4        0.0001     11.1 m
5        0.00001    1.11 m
6        0.000001   0.111 m
7        0.0000001  1.11 cm
8        0.00000001 1.11 mm

ref:https : //en.wikipedia.org/wiki/Decimal_degrees#Precision


4
これらが赤道にある場合、それはこれらが最悪の場合のエラーであることを意味しますか?
Liath、2014年

6
実際には、赤道が最良のケースです。1つの緯度と1つの経度は赤道で同じサイズ(69マイル)ですが、どちらかの極に近づくにつれて1つの経度はゼロに縮小します。ここでは非常に素晴らしい説明があります:nationalatlas.gov/articles/mapping/a_latlong.html#four
codingoutloud

11
@codingoutloudこれらの最悪の場合のエラーになります。ちなみに、これらは海抜で緯度/経度を使用する場合の最悪の場合のエラーです。標高が6,378 mの場合、誤差は0.1%増加します。
スコットB

@codingoutload:そのリンクは明らかに存在しません:(
Tom Stambaugh、2015

1
@Tom Stambaugh:そのためweb.archive.orgあります:web.archive.org/web/20070810120810/http://nationalatlas.gov/...
ステファン・スタイガー

19
+----------------+-------------+
|    Decimals    |  Precision  |
+----------------+-------------+
|    5           |  1m         |
|    4           |  11m        |
|    3           |  111m       |
+----------------+-------------+

50フィート(15m)の精度が必要な場合は、4桁にします。そうdecimal(9,6)


9
SQL Serverを使用している場合... 1〜9の精度では5バイトを使用することに注意してください。したがって、decimal(7,4)の代わりにdecimal(9,6)を使用し、両方が同じ量のスペースを占めるため、より高い精度を利用することができます。
Theo

緯度については、(8,6)(または(6,4)MySQLでバイトを保存するために)使用
Rick James

15

私はデータベースを設計し、この問題をしばらく研究してきました。データフィールドが小数点以下17桁を許可するように定義されているOracleバックエンドで既製のアプリケーションを使用します。ばかげた!それは、1000分の1インチです。世界でこれほど正確なGPS機器はありません。それでは、小数点以下17桁を脇に置いて、実際的な問題に対処しましょう。政府は、システムが「95%信頼レベルで7.8メートルの「最悪の場合」の擬似距離精度」に優れていることを保証しますが、実際のFAA(高品質の機器を使用)は、通常、GPSの読み取り値がメートル以内。

したがって、次の2つの質問をする必要があります。1)価値の源は何ですか。2)データは何に使用されますか?

携帯電話は特に正確ではなく、Google / MapQuestの測定値はおそらく小数点以下4桁または5桁です。高品質のGPS機器を使用すると、6(米国内)になる可能性があります。しかし、それ以上のキャプチャは、タイピングとストレージスペースの無駄です。さらに、値に対して検索が行われる場合、ユーザーは6が最も多く探すべきであることを知っていると便利です(明らかに、入力された検索値は、最初に検索されるデータ値と同じ精度に丸められる必要があります) )。

さらに、Googleマップで場所を表示するか、GPSに配置してそこに到達するだけの場合は、4または5で十分です。

私はこの数字をすべて入力している周りの人々を笑わせなければなりません。そして、彼らは正確にどこでその測定を行っていますか?フロントドアノブ?メールボックスは前面にありますか?建物の中心?セルタワーの上部?そして...全員が一貫して同じ場所でそれを取っていますか?

優れたデータベース設計として、ユーザーから5桁以上の10進数の値を受け入れ、丸め、一貫性のために5桁のみをキャプチャします[機器が良好で、最終用途で保証されている場合は6桁]。


4
17桁では多すぎることに同意しますが、データを後処理する場合は6桁では少なすぎることをお勧めします。半径のクエリ(「このポイントから半径0.5マイル以内のフィーチャに答える」)を行う場合、エラー(切り捨てを含む)が拡大されます。このようなクエリの出力で6桁の10進数が必要な場合、入力はかなり多くの数字で始まる必要があります。当店ではDECIMAL(18,15)を使用する傾向があります。私たちの目標は、dbが空間計算の精度の制限要因にならないようにすることです。
トムスタンボー、2015

小数点以下6桁を超えると、今日のGPS衛星で利用できる精度を超えます。後処理では、大きなエラーは発生しません。 DECIMAL(18,15)9バイトかかります。
リックジェームズ

11

地球の形状により、緯度と経度の間の距離は変化し、極に近づくにつれて経度と経度の間の距離は短くなります。赤道について話しましょう。各度間距離は、緯度が110.574km、経度が111.320kmです。

50フィートは0.01524 kmなので、次のようになります。

  • 0.01524 / 110.574 =緯度の1/7255
  • 0.01524 / 111.320 =経度の1/7304

合計7桁の精度で、1万分の1度まで下がるのに十分な4桁のスケールが必要です。

DECIMAL(7,4) あなたのニーズには十分なはずです。


5

球のさまざまな部分と対角距離を考慮した、利用可能な精度の表を以下に示します。

   Datatype           Bytes       resolution
   ------------------ -----  --------------------------------
   Deg*100 (SMALLINT)     4  1570 m    1.0 mi  Cities
   DECIMAL(4,2)/(5,2)     5  1570 m    1.0 mi  Cities
   SMALLINT scaled        4   682 m    0.4 mi  Cities
   Deg*10000 (MEDIUMINT)  6    16 m     52 ft  Houses/Businesses
   DECIMAL(6,4)/(7,4)     7    16 m     52 ft  Houses/Businesses
   MEDIUMINT scaled       6   2.7 m    8.8 ft
   FLOAT                  8   1.7 m    5.6 ft
   DECIMAL(8,6)/(9,6)     9    16cm    1/2 ft  Friends in a mall
   Deg*10000000 (INT)     8    16mm    5/8 in  Marbles
   DOUBLE                16   3.5nm     ...    Fleas on a dog

- http://mysql.rjweb.org/doc.php/latlng#representation_choices


3

浮動小数点値を保存しないでください。あなたはそれらが正確であると思うかもしれませんが、そうではありません。それらは概算です。そして、言語によって浮動小数点情報の「解析」方法が異なることがわかります。また、データベースによって、値の近似を実装する方法が異なります。

代わりに、Geohashを使用してください。このビデオでは、5分以内にGeohashを紹介し、視覚的に説明しています。Geohashは、経度/緯度情報を一貫した方法でエンコード/デコードするための優れた方法です。経度/緯度の近似浮動小数点値をデータベースの列に決して「シリアル化」しないことで、代わりにGeohashを使用して、文字列値で得られるのと同じ望ましい往復一貫性の保証が得られます。このWebサイトは、Geohashで遊ぶのに最適です。


FLOATそしてDOUBLEこの文脈では、あなたが説明するいくつかの問題に悩まされることはありません。
リックジェームズ

@RickJames「このコンテキスト」を十分に指定していませんでした。つまり、厳密に言えば、2つのDB列に値を格納することです。ただし、指定された値は未使用のDB列に収まるだけではなく、これらの値に対して(近接)クエリが書き込まれるという暗黙の仮定があります。そして、このかなり実用的な仮定を保持することは、それが信頼できない近似であることのすべての問題が引き続き発生することを意味します。
chaotic3quilibrium

1
1つのFLOAT値と「次の」値が非常に接近しているため、1つの都市(または車両、人、ノミ)を別の都市と区別できない場合、丸めや表現のエラーは問題になりません。一方、2つFLOATsDOUBLEsまたは近似値DECIMALs)を「=」と比較することはほとんどの場合愚かです。
リックジェームズ

ポイントを逃しているようです。試みられたクエリは、明示的にではないにしても、暗黙的に等号を使用します。そして、これは、SQL Server内に厳密にとどまり、値を持つ他のレイヤーや言語を経由していないことを前提としています。これがSQL Serverに対するこれに対するMicrosoftの正式な応答です。blogs.msdn.microsoft.com
2009/11/14

申し訳ありませんが、[mysql]SQL Serverではなく、質問にタグが付けられていると思いました。
リックジェームズ

2

Googleマップ上の場所をクリックすると、小数点以下7桁の緯度と経度が表示されます

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