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