在 C# 中存储地理定位数据时使用的最佳数据类型是什么?我会使用十进制的准确性,但对十进制浮点数的运算比二进制浮点数(双精度)要慢。
我读到大多数时候,纬度或经度的精度不需要超过 6 或 7 位。那么双打的不精确性是否重要还是可以忽略不计?
double
实现,因此 double
可能是最合适的。
选择 double
,有几个原因。
三角函数仅适用于双精度
双精度(范围为 100 纳米)远远超出纬度/经度值所需的任何值
GeoCoordinate 类和第三方模块(例如 DotSpatial)也使用 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