第29章 geography intersects 函数计算结果为何不同?
geography intersects 函数为什么算错了?
其实并没有算错。我们经常被问到类似的问题:“geography intersects 判定说这个点在盒子的某侧,但明显不在,这是为什么?”
来看个例子: WITH wkt AS ( SELECT 'POLYGON((0 0, 80 0, 80 10, 0 10, 0 0))' AS box, 'POINT(40 10.1)' AS pt ) SELECT ST_Intersects(wkt.box::geography, wkt.pt::geography) AS intersects_geog, ST_Intersects(wkt.box::geometry, wkt.pt::geometry) AS intersects_geom FROM wkt; 同一个盒子,同一个点,但在 geometry 和 geography 两种类型下,判定结果却不同。原因何在?
intersects_geog | intersects_geom -----------------+----------------- t | f 答案在于这两种类型所处的不同空间:
geometry 把形状置于笛卡尔平面(若加第三维则是空间)中,两点间最短路径是直线。 geography 把形状置于球面上,两点间最短路径是大圆。
在我们这个例子中,盒子的北边缘是一条 LINESTRING(0 10, 80 10)。在 geometry 里它是一条水平直线;但在 geography 中,它是一条大圆,会微微向北弯曲,以至于它会经过我们测试用的 ‘POINT(40 10.1)’ 的北侧。
在思考 geography 时,务必记住:边缘是大圆。赤道以北的东/西线会略微向北弯,赤道以南的则会略微向南弯。