프로그래밍/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;
}