ฉันควรจัดเก็บละติจูดและลองจิจูดอย่างแม่นยำเพียงใด


104

ฉันกำลังอ่านคำถามนี้ที่นี่:

ประเภทข้อมูลใดที่จะใช้เมื่อจัดเก็บข้อมูลละติจูดและลองจิจูดในฐานข้อมูล SQL

และดูเหมือนว่าฉันทามติทั่วไปคือการใช้ทศนิยม (9,6) เป็นหนทางที่จะไป คำถามสำหรับฉันคือฉันต้องการสิ่งนี้จริงๆหรือ?

ตัวอย่างเช่น API ของ Google ส่งคืนผลลัพธ์ดังนี้:

"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 ฟุต ฯลฯ ...
Marc B

1
ดูคำถามนี้ใน GIS stackexchange: gis.stackexchange.com/questions/8650/…
Flimm

คำตอบ:


193

ความแม่นยำเทียบกับตำแหน่งทศนิยมที่เส้นศูนย์สูตร

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

อ้างอิง: https://en.wikipedia.org/wiki/Decimal_degrees#Precision


4
หากสิ่งเหล่านี้อยู่ที่เส้นศูนย์สูตรหมายความว่าสิ่งเหล่านี้เป็นข้อผิดพลาดที่เลวร้ายที่สุด?
Liath

6
ที่จริงแล้วเส้นศูนย์สูตรเป็นกรณีที่ดีที่สุด หนึ่งละติจูดและลองจิจูดหนึ่งองศามีขนาดเท่ากันที่เส้นศูนย์สูตร (69 ไมล์) แต่ลองจิจูดหนึ่งองศาจะหดตัวเป็นศูนย์เมื่อเข้าใกล้ขั้วใดขั้วหนึ่ง นี่เป็นคำอธิบายที่ดีมาก: nationalatlas.gov/articles/mapping/a_latlong.html#four
codingoutloud

11
@codingoutloud ซึ่งจะทำให้เกิดข้อผิดพลาดที่เลวร้ายที่สุดเหล่านี้ หรือจะอวดดีนี่เป็นข้อผิดพลาดที่เลวร้ายที่สุดสำหรับการใช้ lat / lon ที่ระดับน้ำทะเล ที่ระดับความสูง 6,378 ม. ความผิดพลาดจะเพิ่มขึ้น 0.1%
Scott B

@codingoutload: ดูเหมือนว่าลิงก์นั้นจะไม่ปรากฏอีกต่อไป :(
Tom Stambaugh

1
@ Tom Stambaugh: มี web.archive.org สำหรับสิ่งนั้น: web.archive.org/web/20070810120810/http://nationalatlas.gov/…
Stefan Steiger

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

หากคุณต้องการความแม่นยำ 50 ฟุต (15 เมตร) ให้ใช้ตัวเลข 4 หลัก ดังนั้นdecimal(9,6)


9
หากคุณใช้ SQL Server ... เป็นที่น่าสังเกตว่าความแม่นยำ 1-9 ใช้ 5 ไบต์ ดังนั้นคุณอาจใช้ทศนิยม (9,6) แทนทศนิยม (7,4) และใช้ประโยชน์จากความแม่นยำที่สูงขึ้นเนื่องจากทั้งสองใช้พื้นที่เท่ากัน
ธีโอ

สำหรับละติจูดให้ใช้(8,6)(หรือ(6,4)เพื่อบันทึกบันทึกไบต์ (ใน MySQL)
Rick James

15

ฉันออกแบบฐานข้อมูลและศึกษาคำถามนี้มาระยะหนึ่งแล้ว เราใช้แอปพลิเคชันนอกชั้นวางกับแบ็กเอนด์ Oracle ซึ่งมีการกำหนดช่องข้อมูลเพื่อให้มีทศนิยม 17 ตำแหน่ง ไร้สาระ! นั่นคือในส่วนที่พันของนิ้ว ไม่มีเครื่องมือ GPS ใดในโลกที่แม่นยำขนาดนี้ ลองกันทศนิยม 17 ตำแหน่งแล้วจัดการกับการปฏิบัติจริง รัฐบาลรับประกันว่าระบบของพวกเขาดีสำหรับ "กรณีที่เลวร้ายที่สุด" ความแม่นยำหลอกที่ 7.8 เมตรที่ระดับความเชื่อมั่น 95% "แต่จากนั้นกล่าวต่อไปว่า FAA จริง (โดยใช้เครื่องมือคุณภาพสูง) แสดงว่าการอ่าน GPS มักจะดี ภายในหนึ่งเมตร

ดังนั้นคุณต้องถามตัวเองสองคำถาม: 1) อะไรคือที่มาของค่านิยมของคุณ? 2) ข้อมูลจะถูกใช้เพื่ออะไร?

