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的其他东西,只需将该点转换为十六进制并存储它。我知道用了很长一段时间空间,这是最安全的。