为什么地理相交函数是错误的?
首先,它不是!但我们经常遇到的问题是,“地理相交测试说这个点在盒子里面,但显然不是,为什么?”
以下是示例
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;
相同的盒子,相同的点,但根据您是作为几何还是地理进行评估,答案不同。为什么?
intersects_geog | intersects_geom
-----------------+-----------------
t | f
答案在于两种类型工作的不同空间中
- 几何是放置在笛卡尔平面(或体积,如果您添加第三维)上的形状,并且任意两点之间的最短路径是直线。
- 地理是放置在球体表面上的形状,并且任意两点之间的最短路径是大圆。
在我们的示例中,该盒子的最北边缘将是 LINESTRING(0 10, 80 10)
,在几何中它是一条水平直线,但在地理中它是一个向北略微弯曲的大圆,以至于它经过我们的测试“POINT(40 10.1)”的北边。
在推理地理时,务必记住边缘是大圆。赤道以北的东/西线将向北弯曲一点,赤道以南的东/西线将向南弯曲一点。