关于后端:从区划边界geojson中查询经纬度坐标对应的省市区县乡镇名称开源Java工具内存占用低高性能

5次阅读

共计 3479 个字符,预计需要花费 9 分钟才能阅读完成。

坐标边界查问工具:AreaCity-Query-Geometry

本工具外围性能:应用 jts 库省市区县乡镇边界数据 (AreaCity-JsSpider-StatsGov 开源库)或geojson 边界数据 文件中查找出和任意点、线、面有相交的矢量边界,内存占用低,性能低劣。

GitHub 地址:https://github.com/xiangyuecn/AreaCity-Query-Geometry
Gitee 镜像库:https://gitee.com/xiangyuecn/AreaCity-Query-Geometry

次要个性:

  • 查问一个坐标点对应的城市信息;
  • 查问一条门路通过的所有城市;
  • 查问一个矢量范畴笼罩的所有城市;
  • 查问一个城市或下一级所有边界数据(WKT 格局);
  • 反对通过 HTTP API 服务进行查问调用;
  • 反对通过 Java 代码进行查问调用;
  • 源码简略,包含测试 bat 脚本共 5 个文件,无需 IDE 即可批改和运行,copy 即用。

能够只 copy AreaCityQuery.java 文件到我的项目中应用,我的项目中引入 jts 库,就能应用 AreaCityQuery 中的所有查找性能了。也能够 clone 整个我的项目代码双击 编译和运行 Test.java 间接测试.bat 即可间接运行测试。

API 和图形界面 :此工具自带了一个 HTTP API 服务,运行测试而后通过菜单启动此服务,而后就能够间接在浏览器上拜访这些接口;此 API 接口能够间接在 ECharts Map 四级下钻在线测试和预览 页面的 自定义数据源 中进行调用测试,页面会立刻绘制查问进去的边界图形。

效果图:

HTTP API 图形界面:

控制台运行:

性能测试数据

测试数据源:AreaCity-JsSpider-StatsGov 开源库 2021.220321.220428 版本下载的 ok_geo.csv 文件按省市区导出成不同的 geojson 文件。

测试采纳开启多线程进行随机坐标点的查问(Test.java 控制台 5 号菜单),测试机器配置:8 核 2.20GHz CPU,SSD 硬盘。

测试一:Init_StoreInWkbsFile 内存占用很低(性能受 IO 限度)

数据源 文件大小 数据量 内存占用 7 核 QPS 单核 QPS 单次查问耗时
省市区三级 176MB 3632 条 41MB 6212 887 1.13ms
仅区级 107MB 3208 条 24MB 13818 1974 0.51ms
仅省级 20MB 34 条 4MB 19832 2833 0.35ms

Init_StoreInWkbsFile:用加载数据到结构化数据文件的模式进行初始化,举荐应用本办法初始化,边界图形数据存入结构化数据文件中,内存占用很低,查问时会重复读取文件对应内容,查问性能耗费次要在 IO 上,IO 性能极高问题不大。

测试二:Init_StoreInMemory 内存占用和 json 文件差不多大(性能奔放)

数据源 文件大小 数据量 内存占用 7 核 QPS 单核 QPS 单次查问耗时
省市区三级 176MB 3632 条 161MB 77242 11034 0.091ms
仅区级 107MB 3208 条 96MB 121228 17318 0.058ms
仅省级 20MB 34 条 18MB 465940 66562 0.015ms

Init_StoreInMemory:用加载数据到内存的模式进行初始化,边界图形数据存入内存中,内存占用和 json 数据文件大小差不多大,查问性能极高;另外可通过设置 AreaCityQuery.SetInitStoreInMemoryUseObject=true 来进一步晋升性能,但内存占用会增大一倍多,省市区三级单核可达到 15000 QPS。

参考:数据库查问测试比照

数据源 数据量 查问坐标 MySQL 单次查问耗时 SQL Server 单次查问耗时
省市区三级 3632 条 深圳 - 龙华区 163ms 25ms
省市区三级 3632 条 北京 - 房山区 173ms 47ms

数据库查问坐标点:POINT(114.044346 22.691963) 深圳市 龙华区;POINT(116.055588 39.709385) 北京市 房山区(查问受内蒙 envelope 烦扰影响性能)

