You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ST_Intersects在Geometry与Geography类型下的计算差异问询

关于PostGIS中Geometry与Geography类型ST_Intersects结果差异的解析

你的猜测完全正确!这两种PostGIS空间类型的底层处理逻辑差异,正是导致你看到不同结果的根本原因。下面来详细拆解验证:

1. Geometry类型:基于平面坐标系的直白计算

Geometry类型本质是平面笛卡尔坐标系下的空间对象,哪怕你指定了SRID=4326(WGS84地理坐标系),它也会直接把经纬度当作平面上的X/Y坐标来处理:

  • 你定义的多边形POLYGON((-12 0,12 0,12 50.7,-12 50.7,-12 0))在平面上就是一个轴对齐的矩形,北侧边界是一条纬度为50.7的水平直线。
  • 点POINT(6.0 50.9)的纬度明显高于50.7,落在矩形外部,所以ST_Intersects返回FALSE,和你的预期一致。

对应的验证SQL:

SELECT ST_Intersects( ST_GeomFromText('POLYGON((-12 0,12 0,12 50.7,-12 50.7,-12 0))', 4326), ST_GeomFromText('POINT(6.0 50.9)', 4326) ); 
-- 输出结果:FALSE

2. Geography类型:基于椭球面的大圆路径计算

Geography类型是专门为地球椭球面设计的,所有的线和面都会用最短大圆路径(Great Circle)来构建:

  • 当你用ST_GeogFromText创建多边形时,多边形的每条边都会被解析为椭球面上的大圆弧。你的多边形北侧边连接的是(12, 50.7)和(-12, 50.7)两点,这条大圆弧在椭球面上会自然向北凸起(纬度越高,相同经度跨度对应的大圆路径越靠近北极)。
  • 点POINT(6 50.9)的纬度虽然比50.7高,但刚好落在这条向北凸起的大圆弧围成的多边形内部,所以ST_Intersects返回TRUE。

对应的验证SQL:

SELECT ST_Intersects( ST_GeogFromText('POLYGON((-12 0,12 0,12 50.7,-12 50.7,-12 0))'), ST_GeogFromText('POINT(6 50.9)') ); 
-- 输出结果:TRUE

简单总结:Geometry适合小范围、平面投影场景下的空间计算,而Geography专为跨大范围、需要考虑地球曲率的全球尺度场景设计,二者的计算逻辑差异直接导致了这次的结果不同。

内容的提问来源于stack exchange,提问作者Jasper Vijverberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:48:45