웹 애니메이션 1/3 ㅡ Transition 방식

이글은 웹에서 화면에 표시된 객체에 대한 애니메이션을 적용하는 방식 중 Transition 방식에 대한 정리입니다. 현대의 UI에 애니메이션을 적용한다는 것은 사용자에게 영감을 불어 넣을 수 있다는 점에 매우 철학적이고 세련된 방법이라고 할 수 있습니다.

먼저 아래의 화면에서 ‘터치미!’ 텍스트(div 요소)를 클릭해 보시기 바랍니다.

[xyz-ihs snippet=”Transition”]

클릭할 때마다 좌에서 우로.. 우에서 좌로 이동하는 것을 살펴볼 수 있습니다. 위의 예제에 대한 코스를 살펴 보겠습니다. 먼저 화면에 표시되는 ‘터치미!’에 대한 div 요소입니다.

터치미!

div에 box라는 클래스를 지정하고 있습니다. box 클래스에 대한 정의는 다음과 같습니다.

    .box {
        font-family: '맑은 고딕';
        text-align: center;
        line-height: 100px;

        width: 100px;
        height: 100px;

        background: #FFF;
        box-shadow: 0 10px 20px rgba(0,0,0,0.5);

        transform: translate(0, 0);
        transition: transform 1000ms;
    }

2번~4번 코드는 div의 ‘터치미!’ 텍스트에 대한 폰트와 정렬을 지정하고 있고, 6번~7번은 div의 너비와 높이에 대한 크기를 지정하고 있습니다. 그리고 9~10번 코드는 div의 색상과 그림자를 표시하도록 하고 있습니다. 12번은 최초의 div의 위치를 (0, 0) 좌표로 지정하고 있습니다. 13번 코드가 바로 애니메이션을 위한 transition(전환)을 지정하고 있는데, transform에 대해 1초(1ms) 동안 애니메이션이 이루어지도록 하고 있습니다. 그러나 여기서는 아직 transform에 대해 어떤 전환이 이루어질지에 대한 코드는 없습니다. 이떤 전환이 이루어지는 시점은 이 div를 클릭할 때인데, 다음의 코드가 필요합니다.

var box = document.querySelector('.box');

box.addEventListener('click', function () {
    box.classList.toggle('move');
});

box.addEventListener('transitionend', function () {
    alert('이동 완료');
}, false);

3번 코드에서 div에 대한 클릭 이벤트를 지정하고 있습니다. 즉, div에 move라는 클래스를 토글링하고 있는데요. 토글링은 해당 값이 지정되어 있으면 제거하고, 지정되어 있지 않으면 지정하는 방식입니다. move 클래스는 다음과 같습니다. (참고로 7번 코드는 하나의 애니메이션이 완료되었을 때 호출되는 함수를 지정하고 있음)

    .box.move {
        transform: translate(400px, 0);
    }

보시면 transform 속성에 대해서 x축으로 400px로 변경하고 있습니다.

Mr.Tiler-Xr로 생성한 TMS 형식의 타일맵을 OpenLayers 2에서 활용하기

일전에 Mr.Tiler-Xr로 생성한 TMS 형식의 타일맵을 OpenLayers 3에서 활용하는 글을 올린 적이 있습니다. 이번에는 OpenLayers 2에서 Mr.Tiler-Xr로 생성한 TMS 형식의 타일맵을 활용하는 글을 정리해 봅니다.

Mr.Tiler-Xr은 수치지도 또는 항공영상을 타일맵으로 가공할 수 있는 툴입니다. 특히 수치지도를 이용하여 서비스에 맞는 지도를 편집하고 디자인할 수 있는 툴이고 타일맵 가공 속도가 타사의 제품에 비해 빠릅니다.

Mr.Tiler-Xr은 직관적이고 단순한 UI를 제공합니다.

직관적이고 단순한 UI를 통해서도 세련된 지도를 디자인할 수 있습니다. 건물에 대한 입체표현, 복합심벌, 라벨의 회전 등과 같은 고급 기능을 심플한 UI를 이용해 쉽게 표현할 수 있습니다.

단순히 지도를 디자인하는 것 뿐만 아니라 공간데이터를 편집할 수 있는 기능도 제공합니다. 대용량의 SHP 파일 자체를 편집할 수 있으며, 편의성을 위해 Undo/Redo 기능과 Snap 기능을 제공합니다.

이와 같은 기능을 갖는 Mr.Tiler-Xr를 이용해 가공한 전국 범위의 지도에 대한 데모의 URL은 아래와 같습니다.

Sample1 / Sample2

Mr.Tiler-Xr을 이용하여 가공한 타일맵을 TMS 형식으로도 가공할 수 있는데 이렇게 가공한 타일맵을 오픈소스인 OpenLayers 3에서 레이어로 표시하는 방법에 대해 정리한 글입니다.

먼저 Mr.Tiler-Xr를 이용하여 생성된 타일맵은 TMS는 Z 폴더 밑에 Y 폴더가 있고 Y 폴더 밑에 X 방향에 대한 256×256 크기의 타일맵 이미지가 png 형식으로 저장되어 있는 구조입니다.

이러한 형식으로 저장된 타일맵을 TMS 스펙을 이용하여 OpenLayers 2에서 레이어로 표시하는 코드는 아래와 같습니다.

function getTmsUrl(bounds) {
    var res = this.map.getResolution();
    var x = Math.round(
        (bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
    var y = Math.round(
        (bounds.bottom - this.maxExtent.bottom) / (res * this.tileSize.h));
    var z = this.map.getZoom() + 1;

    var path = z + "/" + y + "/" + x + "." + this.type;
    var url = this.url;

    //if (url instanceof Array) {
    //    url = this.selectUrl(path, url);
    //}

    return url + path;
}

var layer = new OpenLayers.Layer.TMS(
    "LayerName",
    "http://222.237.78.208:8080/t/",
    { type: 'png', getURL: getTmsUrl }
);

var map = new OpenLayers.Map(
    'map',
    {
        maxExtent: new OpenLayers.Bounds(
            13886285, 3883489, 14695249, 4666659),
        resolutions: [1222, 610.984, 305.492, 152.746, 76.373],
        numZoomLevels: 5
    }
);

map.addLayer(layer);
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.setCenter(new OpenLayers.LonLat(14085657, 3943422), 3);