PostGIS中ST_Intersection与ST_Intersects处理geography类型异常
PostGIS Geography类型ST_Intersection结果异常的原因
你执行的第一个查询:
select st_astext( st_intersection( ST_GeographyFromText('LINESTRING(-40 40, 40 40)'), ST_GeographyFromText('LINESTRING(0 30, 0 50)') ))
返回POINT(0 40),但预期是球面大圆路径的交点POINT(0 47.6);第二个查询:
select st_intersects( ST_GeographyFromText('LINESTRING(-40 40, 40 40)'), ST_GeographyFromText('LINESTRING(0 39, 0 41)') )
返回false,原因如下:
1. 对Geography线串的认知偏差
Geography类型的LINESTRING(-40 40, 40 40)并非沿着北纬40度的纬线(小圆),而是两点间的球面大圆路径(球面最短路径)。这条大圆路径在0经度处的纬度约为47.6°,而非平面几何中的40°。
2. ST_Intersection的实现局限
PostGIS当前对Geography类型的ST_Intersection处理逻辑是:先将Geography转换为EPSG:4326平面Geometry(把球面当作平面)计算交点,再转回Geography。这种平面计算忽略了球面曲率,因此得到的是平面坐标系下的交点POINT(0 40),与实际球面大圆的交点不符。
3. ST_Intersects的结果是正确的
ST_Intersects函数基于球面逻辑计算,它正确识别出两条Geography线串的大圆路径没有交集:第一条线的大圆路径在0经度处的纬度是47.6°,不在第二条线段LINESTRING(0 39, 0 41)的纬度范围内,因此返回false是正确的。
解决方案
若需准确计算球面几何的交点,可采用以下方式:
- 使用PostGIS 3.0+新增的
ST_GeodesicIntersection函数,直接计算球面大圆的交点; - 将Geography转换为支持球面计算的投影坐标系(如基于球面的投影)后,再执行
ST_Intersection计算。
内容的提问来源于stack exchange,提问作者user1894205
相关产品推荐
相关产品推荐

