彩云天气地理查询优化(2): 行政区划查询

本文转载起《彩云天气地理查询优化(2): 行政区划查询》


在彩云天气 App 和 API 里可以获取到当前经纬度的气象预警信息,比如「大风蓝色预警」。 不同国家地区的预警发布规则不一样,在中国是按照行政区划层级来发布的,其中最小到县级行政区。 所以在实现中,需要将经纬度转换成行政区划层级信息,再查找相关的预警信息。 在过去几年中,这部分模块经历了多次重构和完善,在此分享下每个版本的实现方式。

Read more

tzfpy Rust 重写🎉

书接上文:

经过一个周末的各种折腾,终于用 Rust 实现了 tzf 的功能,代码在 ringsaturn/tzf-rs

又用了晚上跑了多次 CI 将 Python 移植也重写出来了 ringsaturn/tzfpy

tzfpy 只要安装 >= 0.11.0 版本的就是用纯 Rust 实现的,在这个版本号之前都是 Python+CGO 实现的。 API 参数和之前一样,没有变化,但是索引命中的时候只需要 3~4 微妙,之前 Python+Go 需要 16 微妙。 最慢的单次查询 300 多微妙,timezonefinder(用 C 实现的多边形算法版本) 最慢的时候会有 1000 多微妙。

Read more

tzf 预览图制作

上周花了点时间学习下 mbtiles 文件格式,顺手给 tzf 项目制作了一个 social preview media:

制作流程很简单:

# 根据 GeoJSON 制作 .mbtiles 文件
tippecanoe -o timezone.mbtiles -l Timezons -z7 combined-with-oceans.fmt.json
mbview ./timezone.mbtiles

网页里调整合适的角度,截图,调整下图片的分辨率即可。

Read more

使用地图瓦片索引实现地理聚合

在处理大规模的散点数据时,有时候我们需要提供一个只读的查询 API 在地图上做可视化。 当数据量过大,比如百万这个量级,将数据一口气全部返回给前端在浏览器上处理是不太合适的。 应当在后端服务内完成一定聚合,将聚合后的搜索返回给前端。 这里介绍下在 Go 中如何使用 MongoDB + Tile 索引实现这件事。

Read more

用 Go 编写 Python 扩展

tzfpy 是 tzf 的 Python binding。 如果只是本地可用,Go 代码加上 CGO 扩展编译成 .so 文件就能用了。 不过要做成发布到 PyPI 上在其他地方能直接安装的 wheel 是有些曲折的,看 CI 失败的记录就挺明显的。

Read more