โทรศัพท์มือถือไม่แม่นยำเป็นพิเศษและการอ่าน Google / MapQuest อาจดีแค่ 4 หรือ 5 ทศนิยมเท่านั้น เครื่องมือ GPS คุณภาพสูงอาจทำให้คุณได้รับ 6 (ในสหรัฐอเมริกา) แต่การจับภาพมากกว่านั้นเป็นการสิ้นเปลืองเนื้อที่ในการพิมพ์และการจัดเก็บ นอกจากนี้หากทำการค้นหาใด ๆ เกี่ยวกับค่าเป็นสิ่งที่ดีสำหรับผู้ใช้ที่ทราบว่า 6 จะเป็นสิ่งที่ควรมองหามากที่สุด (เห็นได้ชัดว่าค่าการค้นหาใด ๆ ที่ป้อนควรถูกปัดเศษให้มีความแม่นยำเช่นเดียวกับค่าข้อมูลที่กำลังค้นหา ).

นอกจากนี้หากสิ่งที่คุณต้องทำคือดูตำแหน่งใน Google Maps หรือวางไว้ใน GPS เพื่อไปที่นั่นสี่หรือห้าก็มีมากมาย

ฉันต้องหัวเราะเยาะผู้คนแถวนี้ที่ป้อนตัวเลขเหล่านั้นทั้งหมด และพวกเขากำลังวัดผลอยู่ที่ไหน? ลูกบิดประตูหน้า? ตู้จดหมายออกด้านหน้า? ศูนย์กลางของอาคาร? ด้านบนของหอเซลล์? และ ... ทุกคนถ่ายที่เดียวกันอย่างสม่ำเสมอหรือไม่?

ในการออกแบบฐานข้อมูลที่ดีฉันจะยอมรับค่าจากผู้ใช้โดยอาจมีทศนิยมมากกว่าห้าหลักสองสามหลักจากนั้นปัดเศษและจับเพียงห้าหลักเพื่อความสอดคล้อง [อาจเป็นหกหากเครื่องมือของคุณดีและการใช้งานปลายทางของคุณรับประกันได้]


4
แม้ว่าฉันยอมรับว่าตัวเลข 17 หลักมากเกินไป แต่ฉันขอแนะนำว่า 6 น้อยเกินไปหากข้อมูลจะถูกประมวลผลภายหลัง เมื่อทำสิ่งต่างๆเช่นการสืบค้นรัศมี ("คุณสมบัติคำตอบภายในรัศมี 0.5 ไมล์ของจุดนี้") ข้อผิดพลาดรวมถึงการตัดทอนจะถูกขยาย หากคุณต้องการทศนิยม 6 หลักในผลลัพธ์ของแบบสอบถามดังกล่าวอินพุตควรเริ่มต้นด้วยจำนวนมากกว่า ร้านของเรามีแนวโน้มที่จะใช้ DECIMAL (18,15) เป้าหมายของเราคือตรวจสอบให้แน่ใจว่าฐานข้อมูลไม่ใช่ปัจจัยจำกัดความแม่นยำของการคำนวณเชิงพื้นที่
Tom Stambaugh

การเกินทศนิยม 6 ตำแหน่งนั้นเกินความแม่นยำที่มีอยู่ของดาวเทียม GPS ในปัจจุบัน การประมวลผลภายหลังจะไม่ทำให้เกิดข้อผิดพลาดจำนวนมาก DECIMAL(18,15)ใช้เวลา 9 ไบต์
Rick James

11

