纬度/经度值的双精度或十进制(C)#

Double or decimal for latitude/longitude values in C#

在C中存储地理位置数据时使用的最佳数据类型是什么?我会用十进制来表示它的精确性,但是对十进制浮点数的操作比二进制浮点数(double)慢。

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


要加倍,有几个原因。

  • 三角函数只能用于double
  • 双精度(100纳米范围)远远超出了您对lat/lon值的任何要求。
  • 地理坐标类和第三方模块(如dotspace)也使用double作为坐标。

一个双精度数最多有15位小数。因此,假设这些数字中的三个在lat/long值的小数点左边(最大180度)。这会在右侧留下12位精度。由于纬度/长度约为111km,因此12位数字中的5位将使我们能够精确测量米。再加3位数我们就可以精确到毫米了。剩下的4位数字将使我们的精度达到100纳米左右。因为从性能和内存的角度来看,Double会获胜,所以我认为甚至没有理由考虑使用十进制。


我很早以前就遇到过这个问题,当时我开始学习空间编程。不久前我读了一本书,这本书让我想到了这一点。

1
2
3
4
//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(dblat、dbllon、srid)

1
var lat_lon_point = Microsoft.SqlServer.Types.SqlGeography.Point(lat, lon, 4326);

这是使用空间数据在应用程序中工作时的最佳方法。然后要保存数据,请在SQL中使用它

1
2
3
4
CREATE TABLE myGeoTable
{
LatLonPoint GEOMETRY
}

否则,如果您使用的不是SQL的其他东西,只需将该点转换为十六进制并存储它。我知道用了很长一段时间空间,这是最安全的。