[OpenLayers] 지오메트리(Geometry)에 대한 공간 연산(JSTS.js 사용)

ol에서 지오메트리에 대해 buffer나 union 등과 같은 공간 연산 기능에 대한 API를 정리합니다. 공간 연산 기능은 JSTS.js라는 별도의 라이브러리를 통해 수행합니다. JSTS.js는 Java의 JTS 라이브러리를 Javascript 언어로 포팅한 라이브러리입니다. 이글은 공간 연산을 위한 지오메트리를 생성하기 위해 “마우스로 Vector 생성하기(그리기)”라는 글의 코드를 약간 변형하여 사용합니다. ol에서 마우스로 도형을 그리는 API의 설명은 이 글을 참고 하기 바랍니다.

먼저 실행 결과를 아래의 동영상을 통해 살펴볼 수 있습니다.

사용자가 Buffer 연산을 적용할 지오메트리를 그리면 바로 200m 만큼 Buffer 연산이 적용되어 화면에 표시됩니다. 이를 위해 먼저 index.html 파일을 아래처럼 구성합니다.



    
        
        OpenLayers
        

        
    
    
        

20번 라인에 jsts.js 라이브러리 스크립트를 추가하고 있습니다. index.js 파일에 대해 설명하면 다음과 같습니다.

먼저 필요한 모듈을 추가합니다.

import 'ol/ol.css';
 
import Map from 'ol/Map.js';
import View from 'ol/View.js';
import Draw from 'ol/interaction/Draw.js';
import {Tile as TileLayer, Vector as VectorLayer} from 'ol/layer.js';
import {OSM, Vector as VectorSource} from 'ol/source.js';
import WKT from 'ol/format/WKT.js';

그리고 레이어와 지도를 구성합니다.

var raster = new TileLayer({
    source: new OSM()
});

var source = new VectorSource({wrapX: false});
 
var vector = new VectorLayer({
    source: source
});

var map = new Map({
    layers: [raster, vector],
    target: 'map',
    view: new View({
        center: [-11000000, 4600000],
        zoom: 15
    })
});

다음으로 그리고자 하는 도형의 종류를 선택하는 UI의 이벤트 처리와 도형을 그리는 Draw 클래스 타입을 위한 draw 변수를 정의합니다.

var typeSelect = document.getElementById('type');
 
typeSelect.onchange = function() {
    map.removeInteraction(draw);
    addInteraction();
};
 
addInteraction();

var draw;

지금까지는 “마우스로 Vector 생성하기(그리기)”의 내용과 큰 차이가 없습니다. 이제 변경된 가장 중요한 부분인 addInteraction 함수는 아래와 같습니다.

function addInteraction() {
    var value = typeSelect.value;
 
    if (value !== 'None') {
        draw = new Draw({
            source: source,
            type: typeSelect.value,
            freehand: true
        });

        draw.on('drawend', function(e) {
            var format = new WKT();
            var feature = e.feature;
            var wkt = format.writeFeature(feature);
            var reader = new jsts.io.WKTReader()
            var jstsGeom = reader.read(wkt)
            var buffered = jstsGeom.buffer(200);
            var writer = new jsts.io.WKTWriter()
            var bufferedWKT = writer.write(buffered);
            var bufferedFeature = format.readFeature(bufferedWKT);

            feature.setGeometry(bufferedFeature.getGeometry());
        });

        map.addInteraction(draw);
    }
}

마우스를 통한 도형 그리기가 완료되면 11번 코드에 등록된 drawend 이벤트 함수가 호출됩니다. 이 이벤트 함수에서 그려진 도형을 WKT로 변환하고 JSTS.js에서 해석할 수 있는 지오메트로로 변환한 후 Buffer 연산을 수행합니다. 그리고 이를 다시 WKT로 변환하고 ol의 지오메트리로 변환하는 과정을 거치게 됩니다. 실행하면 앞서 살펴본 영상과 동일한 결과를 볼 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다