C#中纬度/经度值的双精度或十进制数

KRT*_*Tac 80 c# latitude-longitude geopoints

在C#中存储地理位置数据时使用的最佳数据类型是什么?我会使用十进制来确切,但对十进制浮点数的操作比二进制浮点数(双)慢.

我读到大多数时候你不需要经纬度或精度超过6或7位数的精度.那么双重的不精确性是否重要,或者可以被忽略?

Wer*_*eit 100

去双,有几个原因.

  • 三角函数仅适用于double
  • 双倍精度(100纳米的范围)远远超出了Lat/Lon值所需的任何精度
  • GeoCoordinate类和第三方模块(例如DotSpatial)也使用double作为坐标


Mar*_*lug 59

double具有最多15个十进制数字的精度.因此,假设这些数字中的三个将位于小数点左侧的lat/long值(最大值为180deg).这在右侧留下了12位精度.由于纬度/长度为~111km,这12个数字中的5个将为我们提供精度.3个数字将使我们精确到毫米.剩下的4位数将使我们精确到100纳米左右.由于double会从性能和内存的角度获胜,我认为没有理由考虑使用decimal.

  • 加上一个详细而准确的解释。 (4认同)

小智 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;
Run Code Online (Sandbox Code Playgroud)

//SqlGeography.Point(dblLat, dblLon, srid)

var lat_lon_point = Microsoft.SqlServer.Types.SqlGeography.Point(lat, lon, 4326);
Run Code Online (Sandbox Code Playgroud)

这是在应用程序中处理空间数据时的最佳方法。然后保存数据在sql中使用它

CREATE TABLE myGeoTable
{
LatLonPoint GEOMETRY 
}
Run Code Online (Sandbox Code Playgroud)

否则,如果您使用的不是 sql 的其他内容,只需将点转换为十六进制并存储它。使用空间很长时间后我知道这是最安全的。


小智 5

双倍的

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

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

适当的价值

sql双精度

指定纬度的 SqlDouble 值。