V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
xiangyuecn
V2EX  ›  程序员

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

  •  
  •   xiangyuecn ·
    xiangyuecn · 2022-06-30 09:13:34 +08:00 · 2478 次点击
    这是一个创建于 911 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 文件进行初始化,根据提示操作即可测试。

    xiangyuecn
        1
    xiangyuecn  
    OP
       2022-06-30 09:34:01 +08:00
    我的号应该是之前被降权了,发帖按钮和 append 按钮都没了,补两张图,用 http api 可以直接在我做的 ecahrts 地图页面进行绘制显示



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

    可以
    coderwl
        6
    coderwl  
       2022-06-30 14:38:05 +08:00   ❤️ 1
    我司的能支持 10W+ qps , 不知道怎么实现的,回头了解一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5784 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 01:57 · PVG 09:57 · LAX 17:57 · JFK 20:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.