[Geoserver] CQL에서 querySingle함수를 사용하여 같은 저장소내의 다른 레이어와 조인 하는 방법 ( feat. gs-querylayer 라이브러리 설치 )
서론
이번 프로젝트는 DB에 접근하는 것보다 geoserver의 cql필터를 통해 데이터(레이어의 피쳐)를 가져오는 로직이 많은데..
CQL필터가 기본적으로 자기자신의 테이블에서만 조건을 걸 수 있다.
근데 만약 다른 레이어와 JOIN하는 CQL 조건문을 사용해야 하는 경우에는 어떻게 해야할까?
이때 querySingle함수를 사용하면 할 수 있다.
이 querySingle는 Geoserver의 내장함수가 아니기 때문에 따로 라이브러리를 Geoserver에 설치해주어야 한다.
교차 레이어 필터링이라고 한다고 한다..
나는 오늘 querySingle에 대해서만 정리하지만 해당 모듈에서는
queryCollection와 collectGeometries라는 함수도 존재하니 궁금한 사람은 찾아보도록 하자.
아무튼 내가 이해한 내용을 그림으로 그려보았다.
gs-querylayer 라이브러리 설치
우선 아래 링크로 들어가면 gs-querylayer라이브러리에 대한 설명과 다운로드가 가능하다.
https://docs.geoserver.org/main/en/user/extensions/querylayer/index.html
근데 경고문구를 자세히 보면 다음과 같은 내용이 있다.
그럼 이제 geoserver에 가서 지오서버의 버전을 보도록 하자.
그럼 gs-querylayer 라이브러리 버전도 2.18.0 버전을 설치해야 한다.
아래 링크에서 자신의 geoserver와 버전이 맞는 라이브러리를 찾아 다운로드 받도록 하자.
https://sourceforge.net/projects/geoserver/files/GeoServer/
querySingle 테스트
querySingle 기본문법
querySingle('저장소명:레이어명', '가져올 컬럼', '조건문')
querySingle 샘플
querySingle('sjmp:B_table', 'geom', '1=1 and emd_cd = 36110103')
//sjmp저장소의 emd_table에서 emd_cd 컬럼의 값이 '36110103'인 geom을 select 해옴
CQL 샘플
INTERSECTS(geom, querySingle('sjmp:B_table', 'geom', '1=1 and emd_cd = 36110103'))
이렇게 결과가 잘 나오는 것을 확인할 수 있다.
결국에는 INTERSECTS함수를 이용해서 2개의 geom이 교차하는 영역만 추출하는 CQL을 만드는데,
비교하고자 하는 2번째 geom에 조건을 주고, 다른 레이어의 geom을 사용했다는 것만 빼면
그냥 INTERSECTS 한 것과 같다.