회선 연결을 기반으로 한 PostGIS 재귀 쿼리


9

쿼리에 어려움이 있습니다. 각각 n_type 열에 값이있는 줄 문자열 네트워크가 있습니다. 이것은 몇 가지 옵션 중 하나 일 수 있습니다. 동일한 유형의 연속 줄을 구성하는 모든 줄 문자열을 그룹화하는 새 테이블을 생성하고 싶습니다.

전에:

여기에 이미지 설명을 입력하십시오

후:

여기에 이미지 설명을 입력하십시오

여기 내가 지금까지 얻은 것입니다. 결과를 반환하지만 의미가 없습니다. 유형이 일치하지 않으며 너무 많은 기능을 반환합니다.

또한 "연속"을 이웃에서 5 피트 이내의 선으로 정의하고 30도 미만의 각도에서 만나는 것에 유의하십시오.

WITH RECURSIVE all_links (i, pk_uid, n_type, geom) AS (
    SELECT  1 AS i,
            pk_uid,
            n_type,
            geom
    FROM    network
    WHERE   n_type != 'none'

    UNION ALL

    SELECT  a.i + 1,
            b.pk_uid,
            b.n_type,
            b.geom
    FROM    network b, all_links a
    WHERE   b.n_type = a.n_type
    AND     b.geom <#> a.geom <= 5  --lines are continuous if within 5 feet of neighbor
    AND     ABS( DEGREES( 3*pi() - st_azimuth(st_startpoint(a.geom),st_endpoint(a.geom)) + st_azimuth(st_startpoint(b.geom),st_endpoint(b.geom)))::int % 360 - 180) <= 30 )  --only take links within 30 degrees of the same angle

SELECT i, n_type, ST_Union(the_geom) FROM all_links GROUP BY i, n_type

나는 재귀 쿼리가 갈 길이라고 가정했지만 그에 대해 잘못 판명되어 기쁩니다. 재귀는 조금 어려워합니다.

편집 : 나는 이미 ST_Union과 ST_Linemerge를 사용하여 집계 한 다음 결과를 덤핑했다고 덧붙여 야합니다. 이 기능은 작동하지만> 30도 교차점을 고려하지 않으며 연결에 대한 5 피트 허용 오차도 존중할 수 없습니다.


이것에 대해 깊이 파고 들지 않고 몇 가지 관찰. select 절에서 a.geom과 b.geom을 결합해야합니다. 당신은 아마 당신이 시도와 함께뿐만 아니라 자체에 선을 가입하지 않는 것을 확인해야한다a.pk_uid != b.pk_uid
MickyT

@MickyT 감사합니다. 마지막 SELECT 절에서 통합을 수행 할 수 있지만 당분간 선택한 모든 결과를 볼 수 있도록 *를 선택했음을 언급해야합니다. 코드 스 니펫을 수정하여 최종 모습을 보여 드리겠습니다.
spencerrecneps

재귀 쿼리는 이해하기 어렵습니다. Lol and +1
John Powell

간략히 살펴보면 기본 / 앵커 쿼리에 문제가있을 수 있습니다. 각 라인 A, B, C 등의 시작점을 선택해야하며, 그런 다음 재귀 부분에 쌓입니다. 아마도 앵커 쿼리에 일종의 순서를 추가해야 할 수도 있습니다 (아마도 x 또는 y 방향으로-데이터를 보지 않고 알 수 없음). 나는 이것을 분해하고 재귀 부분을 계속하기 전에 합리적인 시작점을 먼저 얻었는지 확인합니다. 나는 최근에 시계열에서 줄무늬를 찾기 위해 재귀 쿼리를 사용했으며 일단 앵커 포인트가 올바르게 식별되면 나머지는 쉬웠습니다.
John Powell

@dbaston. 좋은 지적이지만 재귀 쿼리 로이 작업을 수행 할 수 있지만 모든 사람이 아직 설치하지는 않았습니다.
존 파월

답변:


1

John Barça가 말했듯이 적어도 귀하의 솔루션에는 라인 구성 요소의 선주문이 없습니다.

재귀 쿼리는 매우 어려워하기가 어렵습니다.

새 데이터베이스 함수에서 ST_Linemerge 동작을 복제해야합니다. 먼저 ST_Linemerge 구현의 소스를보고 복제하여 30도 각도의 트위스트를 생성하도록 변경하려고합니다.

30도 미만의 각도가 아닌 세그먼트를 집계에서 삭제하려면 집계 루프 내에서 세그먼트를 비교해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.