Đôi hoặc thập phân cho các giá trị vĩ độ / kinh độ trong C #


97

Loại dữ liệu tốt nhất để sử dụng khi lưu trữ dữ liệu vị trí địa lý trong C # là gì? Tôi sẽ sử dụng số thập phân cho độ chính xác của nó, nhưng các hoạt động trên số dấu phẩy động thập phân chậm hơn so với số dấu phẩy động nhị phân (kép).

Tôi đọc rằng hầu hết thời gian bạn sẽ không cần thêm 6 hoặc 7 chữ số chính xác cho vĩ độ hoặc kinh độ. Khi đó, tính không chính xác của nhân đôi có quan trọng không hay nó có thể bị bỏ qua?


6
Tôi sẽ đặt câu hỏi ngược lại: Liệu sự khác biệt về hiệu suất có quan trọng không hay nó có thể bị bỏ qua?
Heinzi

1
Trong cơ sở dữ liệu, bạn nên sử dụng "sql kiểu dữ liệu không gian" để lưu trữ kinh độ và vĩ độ
azhar_SE_nextbridge

8
Lưu ý rằng bản thân .NET BCL sử dụng gấp đôi trong lớp GeoComplete của nó , đây là một dấu hiệu mạnh mẽ cho thấy độ chính xác có thể đủ.
Heinzi

1
TzdbZoneLocation của NodaTime cũng sử dụng gấp đôi.
Rick Davin

4
1) Tôi muốn coi là điểm cố định. 2) Vì bạn thường cần thực hiện các phép toán lượng giác trên tọa độ địa lý và những phép toán đó chỉ được thực hiện cho double, doublecó thể là phù hợp nhất.
CodesInChaos

Câu trả lời:


120

Đi cho double, có một số lý do.

  • Hàm lượng giác chỉ có sẵn cho kép
  • Độ chính xác gấp đôi (phạm vi 100 nanomet) vượt xa bất cứ điều gì bạn sẽ yêu cầu cho các giá trị Vĩ độ / Kinh độ
  • Lớp địa lý và mô-đun của bên thứ ba (ví dụ: DotSpatial ) cũng sử dụng double cho tọa độ

75

Một kép có độ chính xác lên đến 15 chữ số thập phân. Vì vậy, giả sử ba trong số những chữ số đó sẽ ở bên trái dấu thập phân cho các giá trị vĩ độ / kinh độ (tối đa là 180deg). Điều này để lại 12 chữ số chính xác ở bên phải. Vì độ vĩ / độ dài là ~ 111km, 5 trong số 12 chữ số đó sẽ cho chúng ta độ chính xác đến từng mét. Thêm 3 chữ số nữa sẽ cho chúng ta độ chính xác đến từng milimet. 4 chữ số còn lại sẽ giúp chúng ta có độ chính xác khoảng 100 nanomet. Vì nhân đôi sẽ giành chiến thắng từ góc độ hiệu suất và bộ nhớ, tôi thấy không có lý do gì để xem xét việc sử dụng số thập phân.


2
Cộng một để có lời giải thích chi tiết và chính xác.
Najeeb

4

Tôi đã đối mặt với câu hỏi này khá lâu trước đây khi tôi bắt đầu với lập trình không gian. Tôi đã đọc một cuốn sách cách đây không lâu đã dẫn tôi đến điều này.

//sql server has a really cool dll that deals with spacial data such like
//geography points and so on. 
//add this namespace
Using Microsoft.SqlServer.Types;

//SqlGeography.Point(dblLat, dblLon, srid)

var lat_lon_point = Microsoft.SqlServer.Types.SqlGeography.Point(lat, lon, 4326);

Đây là cách tốt nhất khi làm việc trong ứng dụng của bạn với dữ liệu không gian. sau đó để lưu dữ liệu, hãy sử dụng nó trong sql

CREATE TABLE myGeoTable
{
LatLonPoint GEOMETRY 
}

khác, nếu bạn đang sử dụng thứ gì đó khác không phải là sql, chỉ cần chuyển đổi điểm thành hệ thập lục phân và lưu trữ nó. Tôi biết sau một thời gian dài sử dụng spacial rằng đây là cách an toàn nhất.


Tôi đang gặp sự cố khi tìm LatLonPoint, bạn phải bao gồm những tham chiếu hoặc gói nào hoặc 'cách sử dụng' nào trong dự án c # của bạn? (giả sử bảng tạo dành cho mã Identity model / c #, vì loại đó cũng không đánh giá trong SSMS). cảm ơn bạn trước!
Chris

1

Gấp đôi

Kết hợp các câu trả lời đó là cách Microsoft tự thể hiện nó trong thư viện SqlGeography

[get: Microsoft.SqlServer.Server.SqlMethod (IsDeterministic = true, IsPrecise = true)] public System.Data.SqlTypes.SqlDouble Lat {get; } Giá trị thuộc tính SqlDouble Một giá trị SqlDouble chỉ định vĩ độ.

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.