在 C# 中存储地理数据时,最好使用什么数据类型?为了精确性,我会使用十进制,但十进制浮点数的运算比二进制浮点数(双精度)慢。
我读到,大多数时候您不需要超过 6 或 7 位精度的纬度或经度。那么双打的不精确性还重要吗?还是可以忽略不计?
去
double
,有几个原因。
双精度数的精度最多为 15 位小数。因此,我们假设其中三位数字位于纬度/经度值的小数点左侧(最大 180 度)。这在右侧留下了 12 位精度。由于纬度/经度的度数约为 111 公里,因此这 12 位数字中的 5 位将为我们提供米的精度。再多 3 位数字就可以精确到毫米。剩下的 4 位数字将使我们的精度达到 100 纳米左右。由于从性能和内存的角度来看,double 会获胜,所以我认为没有理由考虑使用decimal。
很久以前,当我开始空间编程时,我就遇到了这个问题。 不久前我读了一本书,让我想到了这一点。
//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 的其他内容,只需将点转换为十六进制并存储即可。使用空间很长时间后我知道这是最安全的。
双
结合答案,这就是 Microsoft 在 SqlGeography 库中表示自己的方式
[get: Microsoft.SqlServer.Server.SqlMethod(IsDeterministic=true, IsPrecise=true)]
public System.Data.SqlTypes.SqlDouble Lat { get; }
房产价值
SqlDouble
指定纬度的 SqlDouble 值。
这里有一个警告供大家考虑: 如果您有一个双精度值,例如值 52.173975945803527 如果您以某种方式将其转换为字符串(如查询字符串等),C# 将生成以下字符串:“52.17397594580353” 因此,它将四舍五入到小数点后 14 位!