ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

我会问相反的问题:性能差异甚至重要还是可以忽略?
在数据库中,您应该使用“sql 空间数据类型”来存储经度和纬度
请注意,.NET BCL 本身在其 GeoCoordinate class 中使用双精度,这强烈表明精度可能足够。
NodaTime 的 TzdbZoneLocation 也使用双精度。
1)我会考虑定点。 2) 由于您经常需要对地理坐标进行三角运算,并且这些运算仅针对 double 实现,因此 double 可能是最合适的。

W
Wernfried Domscheit

选择 double,有几个原因。

三角函数仅适用于双精度

双精度(范围为 100 纳米)远远超出纬度/经度值所需的任何值

GeoCoordinate 类和第三方模块(例如 DotSpatial)也使用 double 作为坐标


M
MarkPflug

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


加一个用于详细而准确的解释。
正是我想看到的解释,谢谢!
J
Jonny

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

//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 的东西,只需将点转换为十六进制并存储它。经过很长时间使用空间后,我知道这是最安全的。


我在查找 LatLonPoint 时遇到问题,您必须在 c# 项目中包含哪些引用或包或哪些“使用”? (假设创建表用于身份模型/c# 代码,因为该类型也不会在 SSMS 中评估)。先感谢您!
a
alex.peter

双倍的

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

[get: Microsoft.SqlServer.Server.SqlMethod(IsDeterministic=true, IsPrecise=true)] public System.Data.SqlTypes.SqlDouble Lat { get; } 属性值 SqlDouble 指定纬度的 SqlDouble 值。


A
Abuzar G

如果您使用的是 .net ef core,我会向您推荐 NetTopologySuite 库。阅读以下链接中的完整文档:https://docs.microsoft.com/en-us/ef/core/modeling/spatial


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