Reference Https://en.wikipedia.org/wiki/Hilbert_curve
Hilbert_map = {' A ': {(0, 0): (0, ' d '), (0, 1): (1, ' a '), (1, 0): (3, ' B '), (1, 1): (2, ' A ')}, ' B ': {(0, 0): (2, ' B ') ), (0, 1): (1, ' B '), (1, 0): (3, ' a '), (1, 1): (0, ' C ')}, ' C ': {(0, 0): (2, ' C '), (0, 1): (3, ' d '), (, 1): (0, ' C '), ( 1, 1): (0, ' B ')}, ' d ': {(0, 0): (0, ' a '), (0, 1): (3, ' C '), (1, 0): (1, ' d '), (, 1): (1, ' d ')},}un_hilbert_map = { ' A ': {0: (0, 0, ' d '), 1: (0, 1, ' a '), 3: (1, 0, ' B '), 2: (1, 1, ' A ')}, ' B ': {2: (0, 0, ' B '), 1: (0, 1, ' B '), 3: (1, 0, ' a ') , 0: (1, 1, ' C ')}, ' C ': {2: (0, 0, ' C '), 3: (0, 1, ' d '), 1: (1, 0, ' C '), 0: (1, 1, ' B ')}, ' d ': {0: (0, 0, ' a '), 3: (0, 1, ' C '), 1: (1, 0, ' d '), 2: (1, 1, ' d ')}} #编码def Point_to_hilbert (Lng,lat, order=16): Print (' Hilbert ') Lng_range = [- 180.0, 180.0] Lat_range = [ -90.0, 90.0] current_square = ' a ' position = 0 for I in range (order-1,-1,-1): Position <<= 2 Lng_mid = (lng_range[0]+lng_range[1])/2 Lat_mid = (lat_range[0]+lat_range[1])/2 If LNG >= lng_mid:quad_x = 1 Lng_range[0] = Lng_mid else:quad_x = 0 Lng_range[1] = Lng_mid if lat >= lat_mid:quad_y = 1 Lat_range[0] = Lat_mid Else:quad _y = 0 Lat_range[1] = lat_mid Quad_position,current_square = hilbert_map[current_square][(quad_x, quad_y )] Position |= quad_position return position# decode def hilbert_to_point (d, order=16): Print (' Hilbert ') lng_ Range = [ -180.0, 180.0] Lat_range = [ -90.0, 90.0] current_square = ' A ' lng=lat=lng_mid=lat_mid=0 for I in rang E (Order-1,-1,-1): Lng_mid = (lng_range[0] + lng_range[1])/2 Lat_mid = (Lat_range[0] + lat_range[1) )/2 mask = 3 << (2*i) quad_position = (D & Mask) >> (2*i) quad_x, quad_y, current_s Quare= Un_hilbert_map[current_square][quad_position] if quad_x:lng_range[0] = Lng_mid Else: LNG_RANGE[1] = lnG_mid if quad_y:lat_range[0] = lat_mid else:lat_range[1] = lat_mid lat = Lat_rang E[0] LNG = lng_range[0] return lng,latif __name__ = = ' __main__ ': D = Point_to_hilbert ( -50.555443,77.776655,36) Print (d) Lng,lat = Hilbert_to_point (d,36) print (Lng,lat)
Python version of Google S2 spatial indexing algorithm