114

在 C# 中存储地理定位数据时使用的最佳数据类型是什么?我会使用十进制的准确性,但对十进制浮点数的运算比二进制浮点数(双精度)要慢。

我读到大多数时候,纬度或经度的精度不需要超过 6 或 7 位。那么双打的不精确性是否重要还是可以忽略不计?

4

4 回答 4

144

去吧double,有几个原因。

  • 三角函数仅适用于双精度
  • 双精度(范围为 100 纳米)远远超出纬度/经度值所需的任何值
  • GeoCoordinate 类和第三方模块(例如DotSpatial)也使用 double 作为坐标
于 2015-01-22T16:13:14.587 回答
90

双精度数最多有 15 位小数。因此,假设其中三个数字将位于纬度/经度值的小数点左侧(最大为 180 度)。这会在右侧留下 12 位精度。由于纬度/经度约为 111 公里,这 12 位数字中的 5 位将使我们精确到米。多 3 位数字将使我们精确到毫米。剩下的 4 位数字将使我们的精度达到 100 纳米左右。由于从性能和内存的角度来看 double 会胜出,我认为没有理由考虑使用小数。

于 2015-01-21T14:49:17.640 回答
5

很久以前,当我开始进行空间编程时,我就遇到了这个问题。不久前我读了一本书,这使我想到了这一点。

//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 的东西,只需将点转换为十六进制并存储它。经过很长时间使用空间后,我知道这是最安全的。

于 2015-01-21T13:36:08.760 回答
3

双倍的

结合答案,这就是微软在 SqlGeography 库中表示它自己的方式

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

于 2019-10-28T12:47:06.507 回答