共计 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 文件:
- 到开源库下载省市区边界数据
ok_geo.csv
文件: https://github.com/xiangyuecn…(github 可换成 gitee); - 下载开源库外面的
AreaCity-Geo 格局转换工具软件
; - 关上转换工具软件,抉择
ok_geo.csv
,而后导出成 geojson 文件即可(默认会导出全国的省级数据,通过填写不同城市名前缀能够导出不同城市)。
如果你有多个 geojson 文件,须要合并成一个才行,能够通过下面下载的
AreaCity-Geo 格局转换工具软件
中的高级性能
–GeoJSON 多个文件合并成一个文件
来合并。
步骤二:运行测试程序进行初始化
双击 编译和运行 Test.java 间接测试.bat
运行测试控制台程序;依据控制台菜单命令进行初始化,有两种初始化形式,轻易哪种都行:
Init_StoreInWkbsFile
:内存占用很低,但查问速度绝对 StoreInMemory 慢很多,但也很快的,举荐用此办法初始化;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】