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

时间:2015-01-21 13:12:05

标签: c# latitude-longitude geopoints

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

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

4 个答案:

答案 0 :(得分:88)

加倍,有几个原因。

  • 三角函数仅适用于双
  • 双倍精度(100纳米范围)远远超出您对Lat / Lon值所需的任何内容
  • GeoCoordinate Class和第三方模块(例如DotSpatial)也使用双倍坐标

答案 1 :(得分:45)

double具有最多15个十进制数字的精度。因此,假设这些数字中的三个将位于小数点左侧的lat / long值(最大值为180deg)。这在右侧留下了12位精度。由于纬度/长度为~111km,这12个数字中的5个将为我们提供精度。 3个数字将使我们精确到毫米。剩下的4位数将使我们精确到100纳米左右。由于double会从性能和内存的角度获胜,我认为没有理由考虑使用decimal。

答案 2 :(得分: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的东西,只需将该点转换为十六进制并存储它。经过很长一段时间的使用,我知道这是最安全的。

答案 3 :(得分:0)

Double

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

[获取:Microsoft.SqlServer.Server.SqlMethod(IsDeterministic = true,IsPrecise = true)] 公开System.Data.SqlTypes.SqlDouble Lat {get; } 适当的价值 SqlDouble 一个指定纬度的SqlDouble值。