GIS

[Geoserver] CQL에서 querySingle함수를 사용하여 같은 저장소내의 다른 레이어와 조인 하는 방법 ( feat. gs-querylayer 라이브러리 설치 )

모찌바라기 2024. 1. 17. 12:59
728x90
반응형

 

 

서론

 

이번 프로젝트는 DB에 접근하는 것보다 geoserver의 cql필터를 통해 데이터(레이어의 피쳐)를 가져오는 로직이 많은데..

CQL필터가 기본적으로 자기자신의 테이블에서만 조건을 걸 수 있다.

 

근데 만약 다른 레이어와 JOIN하는 CQL 조건문을 사용해야 하는 경우에는 어떻게 해야할까?

 

이때 querySingle함수를 사용하면 할 수 있다.

이 querySingle는 Geoserver의 내장함수가 아니기 때문에 따로 라이브러리를 Geoserver에 설치해주어야 한다.

 

 

geoserver에서 설명하는 singelQuery

 

 

교차 레이어 필터링이라고 한다고 한다..

나는 오늘 querySingle에 대해서만 정리하지만 해당 모듈에서는

queryCollection와 collectGeometries라는 함수도 존재하니 궁금한 사람은 찾아보도록 하자.

 

아무튼 내가 이해한 내용을 그림으로 그려보았다.

 

내가 이해한 그림

 

 

 

gs-querylayer 라이브러리 설치

 

 

우선 아래 링크로 들어가면 gs-querylayer라이브러리에 대한 설명과 다운로드가 가능하다.

 

https://docs.geoserver.org/main/en/user/extensions/querylayer/index.html

 

Cross-layer filtering — GeoServer 2.25.x User Manual

Cross-layer filtering Cross-layer filtering provides the ability to find features from layer A that have a certain relationship to features in layer B. This can be used, for example, to find all bus stops within a given distance from a specified shop, or t

docs.geoserver.org

 

근데 경고문구를 자세히 보면 다음과 같은 내용이 있다.

 

 

 

그럼 이제 geoserver에 가서 지오서버의 버전을 보도록 하자.

 

 

그럼 gs-querylayer 라이브러리 버전도 2.18.0 버전을 설치해야 한다.

아래 링크에서 자신의 geoserver와 버전이 맞는 라이브러리를 찾아 다운로드 받도록 하자.

 

 

https://sourceforge.net/projects/geoserver/files/GeoServer/

 

GeoServer - Browse /GeoServer at SourceForge.net

A platform built for a new way of working The Work OS that lets you shape workflows, your way

sourceforge.net

 

 

 

 

 

 

 

 

 

 

 

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 한 것과 같다.

 

 

728x90
반응형