经纬度转省市区县乡镇离线包,采用空间查询算法,速度快(单线程5w次/s),省市区县100%准确率。
Go to file
2022-06-07 19:36:19 +08:00
src/main 代码移植错误修复 2022-06-07 19:36:19 +08:00
.gitignore 重构 2022-05-27 20:53:20 +08:00
pom.xml 重构 2022-05-27 20:53:20 +08:00
README.md 换一个名字避免冲突 2022-05-27 21:21:22 +08:00

ChinaGeoLib

修改自: https://github.com/deng0515001/lnglat2Geo 非常感谢原作者的贡献,我完全照搬了原作者的算法实现,但是我不能理解这些算法的原理。

修改点如下:

  1. 使用java完全重写Scala代码原因如下
    1. 作为libjava和scala依赖是单项的Scala程序员可以看懂java但是java程序员不一定能看懂Scala
    2. 作为lib库需要考虑库的精简他引入了Scala的runtime将会带来额外的jar包依赖
    3. GeoTrans的标准API并不是可以无缝提供给java端使用部分API java无法调用因为有很多scala的特性
    4. scala语法糖很舒服但是进行代码cr能发现很多带有性能风险的用法以及Scala函数式上代码结构不清晰简写大括号、同函数if-else分支深度过多等
  2. 重新设计数据的序列化和反序列化
    1. 提供json和bin两种格式数据接入并提供两种格式的转换桥梁。开发状态可以使用json生产使用bin
    2. 删除java的Serializable进行数据序列化的方法工程实践上他从来不是稳定可靠的方式
      1. 当遇到字节码降级的时候他会反序列化失败如android 语法脱糖过程)
      2. 可能由于jvm实现具体细节导致不稳定
      3. 效率和性能并不是最优
      4. lib库混淆时他会反序列化失败
    3. 使用Leb128编码这在原作者的二进制数据格式上带来了5个百分点的优化原作者40.46%,现方案35.67%
    4. 二进制反序列化提速数据初始化只需要6.5秒原作者45秒
      1. 分别耗时在数据加载到内存,反序列化, 我们手写序列化和反序列化精确控制数据格式和组织方式原始数据加载大约500毫秒即可完成文件大小61M
      2. 数据结构计算我把计算结果缓存到本地文件系统。数据计算时间25s降低到5s,缓存文件大小178M

离线数据编辑和修改

   // 把数据dump到json中根据自己的需要编辑这些文件
    new JSONLoader().dump(new File("src/main/resources/json/"), geoData);
    
    //编辑文件完成后在程序运行前使用jsonloader替换binloader用于加载json格式的离线数据
    ILoader.Storage.setLoader(new JSONLoader());
    
    // 代码测试没问题使用BinLoader再把数据dump为二进制格式
    new BinLoader().dump(new File("src/main/resources/geolib.data.bin"), geoData);
    
    //线上取消JSONLoader

原作者readme

经纬度转省市区县乡镇,速度快 -- 单线程50000次/秒;精度高 -- 准确率99.9999%

还包含如下功能:

1查询某个经纬度附近所有商圈按距离排序

2给定城市输出城市级别

3输入任何地区的全称/简称/code输出该地区的全部信息

4获取所有行政区划关系数据等

使用方法: import com.dengxq.lnglat2Geo.GeoTrans 里面的所有方法均为公有接口

接口文档,参考博客: https://blog.csdn.net/deng0515001/article/details/99606156

jar包依赖https://mvnrepository.com/artifact/com.github.deng0515001/lnglat2Geo

有问题直接联系QQ451408963@qq.com