查问坐标对应的省市区县乡镇名称

应用此工具进行坐标省市区县乡镇查问,先要筹备一个省市区县乡镇的边界 geojson 数据文件。

数据中有哪一级的边界就能查问出哪一级的名称;比方你只有区级的数据,那么给一个坐标就能查问出此坐标所在的区县名称(需另外查找出下级的省市名称);如果有省市区三级的边界,那一次性就能查问出省市区三级的名称,如果有乡镇的边界,就能查问出乡镇这级的名称。

步骤一:筹备好省市区县乡镇边界的 geojson 文件

如果你没有边界 json 文件,能够按以下步骤取得最新的全国省市区县乡镇边界数据 json 文件:

  1. 到开源库下载省市区边界数据 ok_geo.csv 文件: https://github.com/xiangyuecn…(github 可换成 gitee);
  2. 下载开源库外面的AreaCity-Geo 格局转换工具软件
  3. 关上转换工具软件,抉择ok_geo.csv,而后导出成 geojson 文件即可(默认会导出全国的省级数据,通过填写不同城市名前缀能够导出不同城市)。

如果你有多个 geojson 文件,须要合并成一个才行,能够通过下面下载的 AreaCity-Geo 格局转换工具软件 中的 高级性能GeoJSON 多个文件合并成一个文件 来合并。

步骤二:运行测试程序进行初始化

双击 编译和运行 Test.java 间接测试.bat 运行测试控制台程序;依据控制台菜单命令进行初始化,有两种初始化形式,轻易哪种都行:

  1. Init_StoreInWkbsFile:内存占用很低,但查问速度绝对 StoreInMemory 慢很多,但也很快的,举荐用此办法初始化;
  2. Init_StoreInMemory:内存占用大一点,但查问速度十分快。

抉择了初始形式后会要求填写 geojson 文件门路,填写上一步筹备好的 json 文件残缺门路即可;或者间接将 json 文件放到程序根目录,会主动初始化。

步骤三:查问坐标取得省市区名称

初始化实现后,所有的菜单都能够应用了,能够间接在控制台中应用对应的菜单进入菜单查问性能,而后输出坐标查问即可。

倡议应用 HTTP API 来进行查问,在菜单中启动好 HTTP 服务后,就能通过网址拜访查问接口,或者间接应用在线的可视化界面进行查问操作:

附:通过 Java 代码进行查问

// 先初始化,全局只会初始化一次,每次查问前都调用即可(查问会在初始化实现后进行),两种初始化形式依据本人业务状况二选一
// 首次初始化会从.json 或.geojson 文件中读取边界图形数据,速度比较慢,会主动生成.wkbs 结尾的结构化文件,下次初始化就很快了
AreaCityQuery.Init_StoreInWkbsFile("geojson 文件门路", "geojson 文件门路.wkbs", true);
//AreaCityQuery.Init_StoreInMemory("geojson 文件门路", "geojson 文件门路.wkbs", true);

//AreaCityQuery.OnInitProgress=(initInfo)->{...} // 初始化过程中的回调,能够绑定一个函数,接管初始化进度信息

// 查问蕴含一个坐标点的所有边界图形的属性数据,可通过 res 参数让查问额定返回 wkt 格局边界数据
QueryResult res1=AreaCityQuery.QueryPoint(114.044346, 22.691963, null, null);

// 查问和一个图形(点、线、面)有交点的所有边界图形的属性数据,可通过 res 参数让查问额定返回 wkt 格局边界数据
Geometry geom=new WKTReader(AreaCityQuery.Factory).read("LINESTRING(114.233963 30.546038, 114.468109 30.544264)");
QueryResult res2=AreaCityQuery.QueryGeometry(geom, null, null);

// 读取省市区的边界数据 wkt 格局,这个例子会筛选出武汉市所有区县
QueryResult res3=AreaCityQuery.ReadWKT_FromWkbsFile("wkt_polygon", null, (prop)->{return prop.contains("武汉市");}, null);


System.out.println(res1+"\n"+res2+"\n"+res3);

【END】

正文完
 0