Tôi nên lưu trữ vĩ độ và kinh độ chính xác đến mức nào?


103

Tôi đã đọc câu hỏi này ở đây:

Loại dữ liệu nào để sử dụng khi lưu trữ dữ liệu vĩ độ và kinh độ trong cơ sở dữ liệu SQL?

Và có vẻ như sự đồng thuận chung là sử dụng Decimal (9,6) là cách để đi. Câu hỏi đặt ra cho tôi là, tôi thực sự cần cái này chính xác đến mức nào?

Ví dụ: API của Google trả về một kết quả như:

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

Trong số -122.0841430, tôi cần bao nhiêu chữ số? Tôi đã đọc một số hướng dẫn nhưng tôi không thể hiểu đủ về chúng để tìm ra điều này.

Nói chính xác hơn trong câu hỏi của tôi: Nếu tôi muốn chính xác trong phạm vi 50 feet tính từ vị trí chính xác, tôi cần lưu bao nhiêu dấu thập phân?

Có lẽ một câu hỏi tốt hơn thực sự sẽ là một câu hỏi không phải lập trình, nhưng nó sẽ là: mỗi dấu thập phân cho bạn chính xác hơn bao nhiêu?

Nó có đơn giản như vậy không?

  1. Liệt kê mục
  2. x00 = 6000 dặm
  3. xx0 = 600 dặm
  4. xxx = 60 dặm
  5. xxx.x = 6 dặm
  6. xxx.xx = 0,6 dặm
  7. Vân vân?

7
Độ chính xác của các tọa độ phụ thuộc vào việc các tọa độ đó nằm ở đâu, vì bề mặt của hành tinh không phải là một hình cầu hoàn hảo và khoảng cách từ các cực cũng là một yếu tố CHỦ YẾU CHÍNH. Tuy nhiên, trung bình 3 vị trí thập phân là khoảng 120 mét / 400 feet. 4 số thập phân sẽ là 12meters / 40feet, v.v.
Marc B

1
Xem câu hỏi này trên GIS stackexchange: gis.stackexchange.com/questions/8650/…
Flimm

Câu trả lời:


191

Độ chính xác so với vị trí thập phân ở đường xích đạo

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#Pre precision


4
Nếu chúng nằm ở đường xích đạo thì điều đó có nghĩa rằng đây là những lỗi trường hợp xấu nhất?
Liath

6
Trên thực tế, đường xích đạo là trường hợp tốt nhất. Một vĩ độ và kinh độ một mức độ có cùng kích thước tại đường xích đạo (69 dặm), nhưng một mức độ co lại kinh độ bằng không khi nó tiếp cận một trong hai cực. Đây là một lời giải thích rất hay: nationalatlas.gov/articles/mapping/a_latlong.html#four
codingoutloud

11
@codingoutloud Điều nào sẽ gây ra các lỗi trường hợp xấu nhất này. Hay nói cách khác, đây là những lỗi trường hợp xấu nhất khi sử dụng vĩ độ / kinh độ ở mực nước biển. Ở độ cao 6.378 m, sai số tăng 0,1%.
Scott B

