mcpField
P
postgis-skill

postgis-skill

github.com/postgis数据与数据库2.3k199 次安装4 天前更新
代码仓库

关于 postgis-skill

面向 PostGIS 开发者的技能,结合空间 SQL 建议与代码风格、文档、索引、迁移和调试实践,侧重可维护的数据库工作。

主要功能

  1. 01SQL 风格与文档规范
  2. 02大型表索引建议
  3. 03幂等 SQL 与回滚迁移
  4. 04空间查询和投影建议
  5. 05PostGIS 调试与栅格指导

适用场景

  1. 01编写易维护的 SQL 文件
  2. 02规划大型表的索引
  3. 03创建或回滚数据库迁移
  4. 04优化空间查询性能

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/postgis/postgis --skill postgis-skill

安装后在 Claude Code 中输入/postgis-skill确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

.weblate
administration.xml
bnf-wkb.txt
bnf-wkt.txt
database_tuning.xml
developer.md
doxygen.cfg.in
extras_historytable.xml
extras_topology.xml
extras.xml
geography.txt
html/images/
generator.c
Makefile.in
st_azimuthmath.sql
styles.c
styles.h
html/images/static/
apple.txt
html/images/wkt/
cg_3dalphawrapping01.wkt
cg_3dalphawrapping02.wkt
cg_approxconvexpartition01.wkt
cg_greeneapproxconvexpartition01.wkt
cg_optimalconvexpartition01.wkt
cg_simplify00.wkt
cg_simplify01.wkt
cg_simplify02.wkt
cg_straightskeletonpartition01.wkt
cg_visibility01.wkt
cg_visibility02.wkt
cg_visibility03.wkt
cg_ymonotonepartition01.wkt

详细介绍

文档

  • 确保每条创建语句或 CTE 前都有描述性注释 --。
  • 编写足够的注释,以便将来能推断出需求是什么,避免兜圈子。
  • 每项功能附近都需要有全面且最新的文档。

风格

  • PostGIS 函数的拼写遵循手册中的写法(st_segmentize -> ST_Segmentize)。
  • 除非另有要求,否则 SQL 使用小写。
  • 数据库和图层中的值应尽可能使用绝对值:存储“生日”或“建造日期”,而不是“年龄”。
  • 代码中不要混用制表符和空格。
  • 在逻辑区块之间添加空行。
  • 代码格式要整洁且一致。
  • 几何列命名为 geom;地理列命名为 geog。

索引

  • 创建大型表以供临时查询使用时,为所有列创建 brin 索引。
  • 如果缓存表有主键,在同一索引的 including 中添加值有助于加快查找。

调试

  • 面向开发者的错误消息应比“500 Internal server error”更有帮助。
  • 不要用荒唐的回退值(例如 lat/lon=0)来填补空缺;应让其余代码妥善处理数据缺失,并告知用户。
  • SQL 文件应具备幂等性:先执行 drop table if exists,再执行 create table as;添加一些注释,帮助人们更快理解查询。
  • 创建新的迁移时,同时创建“up”和“down/rollback”迁移,便于迭代。
  • 检查 select postgis_full_version();,确认所有升级都已成功完成。
  • 不要在一个 SQL 文件中运行另一个 SQL 文件——这很快就会因相对文件路径变得一团糟。

栅格

  • 不要在文件系统上使用 GDAL。将数据导入数据库,并在那里处理。

SQL 注意事项

  • sum(case when A then 1 else 0 end) 其实就是 count() filter (where A)
  • row_number() ... = 1 很可能可以改写为 order by + limit 1(可能还会用到 distinct on 或 lateral)
  • exists(select 1 from ...) 其实就是 exists(select from ...)
  • tags ->> 'key' = 'value' 其实就是 tags @> '{"key": "value"}——后者对索引更快
  • 不能只创建有序表,然后在扫描时不使用 order by 却依赖其保持有序

PostGIS 注意事项

  • 除非有要求,否则不要使用 geometry typmod(例如 geometry(multilinestring, 4326))——改用普通的 geometry 或 geography。这样可以避免 ST_Multi 带来的杂乱,以及通过 ST_SetSRID 产生的错误。
  • ST_UnaryUnion(ST_Collect(geom)) 就是 ST_Union(geom)
  • ST_Buffer(geom, 0) 应改为 ST_MakeValid(geom)
  • 要启用 knn gist,应将 select min(ST_Distance(..)) 改为 select ST_Distance() ... order by a <-> b limit 1
  • order by ST_Distance(c.geog, t.geog) 应改为 order by c.geog <-> t.geog
  • ST_UnaryUnion 表明你可能做错了什么
  • ST_MakeValid 表明你在上一步可能做错了什么
  • 调用 ST_SetSRID 时要格外留心:检查输入数据的实际投影,确认能否在输入时正确设置(ST_GeomFromGeoJSON、EWKT 格式的 SRID=4326;POINT(...、EWKB 都支持这样做)。还要检查是否应该改用 ST_Transform。
  • 查找点与多边形之间的关系时,优先使用 ST_Intersects,而不是其他拓扑谓词
  • 通过遍历栅格或网格生成复杂几何时,可以考虑使用 ST_Simplify(geom, 0)
  • 要生成大小可预测的邻域,请使用 ST_ClusterKMeans,将 k 设为 2,并将 max_radius 设为所需距离。
  • 使用 ST_AsEWKB 而非 ST_AsWKB 获取二进制表示,以保留 SRID。
  • 选择投影: 当输入或输出为经纬度,且坐标值要显示给用户时,使用 SRID=4326(2D 经纬度)。 当输出要显示在 Web 地图上、用于 ST_AsMVT,或要执行短距离的 2D KNN 查询时,使用 SRID=3857(2D 球面墨卡托)。 执行内部计算、视线分析、聚类以及跨越日期变更线的平均值计算时,使用 SRID=4978(3D XYZ)。注意:只能使用支持 3D 的操作;在对此投影执行 ST_Transform 之前,先对 2D CRS 数据调用 ST_Force3DZ。
  • 不要使用 ST_Hexagon / ST_HexagonGrid,改用 h3 扩展。
  • 如果确定数据将以二进制形式导出、压缩为 gzip 并传输,可以在精度已知时考虑使用 ST_QuantizeCoordinates。

评论

支持 Markdown