参考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): (1, 'c'), (1, 1): (0, 'b')},

'd': {(0, 0): (0, 'a'), (0, 1): (3, 'c'), (1, 0): (1, 'd'), (1, 1): (2, '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

#解码

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 range(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_square= 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_range[0]

lng = lng_range[0]

return lng,lat

if __name__ == '__main__':

d = point_to_hilbert(-50.555443,77.776655,36)

print (d)

lng,lat = hilbert_to_point(d,36)

print (lng,lat)

google s2 mysql_Python版本的谷歌S2空间索引算法相关推荐

  1. google firefor 历史版本下载谷歌火狐浏览器版本下载大全

    https://blog.csdn.net/liuxueyi521/article/details/107292629

  2. Google自动翻译工具:对接谷歌翻译接口,实现本地化运行

    Google自动翻译工具通过对接谷歌翻译api接口,实现Google翻译本地化运行,通过Google自动翻译工具我们可以对我们的txt/word/excl等多格式文本进行批量的翻译,并且会保留翻译格式 ...

  3. 写一函数,实现两个字符串的比较。即自己写一个strcmp函数,函数原型为int strcmp(char * p1 ,char * p2); 设p1指向字符串s1, p2指向字符串s2。要求当s1=s2

    写一函数,实现两个字符串的比较.即自己写一个strcmp函数,函数原型为int strcmp(char * p1 ,char * p2); 设p1指向字符串s1, p2指向字符串s2.要求当s1=s2 ...

  4. 解决Chrome 70版本以后谷歌不再信任赛门铁克证书问题

    解决Chrome 70版本以后谷歌不再信任赛门铁克证书问题 参考文章: (1)解决Chrome 70版本以后谷歌不再信任赛门铁克证书问题 (2)https://www.cnblogs.com/terr ...

  5. Google play上架规则_谷歌应用商店上架审核

    Google play上架需要遵循谷歌的很多审核政策,以及审核规则,对于大部分上架商,随时关注谷歌的政策变化是必须课,Google的审核政策不同于国内渠道和IOS渠道,可以称之为后审核政策.也就是软件 ...

  6. Google的中文名竟然取名“谷歌”

      Google"谷歌"引发的王怀南血案 ------ 从为Google取中文名的事情可以看出王怀南的不合格 Google的中文名竟然取名"谷歌",让各位网友晕 ...

  7. c语言判断字符串s1是否大于s2,判断字符串s1是否大于字符串s2,应该使用()。A.if(strcmp(s1,s2)<0)B.if(s1>s2)C.if(strcmp(s2,s1)_开卷宝...

    编写一个函数fun(),它的功能是:实现两个字符串的连接(不使用库函数strcat,即把p2所指的字符串连 编写一个函数fun(),它的功能是:实现两个字符串的连接(不使用库函数strcat,即把p2 ...

  8. 百度与谷歌排名规则算法的大致区别

    以下只是鹰赛网络本人通过自己的几年seo经历总结出的一些关于百度排名与谷歌排名规则算法大致区别的信息,仅供各位参考. 百度的排名规则: 1.百度喜欢收录title里为单个关键字的网页,并且排名很靠前. ...

  9. R-Tree空间索引算法的研究历程和最新进展分析

    摘要:本文介绍了空间索引的概念.R-Tree数据结构和R-Tree空间索引的算法描述,并从R-Tree索引技术的优缺点对R-Tree的改进结构--变种R-Tree进行了论述.最后,对R-Tree的最新 ...

最新文章

  1. Tomcat启动报错 Could not reserve enough space for object heap
  2. 亏损63亿,美图真能“美”到上市?
  3. Python脚本监控线上AMQ Number of Pending Messages数量
  4. Vim中数字自增、自减
  5. Codeforces Round #630 (Div. 2) F. Independent Set 树形dp
  6. gsoap初始化释放_通过gsoap使用webservice
  7. php transfer-encoding: chunked,php – 使用chunked transfer encoding和gzip
  8. 动手学深度学习(PyTorch实现)(十)--NiN模型
  9. 安卓平台基于SIP协议实现注册,聊天功能
  10. 微信x漫威首款小程序公开!揭露未来“看展”趋势
  11. 网站技术架构发展之我见--[引子]
  12. Dxg——Bat批处理 开发笔记整理分类合集【所有的相关记录,都整理在此】
  13. Javaweb尚硅谷网上书城项目
  14. 测试用例入门(二) - 使用等价类划分法编写测试用例
  15. 浅谈逻辑漏洞:越权漏洞、密码找回漏洞、支付逻辑漏洞、指定账户恶意攻击、登录体系安全、业务一致性安全、业务数据篡改、验证码突破、数据重放安全
  16. 数据中心“容灾”和“备份”的区别
  17. 37_Flutter之Sliver组件扩展
  18. RxSwift 介绍与简单使用
  19. android按返回键和Home键都进入后台
  20. 怎样取消开机硬盘自检?

热门文章

  1. 图解数据分析(3) | 数据分析的数学基础(数据科学家入门·完结)
  2. E. Easy Assembly
  3. ANSYS Mechanical APDL 结构有限元视频教程
  4. 土木工程模板计算机专业,土木工程专业职业生涯规划模板(5页)-原创力文档...
  5. Eclipse如何设置自动提示?
  6. Virtual script not found, may missing <script lang=“ts“> / “allowJs“: true / jsconfig.json. 报错解决
  7. composer修改成国内镜像
  8. 爬取豆瓣电影各个类型的电影名称
  9. 实战|手把手教你如何使用抓包神器MitmProxy
  10. Java 在数据库中生成一年的假日与工作日信息