【发布时间】:2015-05-15 10:41:53
【问题描述】:
在 PostGIS 中,您可以使用以下方法相交两个几何:
geometry ST_Intersection (geometry geomA, geometry geomB);
在我的例子中,geoma 和 geomB 都是 LINESTRING,所以 ST_Intersection() 返回一个 POINT 几何。
我想知道相交是发生在开始/结束节点(几何接触)还是中间(几何相交)。
我可以将 (Point.X, Point.Y) 与每个结束节点进行比较:
- geomA.nodes(0) - geomA.nodes(len-1)
- geomB.nodes(0) - geomB.nodes(len-1)
但是非常复杂。我想要一个简单的解决方案。
有 3 个相交的情况。
示例 1:“L”形的两条线在左下角两条线的末端节点相交。
示例 2:“T”形的两条线,其中垂直线与水平线的中间相交。在这种情况下,垂直线末端节点接触到水平线的非末端节点。
示例 3:“X”形的两条线。交点不是任何一条线的终点。
对于我的问题,我只想找到像示例 2 这样的感人场景。
注意
这是我现在使用的伪代码。
geomM, geomN 线串
a、b、c、d、z 点。
(a,b) geomM ST_StartPoint(geom) and ST_EndPoint(geom)的开始/结束节点
(c,d) geomN的开始/结束节点
z = ST_Intersect(geomM, geomN)
SELECT geomM, geomN, z
FROM Table
WHERE
(A and not ( B or C or D))
OR (B and not ( A or C or D))
OR (C and not ( A or B or D))
OR (D and not ( A or B or C))
A、B、C、D 替换 ( a=z ) ( b=z ) ( c=z ) ( d=z )
这意味着一个节点 {a,b,c,d} 等于交集 z。但只有一个
这将返回所有“T”形交叉点。
【问题讨论】:
-
如果“交叉点”位于
LINESTRING的起点或终点节点,而任何中间点位于另一个LINESTRING上,那么从拓扑上讲,它不是交叉点,而是接触边界。 -
@Patrick 抱歉,但我不熟悉拓扑 lenguaje。我称它为交点,因为我使用
ST_Intersect来查找点。是否有 ST_Touch 返回点? -
ST_Intersects()返回一个boolean来指示两个几何是否相交,ST_Intersection()返回一个实际相交的geometry。您的问题是“如果交叉点发生在开始/结束节点”;因为该节点是一个geometry(属于POINT),如果它确实触及另一个LINESTRING,它将给出您正在寻找的答案。但这将是一个复杂的WHERE子句,但是由于您的限制,您可以使用它。
标签: postgresql postgis