IBM Cloud Docs
地理散列函数

地理散列函数

时空库提供地理位置散列函数,用于在位置数据分析中进行邻近性搜索(对纬度和经度进行编码,并将邻近点分组)。

地理位置散列编码

  • 将包含地理位置的 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_eastget_westget_northget_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)
    

地理位置散列覆盖范围

要计算完整覆盖边界框的一组地理位置散列,请完成下列步骤:

  1. 准备样本多边形:

    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)
    
  2. 计算给定几何图形在固定位深度的地理位置散列覆盖:

    cover = stc.geohash.geohash_cover_at_bit_depth(poly, 36)
    

    显示给定几何图形的固定位深度的地理散列覆盖。
    图 1。 给定几何图形的固定位深度的地理散列覆盖

  3. 计算给定几何图形在固定位深度的缓冲地理位置散列覆盖:

    buffered_cover = stc.geohash.geohash_cover_at_bit_depth(poly, 36, distance=50)
    

    显示给定几何图形的固定位深度的缓冲地理散列覆盖。
    图 2。 给定几何图形
    的固定位深度的缓冲地理散列覆盖

  4. 通过先计算固定深度覆盖,然后压缩覆盖来计算压缩的地理位置散列覆盖:

    raw_cover = stc.geohash.geohash_cover_at_bit_depth(poly, 36)
    compact_cover = stc.geohash.geohash_compression(raw_cover)
    

    显示给定几何图形在固定位深处的压缩地理散列覆盖。
    图 3。 给定几何图形的固定位深度的紧凑地理散列覆盖