在C#中存储地理位置数据时使用的最佳数据类型是什么?我会使用十进制来表示它的准确性,但对十进制浮点数的操作比二进制浮点数(双精度)慢。
我读到大多数时候你不需要超过6或7位精度的纬度或经度。那么双重的不精确性是否重要,或者可以被忽略?
答案 0 :(得分:88)
加倍,有几个原因。
答案 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值。