【问题标题】:Double or decimal for latitude/longitude values in C#C# 中纬度/经度值的双精度或小数
【发布时间】:2015-03-20 00:37:15
【问题描述】:

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

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

【问题讨论】:

  • 我会问相反的问题:性能差异是否重要还是可以忽略?
  • 在数据库中你应该使用“sql空间数据类型”来存储经度和纬度
  • 请注意,.NET BCL 本身在其GeoCoordinate class 中使用双精度,这强烈表明精度可能足够。
  • NodaTime 的 TzdbZoneLocation 也使用 double。
  • 1) 我会考虑定点。 2) 由于您经常需要对地理坐标进行三角运算,而这些仅针对double 实现,因此double 可能是最合适的。

标签: c# latitude-longitude geopoints


【解决方案1】:

double,有几个原因。

  • 三角函数仅适用于双精度函数
  • 双精度(范围为 100 纳米)远远超出纬度/经度值的任何要求
  • GeoCoordinate Class 和第三方模块(例如 DotSpatial)也使用 double 作为坐标

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 加一个以获得详细准确的解释。
    • 正是我想看的解释,谢谢!
    【解决方案3】:

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

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

    【讨论】:

    • 我在查找 LatLonPoint 时遇到问题,您必须在 c# 项目中包含哪些引用或包或哪些“使用”? (假设创建表用于身份模型/c# 代码,因为该类型也不会在 SSMS 中评估)。提前谢谢你!
    【解决方案4】:

    结合答案,这就是微软在 SqlGeography 库中的表现方式

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

    【讨论】:

      猜你喜欢
      • 2017-10-01
      • 2015-08-31
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多