关于 postgis
面向 PostGIS 开发者的空间 SQL 技能,涵盖几何处理、坐标系选择和查询优化,提供处理地理空间数据的实践建议。
主要功能
- 01PostGIS 函数命名规范
- 02几何与地理列命名建议
- 03投影和 SRID 选择建议
- 04空间查询与索引建议
- 05栅格数据处理指导
适用场景
- 01编写空间 SQL 查询
- 02为地图输出选择投影
- 03排查 PostGIS 扩展行为
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ postgis/ postgis --skill postgis安装后在 Claude Code 中输入/postgis确认已加载。
详细介绍
命名
- PostGIS 函数的拼写应与手册中的写法一致(
st_segmentize→ST_Segmentize)。 - 几何列称为
geom;地理列称为geog。
检查
- 调试扩展行为时,检查
select postgis_full_version();,确认已安装的 PostGIS、GEOS、PROJ、GDAL 和 SFCGAL 版本。
栅格
- 不要在文件系统上使用 GDAL。将数据导入数据库后,在数据库中处理。
注意事项
- 除非另有要求,否则不要使用 geometry typmod(例如
geometry(multilinestring, 4326)),改用普通的geometry或geography。这样可以避免ST_Multi带来的冗余,以及ST_SetSRID引发的错误。 ST_UnaryUnion(ST_Collect(geom))就是ST_Union(geom)。- 必须修复无效几何时,应使用
ST_MakeValid(geom)而非ST_Buffer(geom, 0),但应优先从上游修复无效几何的来源。 - 应将
select min(ST_Distance(..))改为select ST_Distance() ... order by a <-> b limit 1,以启用 knn gist。 - 应将
order by ST_Distance(c.geog, t.geog)改为order by c.geog <-> t.geog。 - 使用
ST_UnaryUnion往往说明操作有误。 - 需要使用
ST_MakeValid往往说明前一步操作有误。 - 调用
ST_SetSRID时务必格外留意:先检查输入数据的实际投影。如果源格式支持,应优先在输入时设置 SRID,例如使用ST_GeomFromGeoJSON、EWKT(如SRID=4326;POINT(1 2))或 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 的操作;将 2D CRS 数据传入 ST_Transform 前,先对其调用 ST_Force3DZ。
- 使用
h3扩展,而非ST_Hexagon/ST_HexagonGrid。 - 如果确定数据将以二进制形式转储、压缩并传输,且精度已知,可以考虑使用
ST_QuantizeCoordinates。
评论
支持 Markdown