Recent Posts
Recent Comments
Adsense
Archives
Visitor
Today
Total
관리 메뉴

Annotation

OpenLayers WMS CQL (조건문 or 필터 or SQL) feat.GeoServer 본문

JavaScript

OpenLayers WMS CQL (조건문 or 필터 or SQL) feat.GeoServer

devs 2015. 7. 9. 12:26




저번에 OpenLayers 관련 포스팅을 몇가지 했는데 의외로 찾으시는 분들이 꽤나 있었습니다.


국내에서도 많이 사용하나 봅니다.


이어서 OpenLayers 를 사용하며 꼭 필요한 기능을 포스팅 하겠습니다.



OpenLayers WMS CQL (조건문 or 필터 or SQL) feat.GeoServer



OpenLayers 에서 WMS 객체를 사용하며 조건을 주어 지도에 표현해야 할 상황은 반드시 존재합니다.


다음과 같이 특정 레이어의 특정 속성만 검색하여 보여준다거나 하는 기능들 말이죠.



(CQL_FILTER 를 적용 한 모습)



WMS 객체에는 CQL 이라는 파라미터 옵션이 존재합니다.


이 CQL_FILTER 는 SQL 에서 WHERE 와 같습니다.


우리는 이 옵션을 사용하면 됩니다.


문법은 다음과 같습니다.



wms.mergeNewParams({			// wms 객체에 새로운 파라미터를 추가합니다.
	CQL_FILTER: " type = 'road' "	// type 컬럼의 값이 road 인 값만 가져옵니다.
});


간단하죠?


여기서 몇가지 중요한 사항이 있습니다.



첫번째. 단일 WMS 객체에서 복수의 레이어를 관리하는 경우 (단일 레이어 제외)



WMS 객체를 여러개로 관리하는 경우는 상관 없지만,


객채 하나에 여러개의 레이어를 추가하여 관리하는 경우에는 CQL_FILTER 필터를


세미콜론(;) 으로 구분하여 레이어 갯수만큼 추가하여야 합니다.


만약 WMS 객체에서 관리하는 레이어가


다음과 같을 경우,



console.log(wms.params.LAYERS);
// 결과 : ["1번 레이어", "2번 레이어"]



아래와 같이 CQL_FILTER 를 지정하셔야 합니다.



wms.mergeNewParams({
// wms 객체에 새로운 파라미터를 추가합니다.
	CQL_FILTER: " type = 'road'; area = 30 "
	// 1번 레이어는 type 컬럼의 값이 road 인 값, 2번 레이어는 area 컬럼의 값이 30 인 값만 가져옵니다.
});


이것 역시 간단하죠?


만약 CQL_FILTER 가 필요 없는 부분은 세미콜론(;)만 지정해 주시면 됩니다.


앞서 말씀드렸드시, 이 부분은 WMS 단일 객체에 복수의 레이어를 관리할 경우만 해당됩니다.


그렇지 않은 분은 이부분을 무시하셔도 좋습니다.



두번째. CQL_FILTER 적용 후 WMS 객체다시 그리기 (필수)



전 단계에서 CQL_FILTER 를 지정 하셨으면, 레이어를 다시그리셔야 합니다.



wms.redraw(true);


필수 사항이니 꼭 해주셔야 합니다.


redraw(true) 함수 호출시 GeoServer 에 다시 요청합니다.


만약 레이어가 제대로 표현되지 않을 경우, GeoServer 로그를 확인하신 후 그에 따른 조치를 하셔야 합니다.


대부분 WMS 단일 객체에서 여러 레이어를 사용할 때,


레이어의 갯수와 CQL_FILTER 갯수가 맞지 않다거나,


컬럼의 속성과 일치하지 않는 데이터 타입을 지정하는 경우가 많이 일어납니다.



레이어가 많을 수록, 이런 부분을 관리하기 쉽지 않습니다.


따라서 관련 함수를 구현하셔서 유연하게 사용하시는게 가장 좋은방법입니다.



준비한 내용은 여기까지구요, 혹시라도 에러를 해결하기 힘드시면 댓글로 로그를 남겨주세요.


도움이 되셨으면 좋겠습니다


감사합니다.



Comments