C# 中纬度/经度值的双精度或小数

问题描述 投票:0回答:5

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

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

c# latitude-longitude geopoints
5个回答
177
投票

double
,有几个原因。

  • 三角函数仅适用于 double
  • 双倍精度(范围为 100 纳米)远远超出您对纬度/经度值的要求
  • GeoCooperative 类和第三方模块(例如DotSpatial)也使用 double 来表示坐标

113
投票

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


7
投票

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

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


5
投票

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

[get: Microsoft.SqlServer.Server.SqlMethod(IsDeterministic=true, IsPrecise=true)]
public System.Data.SqlTypes.SqlDouble Lat { get; }

房产价值

SqlDouble

指定纬度的 SqlDouble 值。


0
投票

这里有一个警告供大家考虑: 如果您有一个双精度值,例如值 52.173975945803527 如果您以某种方式将其转换为字符串(如查询字符串等),C# 将生成以下字符串:“52.17397594580353” 因此,它将四舍五入到小数点后 14 位!

© www.soinside.com 2019 - 2024. All rights reserved.