From ec9c8e7ab7a7f6f9179011a25a616700aff1b9b8 Mon Sep 17 00:00:00 2001 From: linG <3137168214@qq.com> Date: Fri, 3 Dec 2021 00:28:40 +0800 Subject: [PATCH] =?UTF-8?q?:tada:=20=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/maven-publish.yml | 43 ++++ .gitignore | 35 +++ LICENSE | 201 ++++++++++++++++ README.md | 166 +++++++++++++ images/logo.png | Bin 0 -> 2761698 bytes jetgeo-core/pom.xml | 47 ++++ .../main/java/com/ling5821/jetgeo/JetGeo.java | 163 +++++++++++++ .../jetgeo/cache/RegionCacheLoader.java | 32 +++ .../jetgeo/config/JetGeoProperties.java | 55 +++++ .../com/ling5821/jetgeo/enums/LevelEnum.java | 32 +++ .../com/ling5821/jetgeo/model/GeoInfo.java | 47 ++++ .../com/ling5821/jetgeo/model/JsonPoint.java | 26 ++ .../ling5821/jetgeo/model/RegionCache.java | 40 ++++ .../com/ling5821/jetgeo/model/RegionInfo.java | 22 ++ .../com/ling5821/jetgeo/model/Tuple2.java | 35 +++ .../com/ling5821/jetgeo/model/WGS84Point.java | 29 +++ .../com/ling5821/jetgeo/utils/S2Util.java | 226 ++++++++++++++++++ .../java/com/ling5821/jetgeo/utils/Utils.java | 109 +++++++++ .../com/ling5821/jetgeo/JetGeoExample.java | 37 +++ .../java/com/ling5821/jetgeo/JetGeoTests.java | 133 +++++++++++ jetgeo-spring-boot-starter/pom.xml | 59 +++++ .../starter/JetGeoAutoConfiguration.java | 32 +++ .../jetgeo/starter/JetGeoProperties.java | 54 +++++ .../main/resources/META-INF/spring.factories | 2 + .../JetGeoStarterApplicationTests.java | 44 ++++ .../jetgeo/starter/cmq/CmqTcpHandler.java | 102 ++++++++ .../jetgeo/starter/model/GpsInfo.java | 14 ++ .../src/test/resources/application.yml | 3 + pom.xml | 192 +++++++++++++++ 29 files changed, 1980 insertions(+) create mode 100644 .github/workflows/maven-publish.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 images/logo.png create mode 100644 jetgeo-core/pom.xml create mode 100644 jetgeo-core/src/main/java/com/ling5821/jetgeo/JetGeo.java create mode 100644 jetgeo-core/src/main/java/com/ling5821/jetgeo/cache/RegionCacheLoader.java create mode 100644 jetgeo-core/src/main/java/com/ling5821/jetgeo/config/JetGeoProperties.java create mode 100644 jetgeo-core/src/main/java/com/ling5821/jetgeo/enums/LevelEnum.java create mode 100644 jetgeo-core/src/main/java/com/ling5821/jetgeo/model/GeoInfo.java create mode 100644 jetgeo-core/src/main/java/com/ling5821/jetgeo/model/JsonPoint.java create mode 100644 jetgeo-core/src/main/java/com/ling5821/jetgeo/model/RegionCache.java create mode 100644 jetgeo-core/src/main/java/com/ling5821/jetgeo/model/RegionInfo.java create mode 100644 jetgeo-core/src/main/java/com/ling5821/jetgeo/model/Tuple2.java create mode 100644 jetgeo-core/src/main/java/com/ling5821/jetgeo/model/WGS84Point.java create mode 100644 jetgeo-core/src/main/java/com/ling5821/jetgeo/utils/S2Util.java create mode 100644 jetgeo-core/src/main/java/com/ling5821/jetgeo/utils/Utils.java create mode 100644 jetgeo-core/src/test/java/com/ling5821/jetgeo/JetGeoExample.java create mode 100644 jetgeo-core/src/test/java/com/ling5821/jetgeo/JetGeoTests.java create mode 100644 jetgeo-spring-boot-starter/pom.xml create mode 100644 jetgeo-spring-boot-starter/src/main/java/com/ling5821/jetgeo/starter/JetGeoAutoConfiguration.java create mode 100644 jetgeo-spring-boot-starter/src/main/java/com/ling5821/jetgeo/starter/JetGeoProperties.java create mode 100644 jetgeo-spring-boot-starter/src/main/resources/META-INF/spring.factories create mode 100644 jetgeo-spring-boot-starter/src/test/java/com/ling5821/jetgeo/starter/JetGeoStarterApplicationTests.java create mode 100644 jetgeo-spring-boot-starter/src/test/java/com/ling5821/jetgeo/starter/cmq/CmqTcpHandler.java create mode 100644 jetgeo-spring-boot-starter/src/test/java/com/ling5821/jetgeo/starter/model/GpsInfo.java create mode 100644 jetgeo-spring-boot-starter/src/test/resources/application.yml create mode 100644 pom.xml diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml new file mode 100644 index 0000000..b605b33 --- /dev/null +++ b/.github/workflows/maven-publish.yml @@ -0,0 +1,43 @@ +# This workflow will build a Java project with Maven +# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven + +name: jetgeo + +on: + push: + tags: + - "*" + branches: + - "*" + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + # 缓存放在 actions/setup-java@v2 之后会导致缓存内容覆盖已经生成好的settings.xml + - name: Cache Maven packages + uses: actions/cache@v2 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v2 + with: + # v2版本必须制定分发类型 + distribution: adopt + java-version: 8 + overwrite-settings: true + server-id: ossrh + server-username: MAVEN_USERNAME + server-password: MAVEN_PASSWORD + gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }} + gpg-passphrase: MAVEN_GPG_PASSPHRASE + - run: mvn -B deploy + env: + MAVEN_USERNAME: ${{ secrets.MAVEN_CENTER_USER_NAME }} + MAVEN_PASSWORD: ${{ secrets.MAVEN_CENTER_PASSWORD }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..13fe6f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +### Java template +# Compiled class file +*.class +target + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +## IDEA +.idea +*.iml + +## Data +city +province +district +source_data + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..3721f48 --- /dev/null +++ b/README.md @@ -0,0 +1,166 @@ +<img align="center" src="./images/logo.png" width="1134" alt="jetgeo Logo" /> + +<p align="center"> + <a href="https://github.com/linG5821/jetgeo/blob/main/.github/workflows/maven-publish.yml"><img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/linG5821/jetgeo/jetgeo"></a> + <a href="https://github.com/linG5821/jetgeo/releases"><img alt="GitHub release (latest SemVer)" src="https://img.shields.io/github/v/release/linG5821/jetgeo?sort=semver"></a> + <img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/linG5821/jetgeo"> + <a href="https://github.com/linG5821/jetgeo/blob/main/LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/linG5821/jetgeo"></a> +</p> + +<p> + jetgeo 是一个用于离线逆地理编码的库,支持转换位置到县/地区级别, +通过它你可以消耗一定的内存以换取一个内存级别的转换。主要适用于精度要求不高的一些服务端场景。 +如果你需要一个精确定位的场景,那么它可能并不合适,此时你可能需要适用地理位置信息提供商的一些服务, +但他们往往有次数限制或者需要支付更多的费用。 +</p> + +## 目录 + +- [快速开始](#快速开始) +- [核心依赖](#核心依赖) +- [贡献者](#贡献者) +- [如何参与开源项目](#如何参与开源项目) +- [作者](#作者) +- [鸣谢](#鸣谢) + +### 快速开始 + +1. 导入依赖 + + ```xml + <dependency> + <groupId>com.ling5821</groupId> + <artifactId>jetgeo</artifactId> + <version>${jetgeo.version}</version> + </dependency> + ``` + +2. 下载项目目录地理位置资源包 [geodata.7z](https://github.com/linG5821/jetgeo/blob/main/data/geodata.7z) + +3. 解压数据到你的目录 例如 `/data/geodata` + +> 注意: 解压后目录结构 +> +> geodata +> +> ├── province +> +> ├── city +> +> ├── district + +5. 一个例子 + + ```java + public class JetGeoExample { + public static final JetGeo jetGeo; + static { + JetGeoProperties properties = new JetGeoProperties(); + //填写你的geodata的目录 + properties.setGeoDataParentPath("/data/geodata"); + //设置逆地理编码的级别 + //properties.setLevel(LevelEnum.province); + //properties.setLevel(LevelEnum.city); + properties.setLevel(LevelEnum.district); + jetGeo = new JetGeo(properties); + } + + public static void main(String[] args) { + //这里的经纬度坐标需要使用 wgs84 坐标系 + GeoInfo geoInfo = jetGeo.getGeoInfo(32.053197915979325,118.85999259252777); + System.out.println(geoInfo); + } + } + ``` + + ```shell + GeoInfo(formatAddress=江苏省南京市玄武区, province=江苏省, city=南京市, district=玄武区, street=, adcode=320102, level=null) + ``` + +### 核心依赖 + +- [google-s2](https://github.com/google/s2-geometry-library-java.git) +- [hutool](https://github.com/dromara/hutool.git) +- [lombok](https://github.com/projectlombok/lombok.git) +- [spring-boot](https://github.com/spring-projects/spring-boot.git) +- [junit5](https://github.com/junit-team/junit5.git) + +### 贡献者 + +请阅读**CONTRIBUTING.md** 查阅为该项目做出贡献的开发者。 + +### 如何参与开源项目 + +贡献使开源社区成为一个学习、激励和创造的绝佳场所。你所作的任何贡献都是**非常感谢**的。 + +1. Fork the Project +2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`) +3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`) +4. Push to the Branch (`git push origin feature/AmazingFeature`) +5. Open a Pull Request + +### 作者 + +<table> + <tbody> + <tr> + <td align="center" valign="top"> + <img width="125" height="125" src="https://github.com/linG5821.png?s=150"> + <br> + <strong>linG5821</strong> + <br> + <a href="https://github.com/linG5821">@linG5821</a> + </td> + </tr> + </tbody> +</table> + +*您也可以在贡献者名单中参看所有[参与该项目的开发者](https://github.com/linG5821/jetgeo/graphs/contributors).* + +### 版权说明 + +Apache License 2.0, see [LICENSE](https://github.com/linG5821/jetgeo/blob/master/LICENSE). + +### 鸣谢 + +<table> + <tbody> + <tr> + <td align="center" valign="top"> + <img width="125" height="125" src="https://github.com/Tangchaoyue.png?s=150"> + <br> + <strong>Tangchaoyue</strong> + <br> + <a href="https://github.com/Tangchaoyue">@Tangchaoyue</a> + <p>感谢 @Tangchaoyue(lfr) 的陪伴, 支持以及给项目起的名字,给我极大的信心与鼓励,并且在我编码的时候耐心的照顾我的生活</p> + </td> + <td align="center" valign="top"> + <img width="125" height="125" src="https://github.com/halfrost.png?s=150"> + <br> + <strong>halfrost</strong> + <br> + <a href="https://github.com/halfrost">@halfrost</a> + <p>感谢 @halfrost 大佬的文章</p> + <a href="https://github.com/halfrost/Halfrost-Field/blob/master/contents/Go/go_spatial_search.md">高效的多维空间点索引算法 — Geohash 和 Google S2</a> + <a href="https://github.com/halfrost/Halfrost-Field/blob/master/contents/Go/go_s2_regionCoverer.md">Google S2 是如何解决空间覆盖最优解问题的</a> + </td> + <td align="center" valign="top"> + <img width="125" height="125" src="https://profile.csdnimg.cn/4/E/A/3_qq_43777978?s=150"> + <br> + <strong>跳舞D猴子</strong> + <br> + <a href="https://blog.csdn.net/qq_43777978">@跳舞D猴子</a> + <p>感谢 @跳舞D猴子 的文章</p> + <a href="https://blog.csdn.net/qq_43777978/article/details/116800460?ivk_sa=1024320u">Google的S2算法原理以及使用Java版本</a> + </td> + <td align="center" valign="top"> + <img width="125" height="125" src="https://github.com/lssaidong.png?s=150"> + <br> + <strong>lss</strong> + <br> + <a href="https://github.com/lssaidong">@lssaidong</a> + <p>感谢 @lssaidong 贡献的项目 Logo</p> + </td> + </tr> + </tbody> +</table> \ No newline at end of file diff --git a/images/logo.png b/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2edf29744aa3299a643211037c568aad0556e785 GIT binary patch literal 2761698 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%0D7}G36)Ac#jhJ`ZD`wuEln!GIIpRGdV6$`sGxf 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 Lw?4OI*=7G9<O>1t literal 0 HcmV?d00001 diff --git a/jetgeo-core/pom.xml b/jetgeo-core/pom.xml new file mode 100644 index 0000000..858a4fa --- /dev/null +++ b/jetgeo-core/pom.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>jetgeo</artifactId> + <groupId>com.ling5821</groupId> + <version>1.0.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>jetgeo-core</artifactId> + + <name>jetgeo-core</name> + + <properties> + </properties> + + <dependencies> + <dependency> + <groupId>com.google.geometry</groupId> + <artifactId>s2-geometry</artifactId> + </dependency> + + <dependency> + <groupId>cn.hutool</groupId> + <artifactId>hutool-all</artifactId> + </dependency> + + <dependency> + <groupId>org.apache.lucene</groupId> + <artifactId>lucene-core</artifactId> + </dependency> + + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + </dependency> + + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + +</project> \ No newline at end of file diff --git a/jetgeo-core/src/main/java/com/ling5821/jetgeo/JetGeo.java b/jetgeo-core/src/main/java/com/ling5821/jetgeo/JetGeo.java new file mode 100644 index 0000000..db201bf --- /dev/null +++ b/jetgeo-core/src/main/java/com/ling5821/jetgeo/JetGeo.java @@ -0,0 +1,163 @@ +package com.ling5821.jetgeo; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.LoadingCache; +import com.ling5821.jetgeo.cache.RegionCacheLoader; +import com.ling5821.jetgeo.config.JetGeoProperties; +import com.ling5821.jetgeo.enums.LevelEnum; +import com.ling5821.jetgeo.model.GeoInfo; +import com.ling5821.jetgeo.model.RegionCache; +import com.ling5821.jetgeo.utils.S2Util; +import com.ling5821.jetgeo.utils.Utils; +import java.io.File; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutionException; + +/** + * @author lsj + * @date 2021/11/20 2:45 + */ +public class JetGeo { + + public static final ConcurrentHashMap<String, RegionCache> PROVINCE_REGION_CACHE = new ConcurrentHashMap<>(); + private File geoDataParentFile; + private LevelEnum level; + private CacheBuilder<Object, Object> loadCacheBuilder; + public LoadingCache<String, List<RegionCache>> CITY_REGION_CACHE; + public LoadingCache<String, List<RegionCache>> DISTRICT_REGION_CACHE; + + public JetGeo(JetGeoProperties properties) { + this.level = properties.getLevel(); + this.geoDataParentFile = new File(properties.getGeoDataParentPath()); + S2Util.setMinLevel(properties.getS2MinLevel()); + S2Util.setMaxLevel(properties.getS2MaxLevel()); + S2Util.setMaxCells(properties.getS2MaxCells()); + S2Util.init(); + + this.loadCacheBuilder = CacheBuilder.newBuilder() + .initialCapacity(properties.getLoadCacheInitialCapacity()) + .maximumSize(properties.getLoadCacheMaximumSize()) + .expireAfterAccess(properties.getLoadCacheExpireAfterAccess()) + .refreshAfterWrite(properties.getLoadCacheRefreshAfterWrite()); + initCache(LevelEnum.province, PROVINCE_REGION_CACHE); + initLoadingCache(); + + } + + /** + * 初始化指定区域缓存 + * + * @param level + * @param cache + */ + private void initCache(LevelEnum level, Map<String, RegionCache> cache) { + List<File> files = FileUtil.loopFiles(new File(this.geoDataParentFile, level.name())); + for (File file : files) { + RegionCache regionCache = Utils.loadRegionCache(file); + cache.put(regionCache.getCacheKey(), regionCache); + } + } + + private void initLoadingCache() { + if (this.level.lessThen(LevelEnum.city)) { + CITY_REGION_CACHE = this.loadCacheBuilder.build(new RegionCacheLoader(this.geoDataParentFile, LevelEnum.city)); + } + + if (this.level.lessThen(LevelEnum.district)) { + DISTRICT_REGION_CACHE = this.loadCacheBuilder.build( + new RegionCacheLoader(this.geoDataParentFile, LevelEnum.district)); + } + } + + + /** + * 获取逆地理编码信息 + * + * @param lat + * @param lng + * @return + */ + public GeoInfo getGeoInfo(double lat, double lng) { + GeoInfo geoInfo = new GeoInfo(); + geoInfo.setProvince(""); + geoInfo.setCity(""); + geoInfo.setDistrict(""); + geoInfo.setStreet(""); + geoInfo.setLevel(LevelEnum.province); + + //定位省 + containsRegion(geoInfo, PROVINCE_REGION_CACHE, lat, lng); + + if (StrUtil.isEmpty(geoInfo.getProvince())) { + return null; + } + + if (this.level.lessThen(LevelEnum.city)) { + containsRegionByLoadingCache(geoInfo, CITY_REGION_CACHE, lat, lng); + } + + if (StrUtil.isNotEmpty(geoInfo.getCity()) && level.lessThen(LevelEnum.district)) { + containsRegionByLoadingCache(geoInfo, DISTRICT_REGION_CACHE, lat, lng); + } + + geoInfo.setFormatAddress(geoInfo.getProvince() + geoInfo.getCity() + geoInfo.getDistrict() + + geoInfo.getStreet()); + return geoInfo; + } + + private void containsRegion(GeoInfo geoInfo, Map<String, RegionCache> regionCacheMap, + double lat, double lng) { + String parentCode = geoInfo.getAdcode(); + String regionName = ""; + String regionCode = ""; + LevelEnum regionLevel = null; + for (String cacheKey : regionCacheMap.keySet()) { + if (StrUtil.isNotEmpty(parentCode) && !cacheKey.startsWith(parentCode)) { + continue; + } + RegionCache regionCache = regionCacheMap.get(cacheKey); + if (regionCache.contains(lat, lng)) { + regionName = regionCache.getRegionName(); + regionCode = regionCache.getRegionCode(); + regionLevel = regionCache.getRegionLevel(); + } + if (StrUtil.isNotEmpty(regionName) && StrUtil.isNotEmpty(regionCode) + && regionLevel != null) { + break; + } + } + geoInfo.setAdcode(regionCode); + geoInfo.setLevel(regionLevel); + geoInfo.setRegionName(regionLevel, regionName); + } + + private void containsRegionByLoadingCache(GeoInfo geoInfo, + LoadingCache<String, List<RegionCache>> loadingCache, double lat, double lng) { + String parentCode = geoInfo.getAdcode(); + String regionName = ""; + String regionCode = ""; + LevelEnum regionLevel = null; + if (StrUtil.isNotEmpty(parentCode)) { + try { + List<RegionCache> regionCacheList = loadingCache.get(parentCode); + for (RegionCache regionCache : regionCacheList) { + if (regionCache.contains(lat, lng)) { + regionName = regionCache.getRegionName(); + regionCode = regionCache.getRegionCode(); + regionLevel = regionCache.getRegionLevel(); + break; + } + } + geoInfo.setAdcode(regionCode); + geoInfo.setLevel(regionLevel); + geoInfo.setRegionName(regionLevel, regionName); + } catch (ExecutionException e) { + throw new RuntimeException(e); + } + } + } +} diff --git a/jetgeo-core/src/main/java/com/ling5821/jetgeo/cache/RegionCacheLoader.java b/jetgeo-core/src/main/java/com/ling5821/jetgeo/cache/RegionCacheLoader.java new file mode 100644 index 0000000..a027fda --- /dev/null +++ b/jetgeo-core/src/main/java/com/ling5821/jetgeo/cache/RegionCacheLoader.java @@ -0,0 +1,32 @@ +package com.ling5821.jetgeo.cache; + +import cn.hutool.core.io.FileUtil; +import com.google.common.cache.CacheLoader; +import com.ling5821.jetgeo.enums.LevelEnum; +import com.ling5821.jetgeo.model.RegionCache; +import com.ling5821.jetgeo.utils.Utils; +import java.io.File; +import java.util.List; + +/** + * @author lsj + * @date 2021/11/23 22:40 + */ +public class RegionCacheLoader extends CacheLoader<String, List<RegionCache>> { + + private LevelEnum level; + private File dataPath; + + public RegionCacheLoader(File geoDataParentPath, LevelEnum level) { + this.level = level; + this.dataPath = new File(geoDataParentPath, level.name()); + } + + @Override + public List<RegionCache> load(String key) throws Exception { + List<File> files = FileUtil.loopFiles(dataPath, + pathname -> pathname.getName() + .matches(level + "_" + key + "_.+")); + return Utils.loadRegionCaches(files); + } +} diff --git a/jetgeo-core/src/main/java/com/ling5821/jetgeo/config/JetGeoProperties.java b/jetgeo-core/src/main/java/com/ling5821/jetgeo/config/JetGeoProperties.java new file mode 100644 index 0000000..b1a056a --- /dev/null +++ b/jetgeo-core/src/main/java/com/ling5821/jetgeo/config/JetGeoProperties.java @@ -0,0 +1,55 @@ +package com.ling5821.jetgeo.config; + +import com.ling5821.jetgeo.enums.LevelEnum; +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author lsj + * @date 2021/11/20 2:28 + */ +@Data +@NoArgsConstructor +public class JetGeoProperties { + + /** + * 区域地理边界坐标数据所在的父目录 + */ + private String geoDataParentPath; + + /** + * 逆地理转换到的最低级别 + */ + private LevelEnum level; + + /** + * S2 最小/最大单元格级别 调整前请务必先了解S2算法 + */ + private int s2MinLevel = 11; + private int s2MaxLevel = 16; + + /** + * S2 最大单元格个数 调整前请务必先了解S2算法 + */ + private int s2MaxCells = 100; + + /** + * 只对市级/县级缓存有效, 省级缓存在初始化时已经全部加载到内存 + */ + private int loadCacheInitialCapacity = 20; + + private int loadCacheMaximumSize = 100; + + /** + * 在指定的过期时间内没有读写,缓存数据即失效 建议与 loadCacheRefreshAfterWrite 设置为 5:1 / 3:1 的关系 + */ + private Duration loadCacheExpireAfterAccess = Duration.of(5, ChronoUnit.MINUTES); + + /** + * 在指定的过期时间之后访问时,刷新缓存数据,在刷新任务未完成之前,其他线程返回旧值 + * 建议与 loadCacheRefreshAfterWrite 设置为 1:5 / 1:3 的关系 + */ + private Duration loadCacheRefreshAfterWrite = Duration.of(1, ChronoUnit.MINUTES); +} diff --git a/jetgeo-core/src/main/java/com/ling5821/jetgeo/enums/LevelEnum.java b/jetgeo-core/src/main/java/com/ling5821/jetgeo/enums/LevelEnum.java new file mode 100644 index 0000000..7e7878a --- /dev/null +++ b/jetgeo-core/src/main/java/com/ling5821/jetgeo/enums/LevelEnum.java @@ -0,0 +1,32 @@ +package com.ling5821.jetgeo.enums; + +/** + * @author lsj + * @date 2021/11/20 2:32 + */ +public enum LevelEnum { + /** + * 省/直辖市/自治区 + */ + province, + + /** + * 市 + */ + city, + + /** + * 区/县 + */ + district, + + /** + * 乡镇/街道(暂不支持定位到街道) + */ +// street + ; + public boolean lessThen(LevelEnum levelEnum) { + return this.ordinal() >= levelEnum.ordinal(); + } + +} diff --git a/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/GeoInfo.java b/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/GeoInfo.java new file mode 100644 index 0000000..a221785 --- /dev/null +++ b/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/GeoInfo.java @@ -0,0 +1,47 @@ +package com.ling5821.jetgeo.model; + +import com.ling5821.jetgeo.enums.LevelEnum; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author lsj + * @date 2021/11/20 2:52 + */ +@Data +@NoArgsConstructor +public class GeoInfo { + + private String formatAddress; + private String province; + private String city; + private String district; + private String street; + private String adcode; + private LevelEnum level; + + /* 获取当前具有的等级, 如果搜索下级未找到,能保证此时Level标识能找到的最低等级 */ + public void setLevel(LevelEnum level) { + if (this.level != null) { + this.level = level; + } + } + + public void setRegionName(LevelEnum level, String regionName) { + if (level != null) { + switch (level) { + case province: + this.province = regionName; + break; + case city: + this.city = regionName; + break; + case district: + this.district = regionName; + break; + default: + break; + } + } + } +} diff --git a/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/JsonPoint.java b/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/JsonPoint.java new file mode 100644 index 0000000..014d062 --- /dev/null +++ b/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/JsonPoint.java @@ -0,0 +1,26 @@ +package com.ling5821.jetgeo.model; + +/** + * @author lsj + * @date 2021/11/18 16:38 + */ +public class JsonPoint { + private double lng; + private double lat; + + public double getLng() { + return lng; + } + + public void setLng(double lng) { + this.lng = lng; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } +} diff --git a/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/RegionCache.java b/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/RegionCache.java new file mode 100644 index 0000000..54cfbee --- /dev/null +++ b/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/RegionCache.java @@ -0,0 +1,40 @@ +package com.ling5821.jetgeo.model; + +import com.google.common.geometry.S2Region; +import com.ling5821.jetgeo.enums.LevelEnum; +import com.ling5821.jetgeo.utils.S2Util; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author lsj + * @date 2021/11/20 3:02 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RegionCache { + private String regionName; + private String parentCode; + private String regionCode; + private LevelEnum regionLevel; + private List<S2Region> s2RegionList; + + public String getCacheKey() { + return parentCode != null && parentCode.length() > 0 ? parentCode + ":" + regionCode : regionCode; + } + + public boolean contains(double lat,double lng) { + for (S2Region s2Region : this.s2RegionList) { + if (S2Util.contains(s2Region, lat, lng)) { + return true; + } + } + return false; + } + + + +} diff --git a/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/RegionInfo.java b/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/RegionInfo.java new file mode 100644 index 0000000..97f46ae --- /dev/null +++ b/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/RegionInfo.java @@ -0,0 +1,22 @@ +package com.ling5821.jetgeo.model; + +import com.ling5821.jetgeo.enums.LevelEnum; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author lsj + * @date 2021/11/20 14:49 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RegionInfo { + + private LevelEnum regionLevel; + private String parentCode; + private String regionCode; + private String regionName; + +} diff --git a/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/Tuple2.java b/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/Tuple2.java new file mode 100644 index 0000000..f00558f --- /dev/null +++ b/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/Tuple2.java @@ -0,0 +1,35 @@ +package com.ling5821.jetgeo.model; + +/** + * @author by https://blog.csdn.net/qq_43777978/article/details/116800460?ivk_sa=1024320u + * @date 2021/11/18 16:37 + */ +public class Tuple2<A, B> { + + private A a; + private B b; + + public static Tuple2<Double, Double> tuple(Double a, Double b) { + Tuple2<Double, Double> tuple2 = new Tuple2<>(); + tuple2.setA(a); + tuple2.setB(b); + return tuple2; + } + + private void setA(A a) { + this.a = a; + } + + private void setB(B b) { + this.b = b; + } + + public A getVal1() { + return a; + } + + public B getVal2() { + return b; + } + +} \ No newline at end of file diff --git a/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/WGS84Point.java b/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/WGS84Point.java new file mode 100644 index 0000000..f46f6fe --- /dev/null +++ b/jetgeo-core/src/main/java/com/ling5821/jetgeo/model/WGS84Point.java @@ -0,0 +1,29 @@ +package com.ling5821.jetgeo.model; + +/** + * @author by https://blog.csdn.net/qq_43777978/article/details/116800460?ivk_sa=1024320u + * @date 2021/11/18 16:37 + */ +public class WGS84Point { + + private Double latitude; + private Double longitude; + + public Double getLatitude() { + return latitude; + } + + public WGS84Point setLatitude(Double latitude) { + this.latitude = latitude; + return this; + } + + public Double getLongitude() { + return longitude; + } + + public WGS84Point setLongitude(Double longitude) { + this.longitude = longitude; + return this; + } +} \ No newline at end of file diff --git a/jetgeo-core/src/main/java/com/ling5821/jetgeo/utils/S2Util.java b/jetgeo-core/src/main/java/com/ling5821/jetgeo/utils/S2Util.java new file mode 100644 index 0000000..362fab5 --- /dev/null +++ b/jetgeo-core/src/main/java/com/ling5821/jetgeo/utils/S2Util.java @@ -0,0 +1,226 @@ +package com.ling5821.jetgeo.utils; + +import com.google.common.collect.Lists; +import com.google.common.geometry.S2; +import com.google.common.geometry.S2Cap; +import com.google.common.geometry.S2Cell; +import com.google.common.geometry.S2CellId; +import com.google.common.geometry.S2CellUnion; +import com.google.common.geometry.S2LatLng; +import com.google.common.geometry.S2Loop; +import com.google.common.geometry.S2Point; +import com.google.common.geometry.S2Polygon; +import com.google.common.geometry.S2Region; +import com.google.common.geometry.S2RegionCoverer; +import com.ling5821.jetgeo.model.Tuple2; +import com.ling5821.jetgeo.model.WGS84Point; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author by https://blog.csdn.net/qq_43777978/article/details/116800460?ivk_sa=1024320u + * @date 2021/11/18 16:37 + */ +public enum S2Util { + /** + * 实例 + */ + INSTANCE; + + private static int minLevel = 11; + private static int maxLevel = 16; + private static int maxCells = 100; + + + private static S2RegionCoverer COVERER; + + public static void init() { + COVERER = S2RegionCoverer.builder() + .setMinLevel(minLevel) + .setMinLevel(maxLevel) + .setMaxCells(maxCells) + .build(); + } + + /** + * 将单个cellId转换为多个指定level的cellId + * + * @param s2CellId + * @param desLevel + * @return + */ + public static List<S2CellId> childrenCellId(S2CellId s2CellId, Integer desLevel) { + return childrenCellId(s2CellId, s2CellId.level(), desLevel); + } + + private static List<S2CellId> childrenCellId(S2CellId s2CellId, Integer curLevel, + Integer desLevel) { + if (curLevel < desLevel) { + long interval = (s2CellId.childEnd().id() - s2CellId.childBegin().id()) / 4; + List<S2CellId> s2CellIds = Lists.newArrayList(); + for (int i = 0; i < 4; i++) { + long id = s2CellId.childBegin().id() + interval * i; + s2CellIds.addAll(childrenCellId(new S2CellId(id), curLevel + 1, desLevel)); + } + return s2CellIds; + } else { + return Lists.newArrayList(s2CellId); + } + } + + /** + * 将cellToken转换为经纬度 + * + * @param token + * @return + */ + public static Tuple2<Double, Double> toLatLon(String token) { + S2LatLng latLng = new S2LatLng(S2CellId.fromToken(token).toPoint()); + return Tuple2.tuple(latLng.latDegrees(), latLng.lngDegrees()); + } + + /** + * 将经纬度转换为cellId + * + * @param lat + * @param lon + * @return + */ + public static S2CellId toCellId(double lat, double lon) { + return S2CellId.fromLatLng(S2LatLng.fromDegrees(lat, lon)); + } + + /** + * 判断region是否包含指定cellToken + * + * @param region + * @param cellToken + * @return + */ + public static boolean contains(S2Region region, String cellToken) { + return region.contains(new S2Cell(S2CellId.fromToken(cellToken))); + } + + /** + * 判断region是否包含指定经纬度坐标 + * + * @param region + * @param lat + * @param lon + * @return + */ + public static boolean contains(S2Region region, double lat, double lon) { + S2LatLng s2LatLng = S2LatLng.fromDegrees(lat, lon); + try { + boolean contains = region.contains(new S2Cell(s2LatLng)); + return contains; + } catch (NullPointerException e) { + e.printStackTrace(); + return false; + } + } + + + /** + * 根据region获取cellId列表 + * + * @param region + * @return + */ + public static List<S2CellId> getCellIdList(S2Region region) { + List<S2CellId> primeS2CellIdList = COVERER.getCovering(region).cellIds(); + return primeS2CellIdList.stream() + .flatMap(s2CellId -> S2Util.childrenCellId(s2CellId, S2Util.minLevel).stream()).collect( + Collectors.toList()); + } + + /** + * 根据region获取合并后的cellId列表 + * + * @param region + * @return + */ + public static List<S2CellId> getCompactCellIdList(S2Region region) { + List<S2CellId> primeS2CellIdList = COVERER.getCovering(region).cellIds(); + return primeS2CellIdList; + } + + //获取圆形region + public static S2Region getS2RegionByCircle(double lat, double lon, double radius) { + double capHeight = (2 * S2.M_PI) * (radius / 40075017); + S2Cap cap = S2Cap.fromAxisHeight(S2LatLng.fromDegrees(lat, lon).toPoint(), + capHeight * capHeight / 2); + S2CellUnion s2CellUnion = COVERER.getCovering(cap); + return cap; + } + + public static S2Region getS2RegionByCircle(WGS84Point point, double radius) { + return getS2RegionByCircle(point.getLatitude(), point.getLongitude(), radius); + } + + //获取矩形region + public static S2Region geS2RegionByRect(WGS84Point point1, WGS84Point point2) { + return getS2RegionByRect(point1.getLatitude(), point1.getLongitude(), point2.getLatitude(), + point2.getLongitude()); + } + + public static S2Region getS2RegionByRect(Tuple2<Double, Double> point1, + Tuple2<Double, Double> point2) { + return getS2RegionByRect(point1.getVal1(), point1.getVal2(), point2.getVal1(), + point2.getVal2()); + } + + public static S2Region getS2RegionByRect(double lat1, double lon1, double lat2, double lon2) { + List<Tuple2<Double, Double>> latLonTuple2List = Lists.newArrayList(Tuple2.tuple(lat1, lon1), + Tuple2.tuple(lat1, lon2), Tuple2.tuple(lat2, lon2), Tuple2.tuple(lat2, lon1)); + return getS2RegionByPolygon(latLonTuple2List); + } + + //获取多边形region + + public static S2Region getS2RegionByPolygon(WGS84Point[] pointArray) { + List<Tuple2<Double, Double>> latLonTuple2List = Lists.newArrayListWithExpectedSize( + pointArray.length); + for (int i = 0; i < pointArray.length; ++i) { + latLonTuple2List.add( + Tuple2.tuple(pointArray[i].getLatitude(), pointArray[i].getLongitude())); + } + return getS2RegionByPolygon(latLonTuple2List); + } + + public static S2Region getS2RegionByPolygon(Tuple2<Double, Double>[] tuple2Array) { + return getS2RegionByPolygon(Lists.newArrayList(tuple2Array)); + } + + + /** + * 注意需要以逆时针方向添加坐标点,多边形内部区域 + */ + public static S2Region getS2RegionByPolygon(List<Tuple2<Double, Double>> latLonTuple2List) { + List<S2Point> pointList = Lists.newArrayList(); + for (Tuple2<Double, Double> latlonTuple2 : latLonTuple2List) { + pointList.add( + S2LatLng.fromDegrees(latlonTuple2.getVal1(), latlonTuple2.getVal2()).toPoint()); + + } + S2Loop s2Loop = new S2Loop(pointList); + S2Polygon s2Polygon = new S2Polygon(s2Loop); + return s2Polygon; + + /*S2PolygonBuilder builder = new S2PolygonBuilder(S2PolygonBuilder.Options.DIRECTED_XOR); + builder.addLoop(s2Loop); + return builder.assemblePolygon();*/ + } + + public static void setMinLevel(int minLevel) { + S2Util.minLevel = minLevel; + } + + public static void setMaxLevel(int maxLevel) { + S2Util.maxLevel = maxLevel; + } + + public static void setMaxCells(int maxCells) { + S2Util.maxCells = maxCells; + } +} diff --git a/jetgeo-core/src/main/java/com/ling5821/jetgeo/utils/Utils.java b/jetgeo-core/src/main/java/com/ling5821/jetgeo/utils/Utils.java new file mode 100644 index 0000000..240a915 --- /dev/null +++ b/jetgeo-core/src/main/java/com/ling5821/jetgeo/utils/Utils.java @@ -0,0 +1,109 @@ +package com.ling5821.jetgeo.utils; + +import com.google.common.geometry.S2Region; +import com.ling5821.jetgeo.enums.LevelEnum; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.lang.TypeReference; +import cn.hutool.json.JSONUtil; +import com.ling5821.jetgeo.model.RegionCache; +import com.ling5821.jetgeo.model.RegionInfo; +import com.ling5821.jetgeo.model.JsonPoint; +import com.ling5821.jetgeo.model.Tuple2; +import java.io.File; +import java.lang.reflect.Type; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author lsj + * @date 2021/11/20 3:19 + */ +public class Utils { + + public static List<List<JsonPoint>> readJsonPoint(File file) { + return JSONUtil.readJSONArray( + file, + StandardCharsets.UTF_8).toBean(new TypeReference<List<List<JsonPoint>>>() { + @Override + public Type getType() { + return super.getType(); + } + }); + } + + public static List<List<Tuple2<Double, Double>>> jsonPointLists2Tuple2Lists( + List<List<JsonPoint>> jsonPointLists) { + return jsonPointLists.stream().map((jsonPointList) -> jsonPointList.stream() + .map((geoData) -> Tuple2.tuple(geoData.getLat(), geoData.getLng())).collect( + Collectors.toList())).collect(Collectors.toList()); + } + + public static RegionInfo getFileNameRegionInfo(String fileName) { + RegionInfo regionInfo = new RegionInfo(); + String filePrefixName = FileUtil.getPrefix(fileName); + String[] info = filePrefixName.split("_"); + LevelEnum level; + try { + level = LevelEnum.valueOf(info[0]); + } catch (Exception e) { + throw new RuntimeException("Unknown region level [" + info[0] + "]"); + } + regionInfo.setRegionLevel(level); + switch (level) { + case province: + regionInfo.setRegionCode(info[1]); + regionInfo.setRegionName(info[2]); + break; + case city: + regionInfo.setParentCode(info[1]); + regionInfo.setRegionCode(info[2]); + regionInfo.setRegionName(info[3]); + break; + case district: + regionInfo.setParentCode(info[1]); + regionInfo.setRegionCode(info[2]); + regionInfo.setRegionName(info[3]); + break; + default: + throw new RuntimeException("Unknown region level [" + level + "]"); + } + return regionInfo; + } + + /** + * 加载RegionCache对象 + * + * @param file + * @return + */ + public static RegionCache loadRegionCache(File file) { + RegionInfo regionInfo = Utils.getFileNameRegionInfo(file.getName()); + List<List<Tuple2<Double, Double>>> tuple2Lists = Utils.jsonPointLists2Tuple2Lists( + Utils.readJsonPoint(file)); + + List<S2Region> s2Regions = new ArrayList<>(); + for (List<Tuple2<Double, Double>> tuple2List : tuple2Lists) { + S2Region s2Region = S2Util.getS2RegionByPolygon(tuple2List); + s2Regions.add(s2Region); + } + RegionCache regionCache = new RegionCache(); + regionCache.setRegionLevel(regionInfo.getRegionLevel()); + regionCache.setParentCode(regionInfo.getParentCode()); + regionCache.setRegionCode(regionInfo.getRegionCode()); + regionCache.setRegionName(regionInfo.getRegionName()); + regionCache.setS2RegionList(s2Regions); + return regionCache; + } + + public static List<RegionCache> loadRegionCaches(List<File> files) { + List<RegionCache> regionCacheList = new ArrayList<>(); + for (File file : files) { + regionCacheList.add(loadRegionCache(file)); + } + return regionCacheList; + } + +} diff --git a/jetgeo-core/src/test/java/com/ling5821/jetgeo/JetGeoExample.java b/jetgeo-core/src/test/java/com/ling5821/jetgeo/JetGeoExample.java new file mode 100644 index 0000000..dbf7316 --- /dev/null +++ b/jetgeo-core/src/test/java/com/ling5821/jetgeo/JetGeoExample.java @@ -0,0 +1,37 @@ +package com.ling5821.jetgeo; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.ling5821.jetgeo.config.JetGeoProperties; +import com.ling5821.jetgeo.enums.LevelEnum; +import com.ling5821.jetgeo.model.GeoInfo; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.lucene.util.RamUsageEstimator; +import org.junit.jupiter.api.Test; + +/** + * @author lsj + * @date 2021/11/20 14:34 + */ +public class JetGeoExample { + public static final JetGeo jetGeo; + static { + JetGeoProperties properties = new JetGeoProperties(); + properties.setGeoDataParentPath("D:\\Projects\\idea\\jetgeo\\jetgeo-core\\src\\main\\resources"); + properties.setLevel(LevelEnum.province); + properties.setLevel(LevelEnum.city); + properties.setLevel(LevelEnum.district); + jetGeo = new JetGeo(properties); + } + + public static void main(String[] args) { + GeoInfo geoInfo = jetGeo.getGeoInfo(32.053197915979325,118.85999259252777); + System.out.println(geoInfo); + } +} diff --git a/jetgeo-core/src/test/java/com/ling5821/jetgeo/JetGeoTests.java b/jetgeo-core/src/test/java/com/ling5821/jetgeo/JetGeoTests.java new file mode 100644 index 0000000..a098884 --- /dev/null +++ b/jetgeo-core/src/test/java/com/ling5821/jetgeo/JetGeoTests.java @@ -0,0 +1,133 @@ +package com.ling5821.jetgeo; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.ling5821.jetgeo.config.JetGeoProperties; +import com.ling5821.jetgeo.enums.LevelEnum; +import com.ling5821.jetgeo.model.GeoInfo; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.lucene.util.RamUsageEstimator; +import org.junit.jupiter.api.Test; + +/** + * @author lsj + * @date 2021/11/20 14:34 + */ +public class JetGeoTests { + public static final JetGeo jetGeo; + static { + JetGeoProperties properties = new JetGeoProperties(); + properties.setGeoDataParentPath("/data/geodata"); + properties.setLevel(LevelEnum.province); + properties.setLevel(LevelEnum.city); + properties.setLevel(LevelEnum.district); + jetGeo = new JetGeo(properties); + } + + @Test + void initTest() { + GeoInfo geoInfo1 = jetGeo.getGeoInfo(35.338650457294094, 112.25346613445444); + System.out.println(geoInfo1); + + GeoInfo geoInfo2 = jetGeo.getGeoInfo(39.916755616254555,93.42899448106573); + System.out.println(geoInfo2); + + GeoInfo geoInfo3 = jetGeo.getGeoInfo(41.03984141034477,93.39220344090528); + System.out.println(geoInfo3); + + GeoInfo geoInfo4 = jetGeo.getGeoInfo(30.424732936810585,99.13300704545584); + System.out.println(geoInfo4); + + GeoInfo geoInfo5 = jetGeo.getGeoInfo(30.281764911231406,98.80224205919843); + System.out.println(geoInfo5); + + GeoInfo geoInfo6 = jetGeo.getGeoInfo(50.49211333201635,124.39579025135696); + System.out.println(geoInfo6); + + GeoInfo geoInfo7 = jetGeo.getGeoInfo(50.47740931720987,124.46268489454489); + System.out.println(geoInfo7); + + GeoInfo geoInfo8 = jetGeo.getGeoInfo(50.203970460629016,124.24193207907093); + System.out.println(geoInfo8); + + GeoInfo geoInfo9 = jetGeo.getGeoInfo(50.17430508526461,124.37044861056783); + System.out.println(geoInfo9); + + GeoInfo geoInfo10 = jetGeo.getGeoInfo(50.58880035292801,124.10597230982526); + System.out.println(geoInfo10); + + GeoInfo geoInfo11 = jetGeo.getGeoInfo(50.54790703930835,124.11281195442807); + System.out.println(geoInfo11); + + GeoInfo geoInfo12 = jetGeo.getGeoInfo(50.200244507206136,124.31338798795879); + System.out.println(geoInfo12); + + GeoInfo geoInfo13 = jetGeo.getGeoInfo(22.133244733471454,113.56844351864902); + System.out.println(geoInfo13); + + GeoInfo geoInfo14 = jetGeo.getGeoInfo(22.40322011200182,114.11298895339678); + System.out.println(geoInfo14); + } + + @Test + void getCellIdTest() { + /*for (RegionCache regionCache : JetGeo.PROVINCE_REGION_CACHE.values()) { + List<S2Region> s2RegionList = regionCache.getS2RegionList(); + for (S2Region s2Region : s2RegionList) { + StringBuilder sb = new StringBuilder(); + List<S2CellId> cellIdList = S2Util.getCellIdList(s2Region); + Map<Integer,Integer> sizeCountMap = new HashMap<>(); + cellIdList.forEach(s2CellId -> { + System.out.println("Level:" + s2CellId.level() + ", ID:" + s2CellId.toToken() + ",Min:" + + s2CellId.rangeMin().toToken() + ",Max:" + s2CellId.rangeMax().toToken()); + sb.append(",").append(s2CellId.toToken()); + sizeCountMap.put(s2CellId.level(), sizeCountMap.getOrDefault(s2CellId.level(), 0) + 1); + }); + System.out.println(sb.substring(1)); + System.out.println("totalSize:" + cellIdList.size()); + sizeCountMap.forEach((key, value) -> System.out.printf("level:%d,size:%d\n", key, value)); + System.out.println(regionCache.getRegionName() + "-----------------------------"); + cellIdList = null; + } + }*/ + System.out.println(RamUsageEstimator.humanSizeOf(JetGeo.PROVINCE_REGION_CACHE)); + System.out.println(RamUsageEstimator.humanSizeOf(jetGeo.CITY_REGION_CACHE)); + + } + + void jsonDataParse() { + String districtStr = FileUtil.readString("source_data/district.txt", StandardCharsets.UTF_8); + String[] splitArray = districtStr.split("\r\n"); + Map<String, Integer> countMap = new HashMap<>(); + int pre = 0; + for (String str : splitArray) { + String[] strs = str.split(":"); + int count = Integer.parseInt(strs[2]) - pre; + pre = Integer.parseInt(strs[2]); + countMap.put(strs[0], count); + } + List<File> files = FileUtil.loopFiles("source_data/json/district"); + for (File file : files) { + JSONArray objects = JSONUtil.readJSONArray(file, StandardCharsets.UTF_8); + for (Object object : objects) { + JSONObject jsonObject = (JSONObject) object; + String fileName = jsonObject.getStr("fileName"); + String data = jsonObject.getStr("data"); + FileUtil.writeString(data,"D:\\Projects\\idea\\jetgeo\\jetgeo-core\\src\\main\\resources\\district\\" + fileName + ".json" , StandardCharsets.UTF_8); + } + String adcode = FileUtil.getPrefix(file); + Integer count = countMap.get(adcode); + if (count == null) { + System.out.println(adcode + " not count"); + } else if (count != objects.size()) { + System.out.println(adcode + " not equal count: " + count + " size: " + objects.size()); + } + } + } +} diff --git a/jetgeo-spring-boot-starter/pom.xml b/jetgeo-spring-boot-starter/pom.xml new file mode 100644 index 0000000..97ce943 --- /dev/null +++ b/jetgeo-spring-boot-starter/pom.xml @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>jetgeo</artifactId> + <groupId>com.ling5821</groupId> + <version>1.0.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>jetgeo-spring-boot-starter</artifactId> + + <properties> + </properties> + + <dependencies> + <dependency> + <groupId>com.ling5821</groupId> + <artifactId>jetgeo-core</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-configuration-processor</artifactId> + <optional>true</optional> + </dependency> + + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <optional>true</optional> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>com.qcloud</groupId> + <artifactId>cmq-tcp-client</artifactId> + <version>1.1.1</version> + <exclusions> + <exclusion> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + </exclusion> + </exclusions> + </dependency> + + </dependencies> + +</project> \ No newline at end of file diff --git a/jetgeo-spring-boot-starter/src/main/java/com/ling5821/jetgeo/starter/JetGeoAutoConfiguration.java b/jetgeo-spring-boot-starter/src/main/java/com/ling5821/jetgeo/starter/JetGeoAutoConfiguration.java new file mode 100644 index 0000000..bd63404 --- /dev/null +++ b/jetgeo-spring-boot-starter/src/main/java/com/ling5821/jetgeo/starter/JetGeoAutoConfiguration.java @@ -0,0 +1,32 @@ +package com.ling5821.jetgeo.starter; + +import com.ling5821.jetgeo.JetGeo; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author lsj + * @date 2021/11/24 15:08 + */ +@Configuration +@EnableConfigurationProperties(JetGeoProperties.class) +public class JetGeoAutoConfiguration { + @Bean + @ConditionalOnMissingBean + public JetGeo jetGeo(JetGeoProperties properties) { + com.ling5821.jetgeo.config.JetGeoProperties config = new com.ling5821.jetgeo.config.JetGeoProperties(); + config.setGeoDataParentPath(properties.getGeoDataParentPath()); + config.setLevel(properties.getLevel()); + config.setS2MinLevel(properties.getS2MinLevel()); + config.setS2MaxLevel(properties.getS2MaxLevel()); + config.setS2MaxCells(properties.getS2MaxCells()); + config.setLoadCacheInitialCapacity(properties.getLoadCacheInitialCapacity()); + config.setLoadCacheMaximumSize(properties.getLoadCacheMaximumSize()); + config.setLoadCacheExpireAfterAccess(properties.getLoadCacheExpireAfterAccess()); + config.setLoadCacheRefreshAfterWrite(properties.getLoadCacheRefreshAfterWrite()); + return new JetGeo(config); + } + +} diff --git a/jetgeo-spring-boot-starter/src/main/java/com/ling5821/jetgeo/starter/JetGeoProperties.java b/jetgeo-spring-boot-starter/src/main/java/com/ling5821/jetgeo/starter/JetGeoProperties.java new file mode 100644 index 0000000..97e5baf --- /dev/null +++ b/jetgeo-spring-boot-starter/src/main/java/com/ling5821/jetgeo/starter/JetGeoProperties.java @@ -0,0 +1,54 @@ +package com.ling5821.jetgeo.starter; + +import com.ling5821.jetgeo.enums.LevelEnum; +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author lsj + * @date 2021/11/24 16:03 + */ +@ConfigurationProperties(prefix = "jetgeo") +@Data +public class JetGeoProperties { + + /** + * 区域地理边界坐标数据所在的父目录 + */ + private String geoDataParentPath; + + /** + * 逆地理转换到的最低级别 + */ + private LevelEnum level; + + /** + * S2 最小/最大单元格级别 调整前请务必先了解S2算法 + */ + private int s2MinLevel = 11; + private int s2MaxLevel = 16; + + /** + * S2 最大单元格个数 调整前请务必先了解S2算法 + */ + private int s2MaxCells = 100; + + /** + * 只对市级/县级缓存有效, 省级缓存在初始化时已经全部加载到内存 + */ + private int loadCacheInitialCapacity = 20; + + private int loadCacheMaximumSize = 100; + + /** + * 在指定的过期时间内没有读写,缓存数据即失效 建议与 loadCacheRefreshAfterWrite 设置为 5:1 / 3:1 的关系 + */ + private Duration loadCacheExpireAfterAccess = Duration.of(5, ChronoUnit.MINUTES); + + /** + * 在指定的过期时间之后访问时,刷新缓存数据,在刷新任务未完成之前,其他线程返回旧值 建议与 loadCacheRefreshAfterWrite 设置为 1:5 / 1:3 的关系 + */ + private Duration loadCacheRefreshAfterWrite = Duration.of(1, ChronoUnit.MINUTES); +} diff --git a/jetgeo-spring-boot-starter/src/main/resources/META-INF/spring.factories b/jetgeo-spring-boot-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..9192a21 --- /dev/null +++ b/jetgeo-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.ling5821.jetgeo.starter.JetGeoAutoConfiguration \ No newline at end of file diff --git a/jetgeo-spring-boot-starter/src/test/java/com/ling5821/jetgeo/starter/JetGeoStarterApplicationTests.java b/jetgeo-spring-boot-starter/src/test/java/com/ling5821/jetgeo/starter/JetGeoStarterApplicationTests.java new file mode 100644 index 0000000..f5ff665 --- /dev/null +++ b/jetgeo-spring-boot-starter/src/test/java/com/ling5821/jetgeo/starter/JetGeoStarterApplicationTests.java @@ -0,0 +1,44 @@ +package com.ling5821.jetgeo.starter; + +import com.ling5821.jetgeo.JetGeo; +import com.ling5821.jetgeo.model.GeoInfo; +import com.ling5821.jetgeo.starter.cmq.CmqTcpHandler; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.util.StopWatch; + +/** + * @author lsj + * @date 2021/11/24 15:19 + */ +@SpringBootTest(classes = {JetGeoAutoConfiguration.class, CmqTcpHandler.class}) +@Slf4j +public class JetGeoStarterApplicationTests { + + @Autowired + private JetGeo jetGeo; + + @Autowired + private CmqTcpHandler cmqTcpHandler; + + @Test + void testJetGeo() { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + for (int i = 0; i < 100000; i++) { + GeoInfo geoInfo1 = jetGeo.getGeoInfo(35.338650457294094, 112.25346613445444); + System.out.println(geoInfo1); + } + stopWatch.stop(); + log.info("time seconds {}s", stopWatch.getTotalTimeMillis() / 1000); + + } + + @Test + void testGpsPressure() throws InterruptedException { + cmqTcpHandler.start(); + Thread.currentThread().join(); + } +} diff --git a/jetgeo-spring-boot-starter/src/test/java/com/ling5821/jetgeo/starter/cmq/CmqTcpHandler.java b/jetgeo-spring-boot-starter/src/test/java/com/ling5821/jetgeo/starter/cmq/CmqTcpHandler.java new file mode 100644 index 0000000..275553e --- /dev/null +++ b/jetgeo-spring-boot-starter/src/test/java/com/ling5821/jetgeo/starter/cmq/CmqTcpHandler.java @@ -0,0 +1,102 @@ +package com.ling5821.jetgeo.starter.cmq; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.ling5821.jetgeo.JetGeo; +import com.ling5821.jetgeo.model.GeoInfo; +import com.ling5821.jetgeo.starter.model.GpsInfo; +import com.qcloud.cmq.client.consumer.BatchDeleteCallback; +import com.qcloud.cmq.client.consumer.BatchDeleteResult; +import com.qcloud.cmq.client.consumer.Consumer; +import com.qcloud.cmq.client.consumer.Message; +import com.qcloud.cmq.client.exception.MQClientException; +import com.qcloud.cmq.client.exception.MQServerException; +import java.util.LinkedList; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StopWatch; + +/** + * @author lsj + * @date 2020/5/12 9:36 + */ +@Component +@Slf4j +public class CmqTcpHandler { + + private static final int DEFAULT_MSG_COUNT = 16; + private static final int DEFAULT_POLLING_WAIT_SECONDS = 5; + private static final int DEFAULT_REQUEST_TIMEOUT = 5000; + public static final String SECRET_ID = System.getProperty("secretId"); + public static final String SECRET_KEY = System.getProperty("secretKey"); + public static final String TCP_SERVER = "http://cmq-nameserver-sh.tencentcloudapi.com"; + + private final Consumer consumer; + + @Autowired + private JetGeo jetGeo; + + public CmqTcpHandler() { + this.consumer = initConsumer(); + } + + public Consumer initConsumer() { + Consumer consumer = new Consumer(); + consumer.setNameServerAddress(TCP_SERVER); + consumer.setSecretId(SECRET_ID); + consumer.setSecretKey(SECRET_KEY); + consumer.setBatchPullNumber(DEFAULT_MSG_COUNT); + consumer.setPollingWaitSeconds(DEFAULT_POLLING_WAIT_SECONDS); + consumer.setRequestTimeoutMS(DEFAULT_REQUEST_TIMEOUT); + consumer.start(); + return consumer; + } + + private void batchDeleteQueueMsg(String queueName, List<Long> receiptHandlerList) { + try { + consumer.batchDeleteMsg(queueName, receiptHandlerList, new BatchDeleteCallback() { + @Override + public void onSuccess(BatchDeleteResult batchDeleteResult) { + batchDeleteResult.getErrorList().forEach(item -> { + consumer.deleteMsg(queueName, item.getReceiptHandle()); + }); + } + + @Override + public void onException(Throwable throwable) { + receiptHandlerList.forEach(item -> { + consumer.deleteMsg(queueName, item); + }); + } + }); + } catch (MQClientException | MQServerException e) { + log.error("batchDeleteQueueMsg", e); + } + + } + + public List<Long> handleGatewayMessage(List<Message> messageList) { + List<Long> receiptHandlerList = new LinkedList<>(); + messageList.forEach(this::handleMessage); + return receiptHandlerList; + } + + public void handleMessage(Message message) { + JSONObject jsonObject = JSONUtil.parseObj(message.getData()); + JSONObject data = (JSONObject) jsonObject.get("data"); + GpsInfo gpsInfo = JSONUtil.toBean(data, GpsInfo.class); + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + GeoInfo geoInfo = jetGeo.getGeoInfo(gpsInfo.getLatitude(), gpsInfo.getLongitude()); + stopWatch.stop(); + System.out.printf("%s seconds %dms %s\n", gpsInfo.getDeviceId(), + stopWatch.getTotalTimeMillis(), geoInfo); + } + + public void start() { + String queueName = "gps-test"; + this.consumer.subscribe(queueName, (queue, list) -> handleGatewayMessage(list)); + } +} diff --git a/jetgeo-spring-boot-starter/src/test/java/com/ling5821/jetgeo/starter/model/GpsInfo.java b/jetgeo-spring-boot-starter/src/test/java/com/ling5821/jetgeo/starter/model/GpsInfo.java new file mode 100644 index 0000000..9feb5ef --- /dev/null +++ b/jetgeo-spring-boot-starter/src/test/java/com/ling5821/jetgeo/starter/model/GpsInfo.java @@ -0,0 +1,14 @@ +package com.ling5821.jetgeo.starter.model; + +import lombok.Data; + +/** + * @author lsj + * @date 2021/12/1 10:01 + */ +@Data +public class GpsInfo { + private String deviceId; + private Double longitude; + private Double latitude; +} diff --git a/jetgeo-spring-boot-starter/src/test/resources/application.yml b/jetgeo-spring-boot-starter/src/test/resources/application.yml new file mode 100644 index 0000000..91fc93c --- /dev/null +++ b/jetgeo-spring-boot-starter/src/test/resources/application.yml @@ -0,0 +1,3 @@ +jetgeo: + level: district + geo-data-parent-path: C:\geodata diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..ff01997 --- /dev/null +++ b/pom.xml @@ -0,0 +1,192 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + 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> + + <groupId>com.ling5821</groupId> + <artifactId>jetgeo</artifactId> + <packaging>pom</packaging> + <version>1.0.0-SNAPSHOT</version> + <modules> + <module>jetgeo-core</module> + <module>jetgeo-spring-boot-starter</module> + </modules> + + <name>jetgeo</name> + <url>https://github.com/linG5821/jetgeo.git</url> + <description>This is a library that implements coordinate inverse geocoding without calling other apis</description> + + <properties> + <java.version>1.8</java.version> + <project.encoding>UTF-8</project.encoding> + <maven.compiler.source>${java.version}</maven.compiler.source> + <maven.compiler.target>${java.version}</maven.compiler.target> + <project.build.sourceEncoding>${project.encoding}</project.build.sourceEncoding> + <project.reporting.outputEncoding>${project.encoding}</project.reporting.outputEncoding> + <google-s2.version>2.0.0</google-s2.version> + <hutool.version>5.7.16</hutool.version> + <lucene-core.version>4.0.0</lucene-core.version> + <lombok.version>1.18.22</lombok.version> + <spring-boot.version>2.4.12</spring-boot.version> + <junit.version>5.8.1</junit.version> + <skipTests>true</skipTests> + </properties> + + + <licenses> + <license> + <name>The Apache Software License, Version 2.0</name> + <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> + <distribution>repo,manual</distribution> + </license> + </licenses> + + <developers> + <developer> + <name>linG</name> + <email>ling5821@foxmail.com</email> + </developer> + </developers> + + <scm> + <connection>https://github.com/linG5821/jetgeo.git</connection> + <developerConnection>https://github.com/linG5821/jetgeo.git</developerConnection> + <url>https://github.com/linG5821/jetgeo</url> + <tag>${project.version}</tag> + </scm> + + <distributionManagement> + <repository> + <id>ossrh</id> + <name>maven_nexus_repo</name> + <url>https://oss.sonatype.org/service/local/staging/deploy/maven2</url> + </repository> + <snapshotRepository> + <id>ossrh</id> + <name>Central Repository OSSRH</name> + <url>https://oss.sonatype.org/content/repositories/snapshots</url> + </snapshotRepository> + </distributionManagement> + + <dependencyManagement> + <dependencies> + <dependency> + <groupId>com.ling5821</groupId> + <artifactId>jetgeo-core</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-dependencies</artifactId> + <version>${spring-boot.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + <dependency> + <groupId>com.google.geometry</groupId> + <artifactId>s2-geometry</artifactId> + <version>${google-s2.version}</version> + </dependency> + + <dependency> + <groupId>cn.hutool</groupId> + <artifactId>hutool-all</artifactId> + <version>${hutool.version}</version> + </dependency> + + <dependency> + <groupId>org.apache.lucene</groupId> + <artifactId>lucene-core</artifactId> + <version>${lucene-core.version}</version> + </dependency> + + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>${lombok.version}</version> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter</artifactId> + <version>${junit.version}</version> + <scope>test</scope> + </dependency> + </dependencies> + </dependencyManagement> + + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <version>3.2.0</version> + <configuration> + <encoding>${project.encoding}</encoding> + <charset>${project.encoding}</charset> + <docencoding>${project.encoding}</docencoding> + <doclint>none</doclint> + </configuration> + <executions> + <execution> + <id>attach-javadocs</id> + <goals> + <goal>jar</goal> + </goals> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-source-plugin</artifactId> + <version>3.2.1</version> + <executions> + <execution> + <id>attach-sources</id> + <goals> + <goal>jar</goal> + </goals> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-gpg-plugin</artifactId> + <version>1.6</version> + <executions> + <execution> + <id>sign-artifacts</id> + <phase>verify</phase> + <goals> + <goal>sign</goal> + </goals> + <configuration> + <!-- Prevent gpg from using pinentry programs --> + <gpgArguments> + <arg>--pinentry-mode</arg> + <arg>loopback</arg> + </gpgArguments> + </configuration> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>org.sonatype.plugins</groupId> + <artifactId>nexus-staging-maven-plugin</artifactId> + <version>1.6.7</version> + <extensions>true</extensions> + <configuration> + <serverId>ossrh</serverId> + <nexusUrl>https://oss.sonatype.org/</nexusUrl> + <autoReleaseAfterClose>true</autoReleaseAfterClose> + </configuration> + </plugin> + </plugins> + </build> + +</project> \ No newline at end of file