地理散列函数
时空库提供地理位置散列函数,用于在位置数据分析中进行邻近性搜索(对纬度和经度进行编码,并将邻近点分组)。
地理位置散列编码
- 将包含地理位置的 Point 对象编码为 Base32 编码的字母或数字串:
>>> p = stc.point(37, -74) >>> stc.geohash.string_hash_encode(p) 'dqe6kpdue5btnubpm9npcd0000' >>> stc.geohash.string_hash_encode(p, precision=5) 'dqe6k'
- 将包含地理位置的 Point 对象编码为 BitVector:
>>> p = stc.point(37, -74) >>> bv = stc.geohash.number_hash_encode(p) >>> bv BitVector(01100101100110100110100101010101100110100110100101010101100110100110100101010101100110100110100101010101101100000000000000000000) >>> bv.truncate(10) >>> bv BitVector(0110010110)
- 将一对纬度和经度坐标直接编码为地理位置散列:
>>> stc.geohash.encode(37, -74, precision=5, mode='base32') 'dqe6k' >>> stc.geohash.encode(37, -74, precision=10, mode='bit') '0110010110'
地理位置散列解码
- 将地理 Base32 编码数字或字符串解码为包含十进制经度或纬度坐标的 Point 对象:
>>> stc.geohash.string_hash_decode('dqeh4') Point(37.265625, -74.443359375)
- 将 Base32 编码字符解码为 Point 对象:
>>> p = stc.point(37, -74) >>> bv = geohash.number_hash_encode(p) >>> geohash.number_hash_decode(bv) Point(37.0, -74.0)
- 将 Base32 编码字符串或二进制字符串解码为一对纬度和经度坐标:
>>> stc.geohash.decode('dqe6k', mode='base32') (36.9580078125, -74.00390625) >>> stc.geohash.decode('0110010110', mode='bit') (33.75, -78.75)
地理位置散列邻元素
地理位置散列邻元素函数返回指定代码周围的邻近地理位置散列码。
点的地理位置散列邻元素
-
获取给定纬度、经度和位深度的地理位置散列邻元素:
>>> stc.geohash.get_all_neighbors(70, -40, 25) [BitVector(0111110000001111100101010), BitVector(0111110000001111100101011), BitVector(0111110000001111100101110), BitVector(0111110000001111110000000), BitVector(0111110000001111110000001), BitVector(0111110000001111110000100), BitVector(0111110000001111110000010), BitVector(0111110000001111110000011), BitVector(0111110000001111110000110)]
-
获取给定纬度、经度和位深度的地理位置散列邻元素,并且仅返回给定距离内的结果:
>>>geohash.get_all_neighbors(70, -40, 25, distance_precision=1000) [BitVector(0111110000001111110000001), BitVector(0111110000001111110000100), BitVector(0111110000001111110000011), BitVector(0111110000001111110000110)]
地理位置散列邻近函数
expand
: 返回中心代码及其邻居。 位置的全部 9 个地理位置散列都会返回:>>> stc.geohash.expand('ezs42') ['ezefp', 'ezs40', 'ezs41', 'ezefr', 'ezs42', 'ezs43', 'ezefx', 'ezs48', 'ezs49']
neighbors
: 返回 8 地理散列,不包括给定的地理散列本身:>>> stc.geohash.neighbors('ezs42') ['ezefp', 'ezs40', 'ezs41', 'ezefr', 'ezs43', 'ezefx', 'ezs48', 'ezs49']
get_east
,get_west
,get_north
,get_south
: 返回给定地理位置散列的东部,西部,北部或南部地理位置散列:>>> stc.geohash.get_east('ezs42') 'ezs43'
- 将地理位置散列编码为
BitVector
:>>> bv = geohash.number_hash_encode(p) >>> bv.truncate(25) >>> stc.geohash.expand(bv) [BitVector(0110010110011010011000101), BitVector(0110010110011010011010000), BitVector(0110010110011010011010001), BitVector(0110010110011010011000111), BitVector(0110010110011010011010010), BitVector(0110010110011010011010011), BitVector(0110010110011010011001101), BitVector(0110010110011010011011000), BitVector(0110010110011010011011001)] >>> stc.geohash.neighbors(bv) [BitVector(0110010110011010011000101), BitVector(0110010110011010011010000), BitVector(0110010110011010011010001), BitVector(0110010110011010011000111), BitVector(0110010110011010011010011), BitVector(0110010110011010011001101), BitVector(0110010110011010011011000), BitVector(0110010110011010011011001)] >>> stc.geohash.get_north(bv) BitVector(0110010110011010011011000)
地理位置散列覆盖范围
要计算完整覆盖边界框的一组地理位置散列,请完成下列步骤:
-
准备样本多边形:
test_wkt = 'POLYGON((-73.76223024988917 41.04173285255264,-73.7749331917837 41.04121496082817,-73.78197130823878 41.02748934524744,-73.76476225519923 41.023733725449326,-73.75218805933741 41.031633228865495,-73.7558787789419 41.03752486433286,-73.76223024988917 41.04173285255264))' poly = wkt_reader.read(test_wkt)
-
计算给定几何图形在固定位深度的地理位置散列覆盖:
cover = stc.geohash.geohash_cover_at_bit_depth(poly, 36)
图 1。 给定几何图形的固定位深度的地理散列覆盖 -
计算给定几何图形在固定位深度的缓冲地理位置散列覆盖:
buffered_cover = stc.geohash.geohash_cover_at_bit_depth(poly, 36, distance=50)
图 2。 给定几何图形 -
通过先计算固定深度覆盖,然后压缩覆盖来计算压缩的地理位置散列覆盖:
raw_cover = stc.geohash.geohash_cover_at_bit_depth(poly, 36) compact_cover = stc.geohash.geohash_compression(raw_cover)
图 3。 给定几何图形的固定位深度的紧凑地理散列覆盖