介绍Geohash基础概念的文章很多,我就不拷贝粘贴了,我只用最简单的理解概括:
Geohash用作坐标的索引,可大幅提升搜索坐标相关数据的效率。结合相邻9宫格的geohash,可以快速检索指定坐标附近一定范围内的地理信息目标(POI,道路等等)。
python环境下的geohash库推荐:
https://github.com/transitland/mapzen-geohash
该库基础功能完整,包括坐标编码为geohash,geohash解码为坐标,获取指定geohash周边9宫格的geohash。
安装:pip install mzgeohash
geohash编码的简单示例如下:
输入文件每行包含一个坐标,例如117.445044487,40.0585138025
处理代码:
# !/usr/bin/env python # encoding:UTF-8 import time import sys import mzgeohash def test(inputFile): outputfile = file(inputFile+".geohash", 'a') lineno = 0 ISOTIMEFORMAT='%Y-%m-%d %X' for line in open(inputFile): lineno += 1 if lineno % 100 == 0: print "process line :",lineno," ",time.strftime(ISOTIMEFORMAT,time.localtime()) sys.stdout.flush() xy = line.strip() x = float(xy.split(",")[0]) y = float(xy.split(",")[1]) geohash = mzgeohash.encode((x,y),length=8) outputfile.write(xy +"\t"+str(geohash )+"\n") if __name__=="__main__": inputFile = sys.argv[1] test(inputFile)
产出文件每行示例:117.445044487,40.0585138025 wx5ebs
附上官方的简明使用示例:
>>> import mzgeohash >>> mzgeohash.decode('xn76urwe1g9y') (139.76608408614993, 35.681382017210126) >>> mzgeohash.encode((139.76608408614993, 35.681382017210126)) 'xn76urwe1g9y' >>> mzgeohash.neighbors('xn76urwe1g9y') {'c': 'xn76urwe1g9y', 'e': 'xn76urwe1gdn', 'n': 'xn76urwe1g9z', 'ne': 'xn76urwe1gdp', 'nw': 'xn76urwe1g9x', 's': 'xn76urwe1g9v', 'se': 'xn76urwe1gdj', 'sw': 'xn76urwe1g9t', 'w': 'xn76urwe1g9w'}