@codingoutload: Liên kết đó dường như không còn nữa :(
Tom Stambaugh

1
@Tom Stambaugh: Có web.archive.org cho điều đó: web.archive.org/web/20070810120810/http://nationalatlas.gov/…
Stefan Steiger

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

Nếu bạn muốn độ chính xác 50ft (15m), hãy chọn 4 chữ số. Vì thếdecimal(9,6)


9
Nếu bạn đang sử dụng SQL Server ... Cần lưu ý rằng độ chính xác 1-9 sử dụng 5 byte. Vì vậy, bạn có thể đã sử dụng số thập phân (9,6) thay vì số thập phân (7,4) và tận dụng độ chính xác cao hơn vì cả hai đều chiếm cùng một lượng không gian.
Theo

Đối với vĩ độ, hãy sử dụng (8,6)(hoặc (6,4)để lưu lưu một byte (trong MySQL).
Rick James

15

Tôi thiết kế cơ sở dữ liệu và đã nghiên cứu câu hỏi này trong một thời gian. Chúng tôi sử dụng một ứng dụng có sẵn với phần mềm phụ trợ Oracle nơi các trường dữ liệu được xác định để cho phép 17 chữ số thập phân. Nực cười! Đó là phần nghìn của inch. Không có công cụ GPS nào trên thế giới là chính xác. Vì vậy, chúng ta hãy bỏ 17 chữ số thập phân sang một bên và đối phó với thực tế. Chính phủ đảm bảo hệ thống của họ là tốt với độ chính xác giả "trong trường hợp xấu nhất" là 7,8 mét ở mức độ tin cậy 95% "nhưng sau đó tiếp tục nói rằng FAA thực tế (sử dụng các thiết bị chất lượng cao của họ) đã cho thấy kết quả đo GPS thường tốt. trong vòng một mét.

Vì vậy, bạn phải tự hỏi mình hai câu hỏi: 1) Nguồn gốc của các giá trị của bạn là gì? 2) Dữ liệu sẽ được sử dụng để làm gì?

Điện thoại di động không đặc biệt chính xác và các số đọc của Google / MapQuest có lẽ chỉ tốt với 4 hoặc 5 số thập phân. Một thiết bị GPS chất lượng cao có thể giúp bạn đạt được 6 (ở Hoa Kỳ). Nhưng nắm bắt nhiều hơn thế là lãng phí không gian nhập và lưu trữ. Hơn nữa, nếu bất kỳ tìm kiếm nào được thực hiện trên các giá trị, thật tuyệt khi người dùng biết rằng 6 sẽ là giá trị nhiều nhất mà họ nên tìm kiếm (rõ ràng là bất kỳ giá trị tìm kiếm nào được nhập trước tiên phải được làm tròn đến cùng độ chính xác với giá trị dữ liệu đang được tìm kiếm ).

Hơn nữa, nếu tất cả những gì bạn sẽ làm là xem một vị trí trong Google Maps hoặc đặt nó vào GPS để đến đó, thì bốn hoặc năm là quá nhiều.

Tôi phải cười với những người xung quanh đây khi nhập tất cả các chữ số đó. Và chính xác thì họ đang thực hiện phép đo đó ở đâu? Núm cửa trước? Hộp thư ra phía trước? Trung tâm của tòa nhà? Đỉnh của tháp di động? VÀ ... mọi người có nhất quán lấy nó ở cùng một nơi không?

Là một thiết kế cơ sở dữ liệu tốt, tôi sẽ chấp nhận các giá trị từ người dùng có thể là một vài hơn năm chữ số thập phân, sau đó làm tròn và chỉ lấy năm cho nhất quán [có thể là sáu nếu công cụ của bạn tốt và mục đích sử dụng cuối cùng của bạn đảm bảo điều đó].


4
Mặc dù tôi đồng ý rằng 17 chữ số là quá nhiều, tôi khuyên rằng 6 là quá ít nếu dữ liệu sẽ được xử lý sau. Khi thực hiện những việc như truy vấn bán kính ("Trả lời các tính năng trong bán kính 0,5 dặm tính từ điểm này"), các lỗi - bao gồm cả việc cắt ngắn - được phóng đại. Nếu bạn cần 6 chữ số thập phân trên đầu ra của một truy vấn như vậy, thì đầu vào phải bắt đầu bằng nhiều hơn đáng kể. Cửa hàng của chúng tôi có xu hướng sử dụng DECIMAL (18,15). Mục tiêu của chúng tôi là đảm bảo rằng db không phải là yếu tố giới hạn độ chính xác của các phép tính không gian.
Tom Stambaugh

Vượt ra ngoài 6 chữ số thập phân là vượt quá độ chính xác có sẵn của các vệ tinh GPS ngày nay. Quá trình xử lý bài viết sẽ không tạo ra một số lượng lỗi đáng kể. DECIMAL(18,15)chiếm 9 byte.
Rick James

11

