2013-04-23 2 views
0

레이어의 선분을 구분하는 노드를 선택하고 싶습니다. 두 개 이상의 선 (예 : T 교차점 또는 4 방향 교차점 등)을 만나지 않을 때 두 선이 교차하는 노드 만 선택하고 싶습니다.선 세그먼트 분리 노드 선택

다음은 내가 제공 할 수있는 최고의 사진입니다 (사진 게시에 대한 평판은 없습니다). 왼쪽의 --- 라인은 첫 번째 세그먼트이고 두 번째 오른쪽의 -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만큼 잘 작동하지 않는 것처럼 보였지만 어떻게 작동하는지 또는 다른 방법으로 만들 수 있다면 많은 도움이 될 것입니다!

도움 주셔서 감사합니다.

답변

0

이 작동합니다 : ST_Intersection에 최종 쿼리로 이동하지만 난 그것을 간단하게하기를 원한다면

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; 

그것은 더 나은 수행합니다.

+0

굉장 덕분에 '= 2'교체! 나는 무슨 일이 일어나고 있는지 이해할 수 있었다! 쿼리가 오류없이 실행되고 있지만 아직 선택 항목이 없습니다. 쿼리는 나에게 의미가 있으므로 왜 선택하지 않는지 잘 모르겠습니다. 또한 a.gid <> b.gid - duplicate를 의미합니까? 감사! – Cindy

+1

아니, 나는 a.gid

+0

감사합니다! 그게 말이 되네. – Cindy

0

이렇게하면 견인 선이 교차하는 노드가 나열됩니다. 모든 노드에 대해

 

    SELECT array_agg(gid) AS gids, count(gid) AS count, geom 
    FROM 
     -- lists all vertices (points) from lines 
     (SELECT gid, (ST_DumpPoints(geom)).geom AS geom 
     FROM lines_layer) AS p 
    GROUP BY p.geom 
    HAVING count(gid) = 2 
    ORDER BY count(gid); 

, 간단 만들기위한 '> 1'로