查询一个坐标在哪些省市区边界内,单核性能 1w+QPS,已开源 Java 代码

2022-06-30 09:13:34 +08:00
 xiangyuecn

github 地址: https://github.com/xiangyuecn/AreaCity-Query-Geometry

主要用来查询一个坐标对应的城市信息,核心代码全放在一个 Java 文件内,测试程序额外提供了 HTTP API 服务接口

编写这套代码主要是因为数据库查询坐标信息太慢了,mysql 要 100 多 ms 查一个坐标,sql server 也要 50 多 ms ,群里有用户告诉我用未知开源库可达到 1ms 查询一次坐标点,数据库就不香了😂

如果不限制使用内存,单就检测一个坐标是否在一个几何面内,可以做到极高的性能,README 里面有讲到的 RTree 索引+射线法;不过我这个代码严格限制了使用内存大小,内存占用很低,性能相对低了很多。


内存占用低,性能优良,进行随机坐标点的查询单线程可以达到 17318 QPS


源码全部丢在根目录,没有建包名,可以双击那个 bat 文件直接进行编译和测试( mac 自己用 javac 编译运行),测试前需要有一个 geojson 文件,测试在初始化的时候会提醒输入一个 json 文件进行初始化,根据提示操作即可测试。

2478 次点击
所在节点    程序员
6 条回复
xiangyuecn
2022-06-30 09:34:01 +08:00
我的号应该是之前被降权了,发帖按钮和 append 按钮都没了,补两张图,用 http api 可以直接在我做的 ecahrts 地图页面进行绘制显示



sadfQED2
2022-06-30 09:36:00 +08:00
我们公司用的 google s2 算法,压测能到 5w+qps ,不过配置比你表格里的高很多
sadfQED2
2022-06-30 09:37:47 +08:00
数据库的话你可以试试 pg+postgis ,也是基于 rtree 的
xiangyuecn
2022-06-30 09:41:50 +08:00
@sadfQED2 感谢分享,我学习研究研究😊
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)" }
```

可以
coderwl
2022-06-30 14:38:05 +08:00
我司的能支持 10W+ qps , 不知道怎么实现的,回头了解一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/863092

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX