Postgresql 如何查找在开始/结束节点中接触的线字符串

Postgresql 如何查找在开始/结束节点中接触的线字符串,postgresql,postgis,Postgresql,Postgis,在PostGIS中,可以使用以下命令相交两个几何图形: geometry ST_Intersection (geometry geomA, geometry geomB); 在我的例子中,geomA和geomB都是LINESTRINGsoST_Intersection()返回一个点几何体 我想知道交叉点发生在开始/结束节点(几何接触)还是在中间(几何相交)。< /P> 我可以将(点.X,点.Y)与每个结束节点进行比较: 几何节点(0)-几何节点(len-1) 几何体节点(0)-几何体节点(l

在PostGIS中,可以使用以下命令相交两个几何图形:

geometry ST_Intersection (geometry geomA, geometry geomB);
在我的例子中,geomA和geomB都是
LINESTRING
so
ST_Intersection()
返回一个
几何体

我想知道交叉点发生在开始/结束节点(几何接触)还是在中间(几何相交)。< /P> 我可以将(点.X,点.Y)与每个结束节点进行比较:

  • 几何节点(0)-几何节点(len-1)
  • 几何体节点(0)-几何体节点(len-1)
但这是非常复杂的。我想要一个简单的解决方案

共有3个交叉案例。 示例1:“L”形中的两条线在左下角两条线上的端点节点中相交

例子2:两条线“T”形,其中垂直线在水平线的中间相交。在这种情况下,垂直线端点节点与水平线的非端点节点接触

示例3:“X”形的两条线。交点不是这两条线的终点节点

对于我的问题,我只想找到像示例2这样的动人场景

注 这是我现在使用的伪代码

geom,geom行字符串
a、 b,c,d,z点
(a,b)geomM
ST_起点(geom)和ST_终点(geom)的开始/结束节点
(c,d)geomN的开始/结束节点
z=ST_相交(Geom,Geom)

A、 B,C,D替换(A=z)(B=z)(C=z)(D=z)
这意味着一个节点{a,b,c,d}等于交点z。但只有一个

这将返回所有“T”形交点。

您需要PostGIS函数
ST_touch()
。如果几何图形触及其边界,则函数返回
true
;如果几何图形相交,则函数返回
false
。就您的示例而言,示例1和2返回
true
,示例3返回
false

松弛解 要从单个表中选择所有接触
几何体(LINESTRING,xxx)
记录对的ID,请使用以下命令:

SELECT x.id AS idA, y.id AS idB
FROM my_table x
JOIN my_table y ON ST_Touches(y.the_geom, x.the_geom)
WHERE x.id < y.id;

所有要求都在
加入
条款中检查。这也将返回T的“垂直”条与“水平”条接触的位置。请注意,在评估条件时,条件会短路,对具有相同输入数据的函数的重复调用将优化为单个调用。

感谢您的帮助。我不知道触摸功能。但这并不能解决我的问题。我包含了部分代码,它只是检查是否恰好有一个开始/结束节点等于交点。没有真正的密集,但在子句中非常复杂。如果“交叉点”位于
线串
的开始或结束节点,并且在另一个
线串
上有任何中间点,那么从拓扑上讲,它不是交叉点,而是接触边界。@Patrick抱歉,但我不熟悉拓扑lenguaje。我称之为交叉点,因为我使用
ST\u Intersect
来找到点。是否存在ST_接触返回点?
ST_Intersects()
返回一个
布尔值
以指示两个几何图形是否相交,
ST_Intersection()
返回实际相交的
几何图形
。您的问题是“如果相交发生在开始/结束节点”;由于节点是一个
几何体
(一个
),如果它确实接触到另一个
线串
,它将给出您正在寻找的答案。但是它将是一个复杂的
WHERE
子句,不管您如何处理它,因为您的限制。
SELECT x.id AS idA, y.id AS idB
FROM my_table x
JOIN my_table y ON ST_Touches(y.the_geom, x.the_geom)
WHERE x.id < y.id;
SELECT h.id AS touched, v.id AS touching, ST_Intersection(h.the_geom, v.the_geom) AS touch_point
FROM my_table h     -- "horizontal" T bar, being touched
JOIN my_table v ON  -- "vertical" T bar, touching
    (
      -- The "vertical" start node touches, but not on either of the "horizonal" nodes
      ST_Equals(ST_Intersection(h.the_geom, v.the_geom), ST_StartPoint(v.the_geom))
      AND NOT ST_Equals(ST_StartPoint(h.the_geom), ST_StartPoint(v.the_geom))
      AND NOT ST_Equals(ST_EndPoint(h.the_geom), ST_StartPoint(v.the_geom))
    ) OR (
      -- The "vertical" end node touches, but not on either of the "horizonal" nodes
      ST_Equals(ST_Intersection(h.the_geom, v.the_geom), ST_EndPoint(v.the_geom))
      AND NOT ST_Equals(ST_StartPoint(h.the_geom), ST_EndPoint(v.the_geom))
      AND NOT ST_Equals(ST_EndPoint(h.the_geom), ST_EndPoint(v.the_geom))
    );