A 和 B 的交集为何不与 A 或 B 相交?
两条线 A 和 B 的交集是一个点 P。在数学课上,您会学到 P 位于 A 和 B 上。这只是数学!
那么,为什么在 PostGIS 中有容易构造的情况,其中 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 上”这一规则是“实数”的数学规则,实数是无限的。计算机浮点数可以表示的有限数量的值最终看起来像一张方格纸。
如果您在一张方格纸上画一条直线,大多数情况下,这条线不会击中许多方格交叉点。在“浮点网格”的世界中,线也是如此。结果是,两条线的计算交点通常不会落在任何一条线上,而是落在一个(非常非常接近)的附近点,该点可以表示为浮点数。