在彩云天气内部有全球范围成千上万个各种类型的观测站以及大量的多边形数据,支撑着彩云天气数据 API。

那么如何在这些海量的观测站中找到用户周边的站点及行政区划信息呢?

这个问题的解决方式有很多,对气象/地理专业的人士而言,采用 PostGIS 是相对熟悉的方式。 对于没有这类数据处理经验的传统 Web 开发人员而言,最简单的是使用支持地理索引的数据库,如 Redis, MongoDB 等。 当然也有 Tile38 这种专门针对地理数据的数据库。

在内部的迭代演进中,我们发现如果需要网络 IO 调用,则服务在瞬时高并发的场景下会变得不稳定,延迟会涨很多。 所以需要尽可能减少 IO 操作,这部分逻辑也就是放在内存里完成的。 随着业务的发展和迭代,我们发现一些过往的实践方式不太能满足我们的性能和数据准确性需求, 于是在 2021 年开始启动用 Go 重写地理数据查询功能,内部代号「掩体计划」。

在这个系列的文章中,我们将分享这个过程中所做的地理查询功能的实现方式。