Skip to content

Commit

Permalink
发布 1.0.230517 版本 : 修复Init_StoreInMemory不提供wkbs文件时无法初始化的问题,增加jar打包脚本
Browse files Browse the repository at this point in the history
  • Loading branch information
xiangyuecn committed May 17, 2023
1 parent 0150a2d commit a0c50f5
Show file tree
Hide file tree
Showing 7 changed files with 249 additions and 9 deletions.
7 changes: 5 additions & 2 deletions AreaCityQuery.java
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,7 @@ static public QueryResult Debug_ReadGeometryGridSplitsWKT(String wktKey, QueryRe
* 默认在内存中存储的是wkb格式数据(大幅减少内存占用),查询时会将wkb还原成图形对象,可通过设置 AreaCityQuery.SetInitStoreInMemoryUseObject=true 来关闭这一过程减少性能损耗,在内存中直接存储图形对象,但内存占用会增大一倍多。
*
* @param dataFilePath 数据文件路径(支持:*.wkbs、*.json),从这个文件读取数据;如果autoUseExistsWkbsFile=true并且saveWkbsFilePath文件存在时(已生成了结构化数据文件),可以不提供此参数
* @param saveWkbsFilePath 可选提供一个.wkbs后缀的文件路径:dataFile是wkbs时不可以提供;dataFile是geojson时,加载geojson解析的数据会自动生成此结构化数据文件
* @param saveWkbsFilePath 可选提供一个.wkbs后缀的文件路径:dataFile是wkbs时不可以提供;dataFile是geojson时,加载geojson解析的数据会自动生成此结构化数据文件;如果和dataFile都不提供wkbs文件时查询中将不允许获取WKT数据
* @param autoUseExistsWkbsFile 当传true时:如果检测到saveWkbsFilePath对应文件已成功生成过了,将直接使用这个wkbs文件作为dataFile(直接忽略dataFilePath参数);建议传true,这样只需要首次加载生成了结构文件,以后读取数据都非常快(数据更新时需删除wkbs文件)
*/
static public void Init_StoreInMemory(String dataFilePath, String saveWkbsFilePath, boolean autoUseExistsWkbsFile) {
Expand Down Expand Up @@ -547,6 +547,7 @@ static private void __Init(boolean autoUseExistsWkbsFile, String dataFilePath, S
}
}
InitInfo.DataFromWkbsFile=IsWkbsFilePath(dataFilePath);
InitInfo.HasWkbsFile=WkbsFilePath.length()>0;
InitInfo.OtherInfo.put("dataFilePath", dataFilePath);
InitInfo.OtherInfo.put("saveWkbsFilePath", saveWkbsFilePath);

Expand Down Expand Up @@ -826,7 +827,7 @@ public String Exec(Object val) throws Exception {
}

byte[] wkb=null;
String wkbPos=null;//编号:parent:sub 数据存储位置
String wkbPos=lineNo+":0:0";//编号:parent:sub 数据存储位置
if(saveWkbsFile!=null) {//需要保存到文件
synchronized (saveWkbsFile) {
wkbPos=(saveWkbsFileLength[0]+1)+"";//+1 换行符
Expand Down Expand Up @@ -1399,6 +1400,8 @@ static public class QueryInitInfo {

/**初始化时的数据是否是从wkbs结构化数据文件中读取;如果为false可能代表还未生成过wkbs文件,首次初始化可能会很慢**/
public boolean DataFromWkbsFile;
/**初始化时是否使用或保存了wkbs结构化数据文件,没有wkbs文件时查询中不允许获取WKT数据**/
public boolean HasWkbsFile;
/**初始化失败时的错误消息**/
public String ErrMsg="";

Expand Down
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

[](?)

你可以只copy `AreaCityQuery.java` 文件到你的项目中使用(建好package目录或者修改一下package),项目中引入`jts库`,就能使用 `AreaCityQuery` 中的所有查找功能了。也可以clone整个项目代码双击 `编译和运行Test.java直接测试.bat` 即可直接运行测试(macOS、linux用终端运行`.sh`的)。
你可以只copy `AreaCityQuery.java` 文件到你的项目中使用(建好package目录或者修改一下package),项目中引入`jts库`,就能使用 `AreaCityQuery` 中的所有查找功能了。也可以clone整个项目代码双击 `编译和运行Test.java直接测试.bat` 即可直接运行测试(macOS、linux用终端运行`.sh`的)`scripts`里面有生成jar包的命令行脚本

**API和图形界面**:本工具已自带了一个HTTP API服务,运行测试然后通过菜单启动此服务,然后就可以直接在浏览器上访问这些接口;此API接口可以直接在 [ECharts Map四级下钻在线测试和预览](https://xiangyuecn.gitee.io/areacity-jsspider-statsgov/assets/geo-echarts.html) 页面的`自定义数据源`中进行调用测试,页面会立即绘制查询出来的边界图形。

Expand Down Expand Up @@ -123,6 +123,9 @@ System.out.println(res1+"\n"+res2+"\n"+res3+"\n"+res4);
//****更多功能方法,请阅读 AreaCityQuery.java 源码****
```

### 附:生成jar包
`scripts`目录里面有生成jar包的命令行脚本,双击`生成jar包.bat`即可将源码编译成jar文件(macOS、linux用终端运行`.sh`的);脚本支持生成`带Test.java控制台程序`的、和`不带控制台程序`的两种jar,前者可以启动运行,后者可放到其他项目中用Java代码调用。

### 附:Java调用时如何同时开启多个实例
同一个Java进程内,一个`AreaCityQuery`类只能初始化成一个实例(多开多个Java进程本身就是多个实例,无需特别处理)。

Expand Down
19 changes: 17 additions & 2 deletions Test.java
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,14 @@ static void Init(boolean storeInWkbsFile) throws Exception {
if(jsonFile.length()>0) {
initDataFile=new File(jsonFile).getAbsolutePath();
initSaveWkbsFile=initDataFile+".wkbs";
if(!storeInWkbsFile) {
System.out.println("用json文件进行Init_StoreInMemory初始化时,可选提供一个.wkbs后缀的文件路径,初始化时会自动生成此文件,如果不提供将不能查询WKT数据;直接回车提供,输入n不提供:");
System.out.print("> ");
String txt=ReadIn();
if(txt.toLowerCase().equals("n")) {
initSaveWkbsFile="";
}
}
} else if(wkbsFile.length()>0) {
initDataFile=new File(wkbsFile).getAbsolutePath();
initSaveWkbsFile="";
Expand All @@ -200,8 +208,10 @@ public Boolean Exec(QueryInitInfo info) throws Exception {
if(logTime==0) {
if(info.DataFromWkbsFile) {
System.out.println("正在从wkbs结构化数据文件中快速读取数据...");
} else {
} else if(info.HasWkbsFile){
System.out.println("首次运行,正在生成wkbs结构化数据文件,速度可能会比较慢...");
} else {
System.out.println("正在从json文件中读取数据,未提供wkbs文件,速度可能会比较慢...");
}
}
if(info.CurrentLine_No!=0) {
Expand Down Expand Up @@ -309,7 +319,12 @@ && ResultHas(res, "河南省\"")
QueryResult res=new QueryResult();
for(int i=0;i<loop;i++) {
res.Result.clear();//清除一下上次的结果,只保留统计
res=AreaCityQuery.ReadWKT_FromWkbsFile("plygon_wkt", res, new Func<String, Boolean>() {
String wktKey="plygon_wkt";
if(!AreaCityQuery.GetInitInfo().HasWkbsFile) {
if(i==0)System.out.println("【注意】初始化时如果没有提供wkbs文件,不能查询wkt数据");
wktKey="";
}
res=AreaCityQuery.ReadWKT_FromWkbsFile(wktKey, res, new Func<String, Boolean>() {
@Override
public Boolean Exec(String prop) throws Exception {
return prop.contains("北京市 朝阳区\"")
Expand Down
120 changes: 120 additions & 0 deletions scripts/生成jar包.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
@echo off
::在Windows系统中双击运行这个文件,自动完成java文件编译和打包成jar

for %%i in (%cd%) do set dir=%%~ni
if not "%dir%"=="scripts" (
echo 请到scripts目录中运行本脚本。
goto Pause
)

:Run
cls
cd ../
setlocal enabledelayedexpansion

::修改这里指定需要使用的JDK(\结尾bin目录完整路径),否则将使用已安装的默认JDK
set jdkBinDir=
::set jdkBinDir=D:\xxxx\jdk-18_windows-x64_bin\jdk-18.0.2.1\bin\

if "%jdkBinDir%"=="" (
echo 正在读取JDK版本(如需指定JDK为特定版本或目录,请修改本bat文件内jdkBinDir为JDK bin目录):
) else (
echo 正在读取JDK(%jdkBinDir%)版本:
)


%jdkBinDir%javac -version
if errorlevel 1 (
echo 需要安装JDK才能编译java文件
goto Pause
)

:JarN
echo.
echo 请选择需要的生成操作:
echo 1. 仅生成依赖jar文件(放到其他项目中Java代码调用,不含Test.java)
echo 2. 生成可运行jar文件(包含Test.java控制台程序)
echo 3. 退出
set step=
set /p step=请输入序号:
echo.
if "%step%"=="1" goto Jar1
if "%step%"=="2" goto Jar2
if "%step%"=="3" goto Pause
echo 序号无效!请重新输入
goto JarN

:Clazz
echo 编译中...
%jdkBinDir%javac -encoding utf-8 -cp "./*" %Clazz_Files%
if errorlevel 1 (
echo java文件编译失败
goto JarN
)

set dir=target\classes\com\github\xiangyuecn\areacity\query
if exist target\classes rd /S /Q target\classes > nul
md %dir%
move *.class %dir% > nul

echo 编译完成,正在生成jar...
goto %Clazz_End%

:Jar1
set Clazz_Files=AreaCityQuery.java
set Clazz_End=Jar1_1
goto Clazz
:Jar1_1

set dir=target\jarLib\
if not exist %dir% md %dir%
set jarPath=%dir%areacity-query-geometry.lib.jar

%jdkBinDir%jar cf %jarPath% -C target/classes/ com
if errorlevel 1 (
echo 生成jar失败
) else (
copy jts-core-*.jar %dir% > nul
echo 已生成jar,文件在源码根目录:%jarPath%,请copy这个jar + jts-core-xxx.jar 到你的项目中使用。
)
echo.
pause
goto JarN

:Jar2
set Clazz_Files=*.java
set Clazz_End=Jar2_1
goto Clazz
:Jar2_1

set dir=target\jarConsole\
set dir_libs=%dir%libs\
if not exist %dir% md %dir%
if not exist %dir_libs% md %dir_libs%
set jarPath=%dir%areacity-query-geometry.console.jar

copy *.jar %dir_libs% > nul
set jarArr=
for /f %%a in ('dir /b "%dir_libs%"') do (set jarArr=!jarArr! libs/%%a)
echo Class-Path:%jarArr%

set MANIFEST=target\classes\MANIFEST.MF
echo Manifest-Version: 1.0>%MANIFEST%
echo Class-Path:%jarArr%>>%MANIFEST%
echo Main-Class: com.github.xiangyuecn.areacity.query.Test>>%MANIFEST%

%jdkBinDir%jar cfm %jarPath% target/classes/MANIFEST.MF -C target/classes/ com
if errorlevel 1 (
echo 已生成jar失败
) else (
echo 已生成jar,文件在源码根目录:%jarPath%,libs内已包含依赖的其他jar文件,使用时请全部复制。
echo 请到这个文件夹里面后,执行命令运行这个jar:
echo java -jar areacity-query-geometry.console.jar
)
echo.
pause
goto JarN

:Pause
pause
:End
97 changes: 97 additions & 0 deletions scripts/生成jar包.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
#!/usr/bin/env bash
#在Linux、macOS系统终端中运行这个文件,自动完成java文件编译和打包成jar

dir=`pwd`; dir=`basename $dir`;
if [ "$dir" != "scripts" ]; then echo "请到scripts目录中运行本脚本。"; exit; fi

clear
cd ../

#修改这里指定需要使用的JDK(/结尾bin目录完整路径),否则将使用已安装的默认JDK
jdkBinDir=""
#jdkBinDir="/home/download/jdk-19.0.1/bin/"

if [ "$jdkBinDir" == "" ]; then
echo "正在读取JDK版本(如需指定JDK为特定版本或目录,请修改本sh文件内jdkBinDir为JDK bin目录):"
else
echo "正在读取JDK(${jdkBinDir})版本:"
fi
function err(){ echo -e "\e[31m$1\e[0m"; }

${jdkBinDir}javac -version
[ ! $? -eq 0 ] && { err "需要安装JDK才能编译java文件"; exit; }


function JarN(){
echo ""
echo "请选择需要的生成操作:"
echo " 1. 仅生成依赖jar文件(放到其他项目中Java代码调用,不含Test.java)"
echo " 2. 生成可运行jar文件(包含Test.java控制台程序)"
echo " 3. 退出"
read -p "请输入序号:" step
echo ""
if [ "$step" == 1 ]; then Jar1;
elif [ "$step" == 2 ]; then Jar2;
elif [ "$step" == 3 ]; then exit;
else echo "序号无效!请重新输入"; fi

read -s -n1 -p "按任意键继续...";
echo ""
JarN;
}

function Clazz(){
echo 编译中...
${jdkBinDir}javac -encoding utf-8 -cp "./*" $1
[ ! $? -eq 0 ] && { err "java文件编译失败"; return 1; }

dir="target/classes/com/github/xiangyuecn/areacity/query"
if [ -e $dir ]; then rm -r target/classes > /dev/null 2>&1; fi
mkdir -p $dir
mv *.class $dir

echo 编译完成,正在生成jar...
}

function Jar1(){
Clazz AreaCityQuery.java
[ ! $? -eq 0 ] && { return 1; }

dir="target/jarLib/"
if [ ! -e $dir ]; then mkdir -p $dir; fi
jarPath="${dir}areacity-query-geometry.lib.jar"

${jdkBinDir}jar cf $jarPath -C target/classes/ com
[ ! $? -eq 0 ] && { err "生成jar失败"; return 1; }
cp jts-core-*.jar $dir
echo "已生成jar,文件在源码根目录:${jarPath},请copy这个jar + jts-core-xxx.jar 到你的项目中使用。"
}

function Jar2(){
Clazz "*.java"
[ ! $? -eq 0 ] && { return 1; }

dir=target/jarConsole/
dir_libs=${dir}libs/
[ ! -e $dir ] && { mkdir -p $dir; }
[ ! -e $dir_libs ] && { mkdir -p $dir_libs; }
jarPath=${dir}areacity-query-geometry.console.jar

cp *.jar $dir_libs
jarArr=""
for a in `ls $dir_libs`; do jarArr="${jarArr} libs/${a}"; done
echo Class-Path: $jarArr

MANIFEST=target/classes/MANIFEST.MF
echo Manifest-Version: 1.0>$MANIFEST
echo Class-Path:${jarArr}>>$MANIFEST
echo Main-Class: com.github.xiangyuecn.areacity.query.Test>>$MANIFEST

${jdkBinDir}jar cfm $jarPath target/classes/MANIFEST.MF -C target/classes/ com
[ ! $? -eq 0 ] && { err "生成jar失败"; return 1; }
echo "已生成jar,文件在源码根目录:${jarPath},libs内已包含依赖的其他jar文件,使用时请全部复制。"
echo "请到这个文件夹里面后,执行命令运行这个jar:"
echo " java -jar areacity-query-geometry.console.jar"
}

JarN;
5 changes: 3 additions & 2 deletions 编译和运行Test.java直接测试.bat
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
@echo off
::在Windows系统中双击运行这个文件,自动完成java文件编译和运行

:Run
cls
Expand All @@ -20,7 +21,7 @@ if errorlevel 1 (
goto Pause
)

%jdkBinDir%javac -encoding utf-8 -cp ./*.jar *.java
%jdkBinDir%javac -encoding utf-8 -cp "./*" *.java
if errorlevel 1 (
echo java文件编译失败
goto Pause
Expand All @@ -35,7 +36,7 @@ if not exist %dir% (
move *.class %dir% > nul

echo java -Xmx300m Test -cmd 已限制java最大允许使用300M内存
%jdkBinDir%java -cp ./;./* -Xmx300m com.github.xiangyuecn.areacity.query.Test -cmd
%jdkBinDir%java -cp "./;./*" -Xmx300m com.github.xiangyuecn.areacity.query.Test -cmd

:Pause
pause
Expand Down
5 changes: 3 additions & 2 deletions 编译和运行Test.java直接测试.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/usr/bin/env bash
#在Linux、macOS系统终端中运行这个文件,自动完成java文件编译和运行

clear

Expand All @@ -16,7 +17,7 @@ function err(){ echo -e "\e[31m$1\e[0m"; }
${jdkBinDir}javac -version
[ ! $? -eq 0 ] && { err "需要安装JDK才能编译运行java文件"; exit; }

${jdkBinDir}javac -encoding utf-8 -cp ./*.jar *.java
${jdkBinDir}javac -encoding utf-8 -cp "./*" *.java
[ ! $? -eq 0 ] && { err "java文件编译失败"; exit; }

dir="com/github/xiangyuecn/areacity/query"
Expand All @@ -28,7 +29,7 @@ fi
mv *.class ${dir}

echo "java -Xmx300m Test -cmd 已限制java最大允许使用300M内存"
${jdkBinDir}java -cp ./:./* -Xmx300m com.github.xiangyuecn.areacity.query.Test -cmd
${jdkBinDir}java -cp "./:./*" -Xmx300m com.github.xiangyuecn.areacity.query.Test -cmd



0 comments on commit a0c50f5

Please sign in to comment.