簡體   English   中英

C# 中緯度/經度值的雙精度或小數

[英]Double or decimal for latitude/longitude values in C#

在 C# 中存儲地理定位數據時使用的最佳數據類型是什么? 我會使用十進制的准確性,但對十進制浮點數的運算比二進制浮點數(雙精度)要慢。

我讀到大多數時候,緯度或經度的精度不需要超過 6 或 7 位。 那么雙打的不精確性是否重要還是可以忽略不計?

選擇double ,有幾個原因。

  • 三角函數僅適用於雙
  • double 的精度(范圍為 100 納米)遠遠超出您對 Lat/Lon 值的任何要求
  • GeoCoordinate Class和第三方模塊(例如DotSpatial )也使用 double 作為坐標

double 具有最多 15 位十進制數字的精度。 因此,讓我們假設其中三個數字將位於緯度/經度值(最大 180 度)的小數點左側。 這在右邊留下了 12 位精度。 由於緯度/經度的度數約為 111 公里,因此這 12 位數字中的 5 位將為我們提供米的精度。 多 3 位數字將使我們精確到毫米。 剩下的 4 位數字將使我們的精度達到 100 納米左右。 由於從性能和內存的角度來看 double 會獲勝,我認為沒有理由甚至考慮使用小數。

很久以前,當我開始使用空間編程時,我就遇到過這個問題。 不久前我讀了一本書,這使我想到了這一點。

//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);

這是在您的應用程序中使用空間數據時的最佳方式。 然后保存數據在sql中使用它

CREATE TABLE myGeoTable
{
LatLonPoint GEOMETRY 
}

否則,如果您使用的不是 sql 的其他東西,只需將點轉換為十六進制並存儲它。 長時間使用空間后,我知道這是最安全的。

雙倍的

結合答案,這就是微軟在 SqlGeography 庫中的表示方式

[get: Microsoft.SqlServer.Server.SqlMethod(IsDeterministic=true, IsPrecise=true)] public System.Data.SqlTypes.SqlDouble Lat { get; } 屬性值SqlDouble指定緯度的 SqlDouble 值。

如果您使用的是 .net ef core,我會向您推薦 NetTopologySuite 庫。 閱讀以下鏈接的完整文檔: https ://docs.microsoft.com/en-us/ef/core/modeling/spatial

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM