Skip to content

Commit

Permalink
重构
Browse files Browse the repository at this point in the history
  • Loading branch information
virjar committed May 27, 2022
1 parent 6bc38a9 commit ea2a5dd
Show file tree
Hide file tree
Showing 65 changed files with 2,782 additions and 3,379 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
*.iml
.idea/
target/
src/main/resources/json/
42 changes: 39 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,41 @@
# lnglat2Geo
# ChinaGeoLib
修改自: https://github.com/deng0515001/lnglat2Geo, 非常感谢原作者的贡献,我完全照搬了原作者的算法实现,但是我不能理解这些算法的原理。

修改点如下:

1. 使用java完全重写Scala代码,原因如下
1. 作为lib,java和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/data.bin"), geoData);
//线上,取消JSONLoader
```


## 原作者readme

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

Expand All @@ -12,8 +49,7 @@

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

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

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

Expand Down
109 changes: 21 additions & 88 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,6 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<properties>
<scala.version>2.11.12</scala.version>
<scala.tools.version>2.11</scala.tools.version>
<scala.version.major>2.11</scala.version.major>
<org.json4s.version>3.2.11</org.json4s.version>
<org.json4s.native.version>3.2.11</org.json4s.native.version>
<slf4j.log4j12.version>1.6.2</slf4j.log4j12.version>
</properties>
<groupId>com.github.deng0515001</groupId>
Expand All @@ -25,45 +20,35 @@
<artifactId>s2-geometry-library-java</artifactId>
<version>1.0.0</version>
</dependency>

<!-- 移植scala代码,tuple暂时用它来替代 -->
<dependency>
<groupId>com.speedment.common</groupId>
<artifactId>tuple</artifactId>
<version>3.2.10</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-compiler</artifactId>
<version>${scala.version}</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-reflect</artifactId>
<version>${scala.version}</version>
</dependency>


<dependency>
<groupId>org.json4s</groupId>
<artifactId>json4s-jackson_${scala.version.major}</artifactId>
<version>${org.json4s.version}</version>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
<dependency>
<groupId>org.scalatest</groupId>
<artifactId>scalatest_${scala.version.major}</artifactId>
<version>2.2.0</version>
<scope>test</scope>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>

Expand Down Expand Up @@ -101,36 +86,13 @@

<build>
<plugins>
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<version>2.15.2</version>
<executions>
<execution>
<id>scala-compile-first</id>
<phase>process-resources</phase>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>

<configuration>
<scalaVersion>${scala.version}</scalaVersion>
<args>
<arg>-target:jvm-1.7</arg>
</args>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>

Expand Down Expand Up @@ -181,7 +143,7 @@
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.1.1</version>
<!--<configuration>-->
<!--<aggregate>true</aggregate>-->
<!--<aggregate>true</aggregate>-->
<!--</configuration>-->
<executions>
<execution>
Expand All @@ -195,35 +157,6 @@

</plugins>

<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>


<!-- Environment Settings -->
<repositories>
<!-- local -->
<repository>
<id>my-local-repo</id>
<url>file://${project.basedir}/lib</url>
</repository>

<repository>
<snapshots>
<enabled>true</enabled>
</snapshots>
<id>boundless</id>
<name>Boundless Maven Repository</name>
<url>http://repo.boundlessgeo.com/main</url>
</repository>

<!-- for scalding -->
<repository>
<id>conjars.org</id>
<url>http://conjars.org/repo</url>
</repository>
</repositories>
</build>
</project>
149 changes: 149 additions & 0 deletions src/main/java/com/dengxq/lnglat2Geo/GeoTrans.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
package com.dengxq.lnglat2Geo;

import com.dengxq.lnglat2Geo.entity.*;
import com.dengxq.lnglat2Geo.entity.enums.CoordinateSystem;
import com.dengxq.lnglat2Geo.entity.enums.DistrictLevel;
import com.dengxq.lnglat2Geo.utils.GeoUtils;
import com.speedment.common.tuple.Tuple2;

import java.util.List;
import java.util.Map;

public class GeoTrans {


/**
* 判断经纬度的行政区划
*
* @param lon 经度
* @param lat 纬度
* @param needStreet 是否需要街道信息
* @param coordSys 输入经纬度的坐标系
* @return 行政区划
*/
public static Admin determineAdmin(Double lon, Double lat, CoordinateSystem coordSys, Boolean needStreet) {
if (needStreet == null) {
needStreet = true;
}
return GeoTransImpl.determineAdmin(lon, lat, needStreet, coordSys);
}

/**
* 给出附近的所有商圈信息
*
* @param lon 经度
* @param lat 纬度
* @param radius 需要商圈的半径
* @param coordSys 输入经纬度的坐标系 CoordinateSystem
* @param needStreet 是否需要返回行政区划的街道信息
* @return
*/
public static BusinessAreaInfo aroundBusinessAreas(Double lon, Double lat, Integer radius, CoordinateSystem coordSys, Boolean needStreet) {
if (radius == null) {
radius = 4000;
}
if (needStreet == null) {
needStreet = true;
}
Tuple2<Double, Double> gcj02LonLat = GeoUtils.toGCJ02(lon, lat, coordSys);
Admin admin = determineAdmin(gcj02LonLat.get0(), gcj02LonLat.get1(), CoordinateSystem.GCJ02, needStreet);
//return GeoTransImpl.determineAreaByAdmin(gcj02LonLat._1, gcj02LonLat._2, admin, radius);
return new BusinessAreaInfo(admin, GeoTransImpl.determineAreaByCityId(lon, lat, admin.cityCode, radius, CoordinateSystem.GCJ02));
}

/**
* 给出附近的所有商圈信息
*
* @param lon 经度
* @param lat 纬度
* @param radius 需要商圈的半径
* @param coordSys 输入经纬度的坐标系 CoordinateSystem
* @param cityID 输入城市adcode
* @return
*/
public static List<BusinessArea> aroundBusinessAreasByCityID(
Double lon, Double lat, Integer radius, CoordinateSystem coordSys, Integer cityID) {
if (radius == null) {
radius = 4000;
}
return GeoTransImpl.determineAreaByCityId(lon, lat, cityID, radius, coordSys);
}

/**
* 获取城市级别
*
* @param adcodeOrName 城市adcode或者城市名
* @return 城市级别
*/
public static String getCityLevel(String adcodeOrName) {
return GeoTransImpl.getCityLevel(adcodeOrName);
}

/**
* 根据地区code返回规范数据
*
* @param adcode 地区code
* @return
*/
public static AdminNode normalizeName(int adcode) {
return GeoTransImpl.normalizeName(adcode);
}

/**
* 根据地区name返回规范化的地区信息
*
* @return 规范化的地区信息
*/
public static java.util.List<AdminNode> normalizeName(String name, DistrictLevel level, Boolean isFullMatch) {
return GeoTransImpl.normalizeName(name, level, isFullMatch);
}

/**
* 根据所有信息返回规范化的地区信息
*
* @param province 省名 可为空
* @param city 城市名 可为空
* @param district 区县名 可为空
* @param street 街道名 可为空
* @param isFullMatch 所有输入区域是简称还是全名
* @return 规范化的地区信息,可能有多个或不存在
*/
public static java.util.List<Admin> normalizeName(String province, String city, String district,
String street, Boolean isFullMatch) {
province = trimToEmpty(province);
city = trimToEmpty(city);
district = trimToEmpty(district);
street = trimToEmpty(street);
if (isFullMatch == null) {
isFullMatch = false;
}
return GeoTransImpl.normalizeName(province, city, district, street, isFullMatch);
}

private static String trimToEmpty(String input) {
if (input == null) {
return "";
}
return input;
}

/**
* 获取所有行政区划数据
*
* @return 所有行政区划数据,不包含街道
*/
public static Map<Integer, AdminNode> adminData() {
return GeoTransImpl.adminData;
}

public static Map<String, String> countryCode() {
return GeoTransImpl.countryCode;
}

// public static districtBoundary():Map[Int,List[List[Long]]]=
//
// {
// AdminDataProvider.AdminLoader.loadBoundarySrc.map(s = > (s.code, s.boundary))
// .toMap
// }
}
Loading

0 comments on commit ea2a5dd

Please sign in to comment.