joh*_*ohn 11 database pylons database-design sqlalchemy geolocation
我正在使用Sqlalchemy来定义我的表等等,这里是我提出的一些代码:
locations = Table('locations', Base.metadata,
Column("lat", Float(Precision=64), primary_key=True),
Column("lng", Float(Precision=64), primary_key=True),
)
Run Code Online (Sandbox Code Playgroud)
我在某处读到纬度和经度要求比浮点更精确,通常是双倍精度.所以我手动将精度设置为64,这是否足够?矫枉过正?这对我的情况有帮助吗?
这里没有其他人提供具体的数字,证明了浮点数lat/long的最坏情况精度.我需要知道我正在做的事情,所以这是我的分析,以防它帮助其他人.
单精度浮点在有效数字中提供24位精度(数字的二进制指数表示法).随着数字的整个部分变大,小数点后的位数下降.因此,纬度或经度的最坏情况精度是当幅度尽可能远离0时.假设你将纬度限制在[-90,90]和经度(-180,180),最坏情况将是经度为180的赤道.
在二进制中,180需要24位可用的8位,在小数点后留下16位.因此,在该经度下连续可表示的值之间的距离将是2 ^ -16度(约1.526E-5).将该数字(以弧度表示)乘以赤道(6,378,137米)的地球WGS-84半径,得出最坏情况下的精度:
2^-16 deg * 6,378,137 m * PI rad / 180 deg = 1.6986 m (5.5728 ft).
Run Code Online (Sandbox Code Playgroud)
针对存储在弧度中的纬度/经度的相同分析得出以下结果:
2^-22 rad * 6,378,137 m = 1.5207 m (4.9891 ft)
Run Code Online (Sandbox Code Playgroud)
最后,如果将纬度标准化为范围[-1,1]并将经度标准化为范围(-1,1),则可以实现以下最坏情况精度:
2^-24 * PI rad * 6,378,137 m = 1.1943 m (3.9184 ft)
Run Code Online (Sandbox Code Playgroud)
因此,以弧度为单位存储纬度/长度可以为您带来大约7英寸的额外精度,并且以标准化形式存储它们可以在最坏的情况下为您提供大约1英尺8英寸的额外精度.
如果在双精度和单精度之间进行转换时,您舍入(而不是截断),则单精度值将在上面计算的两个连续值之间距离的一半之内.