ระยะห่างระหว่างแต่ละระดับของละติจูดจะแตกต่างกันไปเนื่องจากรูปร่างของโลกและระยะห่างระหว่างแต่ละระดับของลองจิจูดจะเล็กลงเมื่อคุณเข้าใกล้ขั้วมากขึ้น ลองพูดถึงเส้นศูนย์สูตรซึ่งระยะห่างระหว่างแต่ละองศาคือ 110.574 กม. สำหรับละติจูดและ 111.320 กม. สำหรับลองจิจูด

50 ฟุตคือ 0.01524 กม. ดังนั้น:

  • 0.01524 / 110.574 = 1/7255 ขององศาละติจูด
  • 0.01524 / 111.320 = 1/7304 ขององศาลองจิจูด

คุณต้องมีมาตราส่วน 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แทน วิดีโอนี้แนะนำและอธิบาย Geohash ด้วยสายตาภายในเวลาไม่เกิน 5 นาที Geohash เป็นวิธีที่เหนือกว่าในการเข้ารหัส / ถอดรหัสข้อมูลลองจิจูด / ละติจูดด้วยวิธีที่สอดคล้องกัน การไม่ทำการ "จัดลำดับ" ค่าจุดลอยตัวโดยประมาณของลองจิจูด / ละติจูดลงในคอลัมน์ฐานข้อมูลและแทนที่จะใช้ Geohash คุณจะได้รับความสอดคล้องในการเดินทางไปกลับตามที่ต้องการซึ่งรับประกันว่าคุณจะได้รับจากค่า String เว็บไซต์นี้เหมาะสำหรับการช่วยคุณเล่น Geohash


FLOATและDOUBLE, ในบริบทนี้ไม่ต้องทนทุกข์ทรมานจากบางส่วนของปัญหาที่คุณอธิบาย
Rick James

@RickJames คุณระบุ "บริบทนี้" ไม่เพียงพอ หากคุณหมายถึงอย่างเคร่งครัดในการจัดเก็บค่าในคอลัมน์ DB สองคอลัมน์บางที อย่างไรก็ตามค่าที่กำหนดไม่ได้อยู่ในคอลัมน์ DB เท่านั้นโดยไม่ได้ใช้สมมติฐานโดยปริยายว่าจะมีคำค้นหา (ความใกล้เคียง) ที่เขียนขึ้นเทียบกับค่าเหล่านี้ และการถือเอาข้อสันนิษฐานในทางปฏิบัติที่เป็นธรรมนี้หมายความว่าประเด็นทั้งหมดของมันเป็นการประมาณที่ไม่น่าเชื่อถือยังคงอยู่ต่อไป
messy3quilibrium

1
หากFLOATค่าหนึ่งและค่า 'ถัดไป' มีค่าใกล้กันมากจนคุณไม่สามารถบอกเมือง (หรือยานพาหนะหรือบุคคลหรือหมัด) จากเมืองอื่นได้ข้อผิดพลาดในการปัดเศษและการแทนค่าก็ไม่สำคัญ ในขณะเดียวกันก็มักจะเป็นเรื่องโง่เขลาที่จะเปรียบเทียบสองFLOATs(หรือDOUBLEsหรือโดยประมาณDECIMALs) กับ '='
Rick James

ดูเหมือนว่าคุณจะพลาด การสืบค้นใด ๆ ที่พยายามจะถูกใช้โดยปริยายโดยใช้เท่ากับถ้าไม่ชัดเจน และสิ่งนี้จะถือว่าคุณไม่ได้ผ่านเลเยอร์และภาษาอื่น ๆ ที่มีค่าอยู่ภายใน SQL Server อย่างเคร่งครัด นี่คือคำตอบของ Microsoft อย่างเป็นทางการสำหรับสิ่งนี้สำหรับ SQL Server: blogs.msdn.microsoft.com/qingsongyao/2009/11/14/…
อลวน 3quilibrium

ฉันขอโทษฉันคิดว่าคำถามถูกแท็ก[mysql]ไม่ใช่ SQL Server
Rick James

2

หากคุณคลิกตำแหน่งบน Google Maps คุณจะได้รับละติจูดและลองจิจูดพร้อมทศนิยม 7 ตำแหน่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.