Khoảng cách giữa mỗi độ vĩ độ khác nhau do hình dạng của trái đất và khoảng cách giữa mỗi độ kinh độ sẽ nhỏ hơn khi bạn càng đến gần các cực. Vì vậy, hãy nói về đường xích đạo, nơi khoảng cách giữa mỗi độ là 110,574km cho vĩ độ và 111,320km cho kinh độ.

50ft là 0,01524km, vì vậy:

  • 0,01524 / 110,574 = 1/7255 của một độ vĩ độ
  • 0,01524 / 111,320 = 1/7304 độ kinh

Bạn cần bốn chữ số của thang đo, đủ để đi xuống phần mười nghìn của một độ, với tổng độ chính xác là bảy chữ số.

DECIMAL(7,4) sẽ được nhiều cho nhu cầu của bạn.


5

Có tính đến các phần khác nhau của hình cầu và khoảng cách đường chéo, đây là bảng các khu vực có sẵn:

   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

Không lưu trữ các giá trị dấu chấm động. Mặc dù bạn có thể cho rằng chúng chính xác nhưng thực tế không phải vậy. Chúng là một ước tính gần đúng. Và hóa ra các ngôn ngữ khác nhau có các phương pháp khác nhau để "phân tích cú pháp" thông tin dấu phẩy động. Và các cơ sở dữ liệu khác nhau có các phương pháp khác nhau để thực hiện các giá trị xấp xỉ.

Thay vào đó, hãy sử dụng Geohash . Video này giới thiệu và giải thích trực quan về Geohash trong vòng chưa đầy 5 phút. Geohash là BY FAR là cách vượt trội để mã hóa / giải mã thông tin kinh độ / vĩ độ một cách nhất quán. Bằng cách không bao giờ "tuần tự hóa" các giá trị dấu phẩy động gần đúng của kinh độ / vĩ độ vào các cột cơ sở dữ liệu và thay vào đó, sử dụng Geohash, bạn sẽ có được sự nhất quán khứ hồi như mong muốn mà bạn nhận được với các giá trị Chuỗi. Trang web này rất hữu ích để giúp bạn chơi với Geohash.


FLOATDOUBLE, trong bối cảnh này , không mắc phải một số vấn đề như bạn mô tả.
Rick James

@RickJames Bạn đã không chỉ định đầy đủ "ngữ cảnh này". Nếu ý của bạn là hoàn toàn lưu trữ một giá trị trong hai cột DB thì có lẽ. Tuy nhiên, các giá trị đã cho không chỉ nằm trong các cột DB không được sử dụng, giả định ngầm định rằng sẽ có các truy vấn (gần nhau) được viết dựa trên các giá trị này. Và việc nắm giữ giả định khá thực dụng này có nghĩa là tất cả các vấn đề về nó là một ước tính không đáng tin cậy tiếp tục được giữ vững.
hỗn loạn3 trạng thái cân bằng

1
Nếu một FLOATgiá trị và giá trị 'tiếp theo' gần nhau về giá trị đến mức bạn không thể phân biệt thành phố (hoặc xe cộ hoặc người hoặc bọ chét) với thành phố khác, thì lỗi làm tròn và đại diện không quan trọng. Trong khi đó, hầu như luôn luôn điên rồ khi so sánh hai FLOATs(hoặc DOUBLEshoặc gần đúng DECIMALs) với '='.
Rick James

Bạn dường như thiếu điểm. Mọi truy vấn đã cố gắng sẽ được sử dụng ngầm định bằng dấu bằng, nếu không rõ ràng. Và điều này giả định rằng bạn không đi qua các lớp và ngôn ngữ khác với các giá trị, hoàn toàn ở bên trong SQL Server. Dưới đây là một phản ứng chính thức của Microsoft này cho SQL Server: blogs.msdn.microsoft.com/qingsongyao/2009/11/14/...
chaotic3quilibrium

Tôi xin lỗi, tôi nghĩ rằng câu hỏi đã được gắn thẻ [mysql], không phải SQL Server.
Rick James

2

Nếu bạn nhấp vào các vị trí trên Google Maps, bạn sẽ nhận được vĩ độ và kinh độ với 7 vị trí thập phân

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.