第28章 为什么 A 和 B 的交集不与 A 或 B 相交?
为什么 A 和 B 的交集不与 A 或 B 相交? 两条直线 A 和 B 的交点是一个点 P。在数学课上,我们学过 P 同时落在 A 和 B 上。这很符合数学直觉! 那么,为什么在 PostGIS 中,存在一些容易构造的实例,使得 A 与 B 的交集结果既不与 A 相交,也不与 B 相交呢? WITH parts AS ( SELECT 'LINESTRING(0 0, 10 11)'::geometry AS a, 'LINESTRING(11 0, 0 19)'::geometry AS b ) SELECT ST_AsText(ST_Intersection(a, b)) AS intersection, ST_Intersects(ST_Intersection(a, b), a) AS intersects_a, ST_Intersects(ST_Intersection(a, b), b) AS intersects_b FROM parts; intersection | POINT(6.720257234726688 7.392282958199357) intersects_a | f intersects_b | f PostGIS 中的坐标由“浮点数”对表示,它们能表示极大的数值范围,但无法表示无限多个数值。 “A 与 B 在 P 点相交,则 P 必在 A 和 B 上”是实数(无限多个数)领域的数学规则。然而,计算机浮点系统所能表示的数值是有限的,其分布就像方格纸上的点一样。
如果你方格纸上画一条直线,通常这条线不会经过很多方格的交叉点。在“浮点网格”的世界里也是如此。因此,两条直线计算出的交点往往并不落在其中任意一条直线上,而是落在某个(非常非常接近的)可被浮点数表示的邻近点上。