私はここでこの質問を読んでいた:
緯度と経度のデータをSQLデータベースに保存するときに使用するデータ型は何ですか?
そして、一般的なコンセンサスは、Decimal(9,6)を使用する方法であるということです。私にとっての質問は、これがどれほど正確に必要なのかということです。
たとえば、GoogleのAPIは次のような結果を返します。
"lat": 37.4219720,
"lng": -122.0841430
-122.0841430のうち、何桁必要ですか?私はいくつかのガイドを読みましたが、これを理解するのに十分な意味を理解できません。
私の質問でより正確に言うと、正確な位置から50フィート以内で正確にしたい場合、何桁の小数点を保存する必要がありますか?
おそらく、より良い質問は実際には非プログラミングの質問かもしれませんが、それは次のとおりです。各小数点がどれほど正確かを教えてくれますか?
これは簡単ですか?
赤道での精度と小数点以下の桁数
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
_+----------------+-------------+
| Decimals | Precision |
+----------------+-------------+
| 5 | 1m |
| 4 | 11m |
| 3 | 111m |
+----------------+-------------+
_
50フィート(15m)の精度が必要な場合は、4桁にします。 decimal(9,6)
私はデータベースを設計し、この質問をしばらく研究しています。データフィールドが小数点以下17桁まで許可されるように定義されたOracleバックエンドで既製のアプリケーションを使用します。とんでもない!それは1インチの1000分の1です。世界中のどのGPS機器もそれほど正確ではありません。それでは、小数点以下17桁を別にして、実用的な対処をしましょう。政府は、システムが「最悪の場合」95%の信頼レベルで7.8メートルの擬似距離精度に適していることを保証しますが、実際のFAA(高品質の機器を使用)は通常GPS測定値が良好であると示していますメートル以内。
したがって、次の2つの質問を自問する必要があります。1)価値の源泉は何ですか? 2)データは何に使用されますか?
携帯電話は特に正確ではなく、Google/MapQuestの読み取り値は、おそらく小数点以下4桁または5桁までです。高品質のGPS機器で6(米国内)になる場合があります。しかし、それ以上のものをキャプチャすることは、入力と記憶領域の無駄です。さらに、値に対して検索が行われた場合、ユーザーにとって最も重要なのは6であることがわかります(明らかに、入力された検索値は、最初に検索対象のデータ値と同じ精度に丸められる必要があります) )。
さらに、Googleマップで場所を表示するか、GPSに配置してそこに到達するだけであれば、4〜5個で十分です。
この数字をすべて入力する人を笑わなければなりません。そして、彼らは正確にどこでその測定を行っていますか?フロントドアノブ?メールボックスが前面にありますか?建物の中心?セルタワーのトップ?そして...誰もが一貫して同じ場所でそれを取っていますか?
優れたデータベース設計として、ユーザーからの値を10進数で5桁以上受け入れてから、一貫性を保つために5桁のみを丸めてキャプチャします(機器が良好で最終用途が保証する場合は6桁)。
緯度ごとの距離は、地球の形状によって異なり、極に近づくにつれて経度ごとの距離は小さくなります。それでは、赤道について話しましょう。 各度の間の距離 は、緯度が110.574km、経度が111.320kmです。
50ftは0.01524kmですので、
合計7桁の精度で、1万分の1度まで下がるのに十分な4桁のスケールが必要です。
DECIMAL(7,4)
は、あなたのニーズに十分応えるはずです。
浮動小数点値を保存しないでください。あなたはそれらが正確であると仮定するかもしれませんが、そうではありません。それらは近似値です。そして、異なる言語には、浮動小数点情報を「解析」する異なる方法があります。また、データベースごとに、値の近似を実装する方法が異なります。
代わりに、 Geohash を使用してください。 このビデオでは、5分以内にGeohashを紹介し、視覚的に説明します。 Geohashは、経度/緯度情報を一貫した方法でエンコード/デコードするための優れた方法です。経度/緯度の近似浮動小数点値をデータベース列に「シリアル化」することなく、代わりにGeohashを使用して、ストリング値で取得するのと同じ望ましい往復一貫性保証を取得します。 このWebサイトはGeohashで遊ぶのに役立ちます。
球体のさまざまな部分と対角距離を考慮して、利用可能な精度の表を以下に示します。
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
Googleマップで場所をクリックすると、小数点以下7桁の緯度と経度が表示されます