主要用来查询一个坐标对应的城市信息,核心代码全放在一个 Java 文件内,测试程序额外提供了 HTTP API 服务接口
编写这套代码主要是因为数据库查询坐标信息太慢了,mysql 要 100 多 ms 查一个坐标,sql server 也要 50 多 ms ,群里有用户告诉我用未知开源库可达到 1ms 查询一次坐标点,数据库就不香了😂
如果不限制使用内存,单就检测一个坐标是否在一个几何面内,可以做到极高的性能,README 里面有讲到的 RTree 索引+射线法;不过我这个代码严格限制了使用内存大小,内存占用很低,性能相对低了很多。
内存占用低,性能优良,进行随机坐标点的查询单线程可以达到 17318 QPS
源码全部丢在根目录,没有建包名,可以双击那个 bat 文件直接进行编译和测试( mac 自己用 javac 编译运行),测试前需要有一个 geojson 文件,测试在初始化的时候会提醒输入一个 json 文件进行初始化,根据提示操作即可测试。
1
xiangyuecn OP 我的号应该是之前被降权了,发帖按钮和 append 按钮都没了,补两张图,用 http api 可以直接在我做的 ecahrts 地图页面进行绘制显示
|
2
sadfQED2 2022-06-30 09:36:00 +08:00 via Android 2
我们公司用的 google s2 算法,压测能到 5w+qps ,不过配置比你表格里的高很多
|
3
sadfQED2 2022-06-30 09:37:47 +08:00 via Android 1
数据库的话你可以试试 pg+postgis ,也是基于 rtree 的
|
4
xiangyuecn OP @sadfQED2 感谢分享,我学习研究研究😊
|
5
dearxe2v 2022-06-30 11:18:04 +08:00
```
> abc 123 输入的坐标格式不正确 > 117.286491 30.450399 查询 1 次共耗时: 0.56ms ,EnvelopeHitCount: 1 ,ExactHitCount: 1 ,IO: 0.41ms ,GeometryParse: 0.0067ms ,EnvelopeHitQuery: 0.076ms ,ExactHitQuery: 0.052ms 结果 Result: 1 条 结果[0] { "id": "34", "ext_path": "安徽省", "pid": "0", "deep": "0", "name": "安徽省", "geo_wkt": "POINT (117.330139 31.734559)" } > 123 45 查询 1 次共耗时: 1.20ms ,EnvelopeHitCount: 1 ,ExactHitCount: 1 ,IO: 0.39ms ,GeometryParse: 0.011ms ,EnvelopeHitQuery: 0.032ms ,ExactHitQuery: 0.75ms 结果 Result: 1 条 结果[0] { "id": "22", "ext_path": "吉林省", "pid": "0", "deep": "0", "name": "吉林省", "geo_wkt": "POINT (125.325802 43.896942)" } ``` 可以 |
6
coderwl 2022-06-30 14:38:05 +08:00 1
我司的能支持 10W+ qps , 不知道怎么实现的,回头了解一下
|