内容简介:geohash的原理是使用二分法,把当前的经度和纬度和最大最小的经度纬度进行无限二分,在一边则为0,否则为1,这样就可以定位 到地球上的每一个点了。然后把经度放在偶数位,纬度放在奇数位,组成一个01010101串。如果想变得更容易传输,可以用某种 方式进行hash,例如下面是一个简单的实现。
geohash的原理是使用二分法,把当前的经度和纬度和最大最小的经度纬度进行无限二分,在一边则为0,否则为1,这样就可以定位
到地球上的每一个点了。然后把经度放在偶数位,纬度放在奇数位,组成一个01010101串。如果想变得更容易传输,可以用某种
方式进行hash,例如 base32
, base64
等。
下面是一个简单的实现。 to_geohash
实现经度和纬度转换成010101串, similarity
比较两个01010串的前面有多少个相同的字符。
不过, to_geohash
有更高效的位运算实现,但是可读性不好,不容易懂,就不放出来了。
def to_geohash(longitude, latitude, length=30): '''longitude 经度(在地图上竖着的线),latitude纬度(在地图上横着的线)''' minLat, maxLat = -90.0, 90.0 minLng, maxLng = -180.0, 180.0 result = 0 for i in range(length): if i % 2 == 0: # 偶数,设置longitude mid = (minLng + maxLng) / 2 if longitude < mid: result <<= 1 # push 0 maxLng = mid else: result = result << 1 | 1 # push 1 minLng = mid else: mid = (minLat + maxLat) / 2 if latitude < mid: result <<= 1 maxLat = mid else: result = result << 1 | 1 minLat = mid return str(bin(result))[2:] def similarity(a, b): """比较a和b两个字符串前length位有多少位相同""" result = 0 length = max(len(a), len(b)) a = a.ljust(length, '0') b = b.ljust(length, '0') for i in range(length): if a[i] == b[i]: result += 1 else: break return result
以上所述就是小编给大家介绍的《使用geohash完成地理距离计算》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Windows内核原理与实现
潘爱民 / 电子工业出版社 / 2010年4月 / 99.00元
本书从操作系统原理的角度,详细解析了Windows如何实现现代操作系统的各个关键部件,包括进程、线程、物理内存和虚拟内存的管理,Windows中的同步和并发性支持,以及Windows的I/O模型。在介绍这些关键部件时,本书直接以Windows的源代码(WRK, Windows Research Kernel)为参照,因而读者可以了解像Windows这样的复杂操作系统是如何在x86处理器上运行的。 ......一起来看看 《Windows内核原理与实现》 这本书的介绍吧!