内容简介: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完成地理距离计算》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Little Schemer - 4th Edition
Daniel P. Friedman、Matthias Felleisen / The MIT Press / 1995-12-21 / USD 40.00
This delightful book leads you through the basic elements of programming in Scheme (a Lisp dialect) via a series of dialogues with well-chosen questions and exercises. Besides teaching Scheme, The Lit......一起来看看 《The Little Schemer - 4th Edition》 这本书的介绍吧!