使用geohash完成地理距离计算

栏目: Python · 发布时间: 7年前

内容简介: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完成地理距离计算》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Learning PHP 5

Learning PHP 5

David Sklar / O'Reilly / July, 2004 / $29.95

Learning PHP 5 is the ideal tutorial for graphic designers, bloggers, and other web crafters who want a thorough but non-intimidating way to understand the code that makes web sites dynamic. The book ......一起来看看 《Learning PHP 5》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具