C # 中纬度/经度值的双精度或十进制

在 C # 中存储地理位置数据时使用的最佳数据类型是什么?为了精确起见,我会使用十进制,但是对十进制浮点数的操作要比二进制浮点数(双精度)慢。

我读到大多数情况下你不需要超过6或7位数的精度来表示经纬度。那么,双精度的不精确性到底是重要还是可以忽略不计呢?

56447 次浏览

当我开始研究空间编程的时候,我已经面临这个问题很久了。 不久前我读了一本书,让我想到了这个。

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

一个双精度数的精度最高可达15位小数。因此,让我们假设这些数字中的三个位于 lat/long 值的小数点左边(max 为180 deg)。这样就在右边留下了12位的精度。因为 lat/long 的度数是111公里,这12个数字中的5个会给我们测量仪表的精度。再多三个数字就能精确到毫米了。剩下的4位数字将使我们的精度达到100纳米左右。因为从性能和内存的角度来看 double 会胜出,所以我认为没有理由甚至考虑使用十进制。

选择 double,有几个原因。

  • 三角函数只供双人使用
  • Precision of double (range of 100 nanometers) is far beyond anything you'll ever require for Lat/Lon values
  • Geo坐标类 和第三方模块(例如 网络空间)也使用 double 作为坐标

双倍

结合这些答案,就可以看出微软在 SqlGeography 库中是如何表示自己的

[ get: Microsoft. SqlServer.Server.SqlMethod (Is確 istic = true,IsPrecision = true)] Public System. Data. SqlTypes. SqlDouble Lat { get; } 物业价值 SqlDouble A SqlDouble value that specifies the latitude.

If you are using .net ef core, I would recommend you the NetTopologySuite library. 阅读完整的文档在下面的链接: https://learn.microsoft.com/en-us/ef/core/modeling/spatial