0

我想选择在图层中分隔线段的节点。我只想选择与两条线相交的节点,而不是当它们与两条以上的线相交时(例如 T 相交或四向相交等)。

这是我能给出的最好的图片(我没有发布图片的声誉)。左边的 --- 线是第一段,右边的 --x--x--x 线是第二段。O 是我要选择的中间节点。

--------------------------------------0--x---x--x- --x---x---x--x--x--x--x--x--x--x

我不想选择超过两条线接触节点的节点。

到目前为止,我已经尝试过这个查询

CREATE TABLE contacts_st_touching_faults as
SELECT ST_Intersection(a.the_geom, b.the_geom), Count(Distinct a.gid) = 2
FROM final_layer as a, final_layer as b
WHERE ST_Touches(a.the_geom, b.the_geom)
AND a.gid != b.gid
GROUP BY ST_Intersection(a.the_geom, b.the_geom)

当我运行这个查询时,它给了我两个以上相交线的交叉点(T 交叉口和 4 路交叉口)。

我也尝试过将 ST_intersects 放入其中,但这似乎不如 ST_touches 工作,但如果您知道如何使它们工作或任何其他方法,将不胜感激!

谢谢您的帮助!

4

2 回答 2

0

这应该有效:

WITH contacts AS(
SELECT a.gid AS gid1,b.gid AS gid2, ST_Intersection(a.the_geom, b.the_geom) AS intersection
FROM final_layer as a, final_layer as b
WHERE ST_Touches(a.the_geom, b.the_geom)
AND a.gid<b.gid
)
SELECT *
FROM contacts c1
LEFT JOIN contacts c2
  ON ((c1.gid1=c2.gid1 AND c1.gid2<>c2.gid2) OR (c1.gid1=c2.gid2 AND c1.gid1<>c1.gid2))
  AND c1.intersection=c2.intersection
WHERE c2.gid1 IS NULL;

如果将 ST_Intersection 移至最终查询,它的性能会更好,但我想让它变得简单。

于 2013-04-24T14:09:32.030 回答
0

这将列出拖链相交的节点。

    SELECT array_agg(gid) AS gids, count(gid) AS count, geom
    从
      -- 列出所有线的顶点(点)
      (SELECT gid, (ST_DumpPoints(geom)).geom AS geom
      FROM lines_layer) AS p
    按 p.geom 分组
    有计数(gid)= 2
    按计数排序(gid);

对于所有节点,将 '= 2' 替换为 '> 1'

于 2013-11-17T23:19:33.563 回答