프로그래밍/OpenLayers
[OpenLayers] geoServer CQL_FILTER를 활용한 반경검색(DWITHIN)
페어팩
2021. 3. 16. 09:15
프로젝트중에 레이어에 대해서 반경에 걸리는 Feature를 찾아야 하는 기능이 필요했다.
원래는 OpenLayers api중 intersectsCoordinate 기능으로 구현 했었지만 전체레이어 Feature수가 많은 레이어에서 수행할 경우 느려지는 이슈가 발생하기도 하고 필요없는 레이어가 보이기도 했다.
그래서 기존 레이어를 활용하는 것이 아닌 geosever에서 필요한 범위만 검색해서 인스턴트 레이어를 생성해 뿌려주는 방법으로 수정방향을 잡았다.
DWITHIN
일반적인 geoserver 요청 url 형식에 뒤에 DWITHIN을 이용한 cql_filter 하나만 적용시켜주었다.
DWITHIN(geom_col,POINT(x y),radius,unit)
//geom_col : 레이어 geometry 스키마 명
//POINT(x y) : 기준점
//radius : 반경 거리
//unit : 단위(feet, meters, statute miles, nautical miles, kilometers)
// ※참고 : param에 들어있는 정보
//var param = {
// geom //geometry 정보
// radius //반경 정보(100m)
// lyrId //검색할 레이어ID(GeoSever에 발행되어있는 레이어 ID)
// style //레이어 스타일정보
//}
function setRadiusLayer(param) {
//기준점
var bufferPoint = 'POINT('+param.geom.getCoordinates()[0]+' '+param.geom.getCoordinates()[1]+')';
//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=DWITHIN(geom,'+bufferPoint+','+param.radius+',meters)';
//source 생성
var vectorSource = new ol.source.Vector({
format: new ol.format.GeoJSON(),
url : url,
strategy: ol.loadingstrategy.bbox
});
//Layer 생성
var radiusLayer = new ol.layer.Vector({
source : vectorSource,
style : param.style,
name : param.lyrId+'_'+param.radius
});
return radiusLayer;
}
이렇게 하면 연산은 geoserver에서 수행하고 클라이언트는 수행한 결과값만 뿌려주면 되기때문에 좀더 부하가 줄지 않을까 싶다.