Maptalks는 하나의 API 세트를 통해 2D 및 3D 지도를 동시에 렌더링하고 제어할 수 있는 오픈소스 자바스크립트 라이브러리입니다. 플러그인 아키텍처를 통해 레이어, 인터랙션 및 시각화 기능을 자유롭게 확장할 수 있어 GIS 데이터 시각화나 비즈니스 대시보드 구축에 최적화되어 있습니다.
주요 특징 및 활용 사례
- 통합 뷰포트: 동일한 Map 인스턴스에서 피치(Pitch)와 회전(Rotate)을 조절하여 2D 평면 지도에서 3D 시점으로 자연스럽게 전환할 수 있습니다.
- 대용량 데이터 처리: Canvas 2D 기반으로 수만 개의 도형을 처리하며, WebGL 가속을 통해 백만 개 단위의 지형지물을 매끄럽게 렌더링할 수 있습니다.
- 플러그인 생태계: Three.js, ECharts, D3.js와 같은 강력한 시각화 라이브러리를 지도 레이어 형태로 쉽게 결합할 수 있습니다.
- 내장 편집 도구: 점, 선, 면에 대한 그리기(Draw), 편집(Edit), 측정(Measure) 기능을 기본적으로 지원합니다.
핵심 기능 상세
1. 2D/3D 통합 렌더링
Maptalks는 고정된 2D 지도를 넘어 사용자의 인터랙션에 따라 기울임과 회전이 가능한 입체적인 뷰를 제공합니다. 이는 단순한 지도 표시를 넘어 공간 정보의 입체감을 살리는 데 유리합니다.
2. 레이어 시스템 및 데이터 중첩
기본 지도를 위한 TileLayer와 비즈니스 데이터를 위한 VectorLayer를 구분하여 관리합니다. XYZ, WMTS, WMS 등 다양한 타일 서비스 프로토콜을 지원하며, 벡터 레이어 위에는 Marker, LineString, Polygon 등 다양한 기하 객체를 올릴 수 있습니다.
3. 스타일 시스템 (Symbol)
CartoCSS에서 영감을 받은 심볼 시스템을 사용하여 도형의 외관을 정의합니다. 패턴 채우기, 그라데이션, SVG 아이콘, 복합 기호 등을 지원하며 복잡한 시각적 요구사항을 충족합니다.
시작하기
CDN을 이용한 빠른 설정
별도의 빌드 도구 없이 HTML 파일 하나로 지도를 구현하는 방법입니다. 아래 예시는 서울을 중심으로 하는 기본 지도를 생성합니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Maptalks Quick Start</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/maptalks/dist/maptalks.css">
<script src="https://cdn.jsdelivr.net/npm/maptalks/dist/maptalks.min.js"></script>
</head>
<body>
<div id="map-container" style="width: 100%; height: 500px;"></div>
<script>
const mapInstance = new maptalks.Map('map-container', {
center: [126.9780, 37.5665],
zoom: 13,
baseLayer: new maptalks.TileLayer('base', {
urlTemplate: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
subdomains: ['a', 'b', 'c'],
attribution: '© OpenStreetMap contributors'
})
});
</script>
</body>
</html>
npm을 이용한 설치 및 모듈 활용
현대적인 웹 프론트엔드 환경에서는 패키지 매니저를 통해 설치하여 사용할 수 있습니다.
npm install maptalks --save
ES 모듈 방식으로 지도를 초기화하는 코드 예시입니다.
import * as maptalks from 'maptalks';
const spatialMap = new maptalks.Map('viewer', {
center: [127.0276, 37.4979],
zoom: 15,
pitch: 45, // 지도를 45도 기울임
bearing: 30 // 지도를 30도 회전
});
차세대 엔진: maptalks-gl
최신 WebGL/WebGPU 기술을 활용하고자 한다면 maptalks-gl 엔진을 사용할 수 있습니다. 이는 벡터 타일(Vector Tile) 렌더링에 최적화되어 있습니다.
import { Map, GroupGLLayer, VectorTileLayer } from 'maptalks-gl';
const glMap = new Map('gl-canvas', {
center: [0, 0],
zoom: 2
});
const vTileLayer = new VectorTileLayer('vt-layer', {
urlTemplate: 'https://your-tile-server.com/{z}/{x}/{y}.mvt'
});
new GroupGLLayer('gl-group', [vTileLayer]).addTo(glMap);
개발 시 주의사항
- 컨테이너 크기: 지도가 렌더링될 DOM 요소는 반드시 명시적인 CSS 높이(height) 값을 가져야 합니다. 값이 없으면 지도가 화면에 나타나지 않습니다.
- 프로토콜 일치: 웹 페이지가 HTTPS 환경에서 실행될 경우, 타일 서비스 URL(urlTemplate) 역시 HTTPS를 지원해야 보안 차단을 방지할 수 있습니다.
- 성능 최적화: 대량의 지형지물을 다룰 때는
VectorLayer의Canvas렌더링 모드와WebGL모드 중 적절한 방식을 데이터 규모에 맞춰 선택해야 합니다.
기술 스택 및 아키텍처
Maptalks는 Monorepo 구조로 관리되며, 핵심 라이브러리는 packages/maptalks 폴더에 위치합니다. 개발 및 빌드 환경은 다음과 같습니다.
- 런타임: Node.js 18.x 이상 권장
- 패키지 매니저: pnpm 기반 워크스페이스
- 빌드 도구: Rollup 및 Turbo
- 렌더링 기술: Canvas 2D API, WebGL