[OpenLayers] 지도 상에 10만개의 별 그리기에 대한 속도 테스트

OpenLayers의 지도 속도를 테스트 하기 위해 10만개의 별을 배경지도 상에 그려보는 코드를 작성해 보았습니다.

먼저 실행에 대한 동영상은 아래와 같습니다. 실행은 크롬에서 했고, 2016년 6월 경에 구입한 DELL 노트북인 XPS 9550을 사용했습니다.

웹임에도 상당이 빠릅니다. 이유는 소스코드를 살펴보면 파악할 수 있습니다. 먼저 index.html 입니다.



    
        
        OpenLayers
        
    
                    
        

index.js에 대한 코드의 설명은 하나씩 언급해 보면, 먼저 필요한 모듈을 선언합니다.

import 'ol/ol.css';
 
import Feature from 'ol/Feature.js';
import Map from 'ol/WebGLMap.js';
import View from 'ol/View.js';
import Point from 'ol/geom/Point.js';
import VectorLayer from 'ol/layer/Vector.js';
import VectorSource from 'ol/source/Vector.js';
import {Fill, RegularShape, Stroke, Style} from 'ol/style.js';
import {Tile} from 'ol/layer.js';
import {XYZ} from 'ol/source.js';

그리고 10만개의 포인트를 표시할 스타일로 별 모양으로 지정하는 코드입니다. 이미지가 아닌 실행중에 별형상을 생성해 스타일로 사용하는 것입니다.

var style = new Style({
    image: new RegularShape({
        points: 5,
        scale: 1,
        radius: 10,
        radius2: 4,
        fill: new Fill({
            color: 'rgba(255, 255, 0, 1)'
        }),
        stroke: new Stroke({
            color: 'rgba(0, 0, 0, 1)',
            width: 2
        })
    })
});

다음은 10만개의 포인트 피쳐를 생성합니다. 좌표는 여의도를 덮을 정도의 영역으로 잡았습니다.

var featureCount = 100000;
var features = new Array(featureCount);
var feature, geometry;

for (var i = 0; i < featureCount; ++i) {
    geometry = new Point([14078579 + Math.random()*100000, 4487570 +  Math.random()*50000]);
    feature = new Feature(geometry);
    feature.setStyle(style);
    features[i] = feature;
}

위의 피쳐 데이터를 담기 위한 데이터소스와 이 데이터소스를 표현하기 위한 레이어 객체를 생성합니다.

var vectorSource = new VectorSource({
    features: features
});

var vector = new VectorLayer({
    source: vectorSource
});

배경지도도 표현해줘야 의미있는 테스트가 될듯하여 VWorld의 배경지도를 살짝 가져다 썻습니다.

var base = new Tile({
    source: new XYZ({
      url: 'http://xdworld.vworld.kr:8080/2d/Base/service/{z}/{x}/{y}.png'
    })
});

앞서 생성한 레이어들을 조합해 지도 객체를 생성하면 끝입니다.

var map = new Map({
    layers: [base, vector],
    target: document.getElementById('map'),
    view: new View({
        center:  [14128579.82, 4512570.74],
        zoom: 15
    })
});

속도가 빠른 이유는 2가지입니다. 첫째는 IE가 아닌 크롬에서 테스트 했다는 것인데, 그렇다고 IE에서 실행해보면 아예 실행이 안되는 것은 아니고 크롬보다 살짝 느릴 뿐입니다. 하지만 향후 IE가 크롬의 렌더링 기술을 사용할 것이므로 IE도 크롬만큼 빨라질 것으로 기대합니다. 두번째 이유는 OpenLayers의 지도 객체가 WebGLMap 타입이라는 것입니다. 가장 처음 언급된 코드의 모듈 추가에서 ol/Map.js 대신 ol/WebGLMap.js에서 Map 클래스를 가져왔기 때문입니다.

“[OpenLayers] 지도 상에 10만개의 별 그리기에 대한 속도 테스트”에 대한 4개의 댓글

  1. 안녕하세요. 완전 초보 개발자입니다.

    import ‘ol/ol.css’;

    import Feature from ‘ol/Feature.js’;
    import Map from ‘ol/WebGLMap.js’;
    import View from ‘ol/View.js’;
    import Point from ‘ol/geom/Point.js’;
    import VectorLayer from ‘ol/layer/Vector.js’;
    import VectorSource from ‘ol/source/Vector.js’;
    import {Fill, RegularShape, Stroke, Style} from ‘ol/style.js’;
    import {Tile} from ‘ol/layer.js’;
    import {XYZ} from ‘ol/source.js’;

    이 문법은 node.js 사용해야 가능한건가요?
    전자정부프레임워크에서
    ol/WebGLMap.js를 임포트하는 방법이 있을까요?

    1. 안녕하세요..
      패키지는 모두 npm을 통해 설치가능하므로 ol 역시 npm으로 설치하면 되긴합니다.
      그런데 전자정부프레임같은 경우 npm을 통한 패키지 설치를 할 수 없는 상황이라면…
      일반적인 js 라이브러리를 script 태그의 src로 불러와 사용하는 방식도 가능합니다.
      ol에서 이 방식을 검색해 보시면 해결책을 얻으실수있을듯합니다.

        1. 안녕하세요..
          이 당시에 버전 6을 사용했던것으로 기억합니다.
          벌써 수년이 지났으니 다른 이유가 없다면 최신 버전을 사용하시는게 좋습니다.

답글 남기기

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