프로그래밍/OpenLayers

[OpenLayers] GeoServer Request 414 에러(URI Too Long)

페어팩 2021. 3. 26. 10:56

이전 포스팅에 올렸던 버퍼를 이용한 반경검색 기능을 테스트 하던중 414에러가 발생했다.

RequestURL이 길면 얼마나 길다고.. 하면서 가보니..

정말 기...길다....

현재 기능에서 해당 에러가 발생한 원인은 CQL_FILTER를 적용하면서 도형정보(POLYGON(coord1,coord2.....))가 입력되는데 도형의 좌표값들이 많아지다 보면 URL의 최대값을 넘어버리는 경우가 생기는 모양이었다.

기존코드

// ※참고 : 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;
}

1차수정코드

처음엔 url에 parameter 정보를 포함시켜 요청을 보냈던 것을 source를 생성할때 parameter 정보를 따로 넘겨주면 해결될거라 생각했는데 생각처럼 parameter 정보가 넘어가질 않았다.

function setBufferLayer(param) {
	//url 생성
	var url = info.geoServer.url;
	//cql_filter 적용
	var cqlFilter = 'INTERSECTS(geom,'+param.bufferFeature_WTK+')';
        
	//source 생성
	var vectorSource = new ol.source.Vector({
		format: new ol.format.GeoJSON(),
		url :  url,
		params : {
			service: 'wfs',
			request: 'GetFeature',
			typeName: param.lyrId,
			outputFormat: 'application/json',
			cql_filter: cqlFilter
		},
		strategy: ol.loadingstrategy.bbox
	});
		
	//Layer 생성
	var bufferLayer = new ol.layer.Vector({
		source : vectorSource,
		style : param.style,
		name : param.lyrId+'_'+param.radius
	});
		
	return bufferLayer;
}

2차수정코드

이리저리 방법을 찾아보던 중 결국 source에 넣기 전에 post방식으로 미리 요청해 해당 데이터를 생성하고 이를 source에 밀어넣는 방법으로 우회해서 해결했다.

 

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 적용
	var cqlFilter = 'INTERSECTS(geom,'+param.bufferFeature_WTK+')';
    
	//post로 미리 요청(cql_filter만 url에 포함되지 않도록 전송)
	var source = $.post(url, { cql_filter: cqlFilter});
	
	source.done(function(data){
		//source 생성(post로 요청된 데이타를 형식에 맞게 밀어넣기)
		var vectorSource = new ol.source.Vector({
			features: new ol.format.GeoJSON().readFeatures(data),
		});
		//Layer 생성
		var bufferLayer = new ol.layer.Vector({
			source : vectorSource,
			style : param.style,
			name : param.lyrId + '_' + param.radius
		});
	});
		
	return bufferLayer;
}