본문 바로가기

프로그래밍/OpenLayers

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

이전 포스팅에 올렸던 버퍼를 이용한 반경검색 기능을 테스트 하던중 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;
}