在C#中存储地理位置数据时,最好使用哪种数据类型? 我会使用decimal来获取其精确性,但是与二进制浮点数(double)相比,操作decimal浮点数速度较慢。
我读到大多数情况下,纬度或经度不需要超过6或7位数字的精度。那么double的不准确性是否重要,还是可以忽略不计?
在C#中存储地理位置数据时,最好使用哪种数据类型? 我会使用decimal来获取其精确性,但是与二进制浮点数(double)相比,操作decimal浮点数速度较慢。
我读到大多数情况下,纬度或经度不需要超过6或7位数字的精度。那么double的不准确性是否重要,还是可以忽略不计?
选择 double
,有几个原因。
double
可以使用三角函数double
的精度(100纳米范围内)远远超出你在Lat/Lon值中所需的任何东西double
来表示坐标一个 double 类型可以保留最多15个十进制数字的精度。因此,我们假设在纬度和经度值的小数点左侧有三个数字(最大为180度)。这样就剩下12位数字精度在小数点右侧。由于一度的纬度/经度约为111公里,其中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的东西,请将点转换为十六进制并存储。我知道长时间使用空间后,这是最安全的方法。
双倍
综合答案,这是微软在SqlGeography库中表示自己的方式。
[get: Microsoft.SqlServer.Server.SqlMethod(IsDeterministic=true, IsPrecise=true)]
public System.Data.SqlTypes.SqlDouble Lat { get; }
属性值
SqlDouble
一个 SqlDouble 值,用于指定纬度。