PostGIS를 사용하여 여러 테이블에서 지오메트리를 가져 오십니까?


13

PostGIS, PostgreSQL 및 SQL을 처음 접했습니다.

PostGIS 데이터베이스에 44 개의 테이블이 있으며 각 테이블은 서로 다른 벡터 데이터 레이어를 나타냅니다. 각각 별도의 shapefile에서로드되었으며 각 레이어에는 해당 레이어의 형상을 설명하는 열이 있습니다.wkb_geometry

한 레이어에서 특정 다각형을 선택한 다음 해당 다각형의 경계 상자와 겹치는 레이어 하위 집합에서 모든 지오메트리를 검색하려고합니다. 나는 주문이 나오는 것에 대해 까다 롭지 않지만 각 지오메트리 그룹의 테이블로 구성되어 있으면 도움이 될 것입니다.

다음은 내 SQL 문 샘플입니다.

SELECT
    ST_AsEWKT(wkb_geometry) /* Some of this data has z values, hence the EWKT */
FROM
    table2, table3, table4, table5
WHERE 
    wkb_geometry &&
        (
        SELECT
            wkb_geometry
        FROM
            table1
        WHERE
            ogc_fid = 25
        );

오류를 반환합니다 :

column reference "wkb_geometry" is ambiguous
/* note that every table that I am selecting from has a "wkb_geometry" column */

이것을하는 올바른 방법은 무엇입니까?


1
SQL Primer가 유용 할 것입니다. 고급 SQL 구문도 다루지 만 주로 SQL 초보자 질문에 답변하도록 설계되었습니다. postgis.us/chapter_appendix_c 1 장은 PostGIS 공간 입문서이므로 유용 할 것입니다.
LR1234567

+1. 그것이 무료 챕터입니다. 전체 책 벤자민을 사십시오. 그것은 가치있는 투자입니다. PostGIS에 대해 더 많이 알고 싶다면
Nicklas Avén

답변:


8

먼저이 테이블에서 지오메트리 열을 선택할 테이블을 지정하지 않았기 때문에이 오류 메시지가 나타납니다 (모두 동일한 이름을 사용하므로 postgres가 혼동됩니다). 그래서 오류 메시지가 나타납니다

열 참조 "wkb_geometry"가 모호합니다

여러 테이블에 동일한 열 이름이있는 경우 항상 열 이름 앞에 테이블 이름을 추가하십시오. 예 : table1.wkb_geometry

귀하의 질문에 대해 : 내가 당신을 올바르게 이해한다면, 하나의 특정 레이어에서 특정 객체와 교차하는 다른 레이어의 객체를 찾고 싶습니다.

처음에는 한 번에 두 개의 테이블을 살펴보고 간단하게 유지하십시오.

Table1은 특정 개체가있는 테이블이고 table2는 다른 개체가있는 테이블입니다.

SELECT
ST_AsEWKT(table2.wkb_geometry)
FROM
table1, table2
WHERE
(table2.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

이제 다른 테이블에서 추가 개체를 추가하려면 Sasa가 이미 언급했듯이 UNION ALL이 필요합니다. 열 이름은 같을 필요는 없지만 열 수와 데이터 유형은 달라야합니다!

SELECT
ST_AsEWKT(table2.wkb_geometry)
FROM
table1, table2
WHERE
(table2.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

UNION ALL

SELECT
ST_AsEWKT(table3.wkb_geometry)
FROM
table1, table3
WHERE
(table3.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

UNION ALL

etc...

고유 ID가 없기 때문에 뷰어에서 쿼리를 열 때 문제가 발생할 수 있습니다. 이를 해결하는 간단한 방법은 결과를 id 열이있는 테이블로 저장하는 것입니다.

재밌다


6

내 앞에 SQL 클라이언트가 없으므로 100 % 정확하지는 않지만 다음 줄을 따라 뭔가를 원할 것입니다.

SELECT ST_AsEWKT(wkb_geometry) FROM table2 WHERE ...
UNION ALL
SELECT ST_AsEWKT(wkb_geometry) FROM table3 WHERE ...

등등. 문제는 SQL 쿼리가 SELECT ST_AsEWKT (wkb_geometry)를 지정할 때 참조하는 테이블 (table2 / 3 / 4 / 5)을 모르므로 모호한 참조입니다. 주문을 원할 경우 ORDER BY를 결과에 추가 할 수도 있습니다

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