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
相关产品推荐
相关产品推荐

