繁体   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