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


96

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

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


6
我会问相反的问题:性能差异是否重要还是可以忽略不计?
Heinzi 2015年

1
在数据库中,您应该使用“ sql空间数据类型”来存储经度和纬度
azhar_SE_nextbridge 2015年

8
请注意,.NET BCL本身在其GeoCoordinate类中使用了double ,这强烈表明精度可能已足够。
Heinzi 2015年

1
NodaTime的TzdbZoneLocation也使用double。
里克·戴文

4
1)我会考虑定点。2)由于您经常需要对地理坐标进行三角运算,而这些运算仅针对实现doubledouble可能是最合适的。
CodesInChaos

Answers:



74

双精度数最多可以有15个十进制数字。因此,假设纬度/经度值(最大180度)的这些数字中的三个将位于小数点的左侧。这在右边留下了12位精度。由于纬度/经度约为111公里,因此这12位数字中的5位将使我们对仪表保持精确。再增加3个数字将使我们可以精确到毫米。剩下的4位数字将使我们的精度达到100纳米左右。由于从性能和内存的角度来看,双精度会取胜,所以我什至没有理由考虑使用十进制。


2
再加上一个详细而精确的解释。
Najeeb

4

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

//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的其他内容,只需将点转换为十六进制并存储即可。经过长时间使用spacial,我知道这是最安全的。


我在查找LatLonPoint时遇到麻烦,您必须包含哪些引用或程序包,或者在c#项目中有哪些“用法”?(假设创建表用于身份模型/ c#代码,因为该类型在SSMS中也不评估)。先感谢您!
克里斯,

0

结合答案,这就是Microsoft在SqlGeography库中如何表示自己

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.