프로그래밍/OpenLayers

[OpenLayers] geoServer CQL_FILTER를 활용한 폴리곤 버퍼검색(WITHIN, INTERSECTS)

페어팩 2021. 3. 17. 17:48


이전 포스팅에서는 기준점을 기준으로 반경 검색을 하는 것에 대해 알아보았다.

이번에 시도할 기능은 면(POLYGON)에 대한 일정 거리의 버퍼를 부여해서 이 버퍼에 걸리는 Feature들을 검색해 볼 것이다.

해당 Feature에 100m,200m,300m 버퍼를 주어 반경 검색을 실행했다.(INTERSECTS 활용)

 BUFFER생성

일단 해당 레이어에 대한 버퍼를 만들어준다. 여러 방법이 있겠지만 필자는 JSTS라이브러리를 활용했다.

//JSTS를 활용해 Buffer Feature 생성
//필요한 파라미터 : feature, radius

//피처 geometry 파싱
var parser = new jsts.io.OL3Parser();
var jstsGeom = parser.read(feature.getGeometry());

//버퍼 geometry 생성
var buffered = jstsGeom.buffer(radius);

//버퍼 feature 생성
var bufferFeature = new ol.Feature();
bufferFeature.setGeometry(parser.write(buffered));

//WKT format으로 변경(CQL_FILTER로 검색시 필요)
var bufferFeature_WTK = new ol.format.WKT().writeFeature(bufferFeature);

 INTERSECTS

INTERSECTS 구문은 해당 버퍼에 일부분이라도 걸리는 Feature들을 모두 검색해준다.

구문 의미 예시
INTERSECTS(Expression,Expression) 두번째 객체와 겹치는 것들만 추출
INTERSECTS(geom_col,POLYGON(x y,x y,x y,x y))
//geom_col : 레이어 geometry 스키마 명
//POLYGON : 버퍼객체정보

이를 cql_filter에 적용하면 다음과 같다

// ※참고 : param에 들어있는 정보
//var param = {	
//	radius			//반경 정보(100m)
//	bufferFeature_WTK	//POLYGON() 객체 정보
//	lyrId			//검색할 레이어ID(GeoSever에 발행되어있는 레이어 ID)
//	style			//레이어 스타일정보
//}

function setBufferLayer(param) {
	//url 생성
	var url = info.geoServer.url; //geosever host url이 들어갈곳
	url += '/ows?service=WFS';
	url += '&version=1.0.0';
	url += '&request=GetFeature';
	url += '&typeName=' + param.lyrId;
	url += '&outputFormat=application/json';
	//cql_filter 적용
	url += '&cql_filter=INTERSECTS(geom,'+param.bufferFeature_WTK+')';
        
	//source 생성
	var vectorSource = new ol.source.Vector({
		format: new ol.format.GeoJSON(),
		url :  url,
		strategy: ol.loadingstrategy.bbox
	});
		
	//Layer 생성
	var bufferLayer = new ol.layer.Vector({
		source : vectorSource,
		style : param.style,
		name : param.lyrId+'_'+param.radius
	});
		
	return bufferLayer;
}

 WITHIN

WITHIN 구문은 INTERSECTS와 비슷하지만 버퍼 내부에 위치하는 Feature만 가져온다.

구문 의미 예시
WITHIN(Expression,Expression)

첫번째 객체들 중 두번째 객체의 내부에 위상적으로 위치하는 것만 추출

WITHIN(geom_col,POLYGON(x y,x y,x y,x y))
//geom_col : 레이어 geometry 스키마 명
//POLYGON : 버퍼객체정보

WITHIN을 활용한 버퍼검색

 REFERENCE

- GeoServer ECQL Reference

 

ECQL Reference — GeoServer 2.19.x User Manual

ECQL Reference This section provides a reference for the syntax of the ECQL language. The full language grammar is documented in the the GeoTools ECQL BNF definition Syntax Notes The sections below describe the major language constructs. Each construct lis

docs.geoserver.org

- ECQL 참고 문서

ECQL.docx
3.70MB