경쟁사 앱에서 본 모든 맵은 동일한 기본 스타일을 사용합니다. 일반적인 베이지색 도로, 중간 색조의 청록색 물, 자체 UI와 주의를 다투는 어수선한 POI 아이콘, 이것들은 아무도 불쾌하게 하지 않고 아무도 기쁘게 하지 않도록 설계된 범용 기본값입니다. 이것들은 하나를 명확하게 전달합니다. 이 제품은 맵 라이브러리를 사용하고 있으며, 맵 경험을 소유하고 있지 않습니다.
커스텀 맵 스타일링은 이것을 바꿉니다. 물류 대시보드의 다크 모드 맵, 부동산 앱의 브랜드 그린 도로 네트워크, 귀속 워터마크가 있었던 자리에 로고가 있는 깔끔한 미니멀리스트 스타일, 이런 세부 사항이 도구를 제품으로 승화시킵니다.
이 튜토리얼은 MapAtlas가 구현한 Mapbox Style Specification을 스타일 JSON 구조부터 React에서 완전한 라이트/다크 토글까지 안내합니다. GIS 경험이 필요하지 않습니다. JSON과 JavaScript에 익숙하면 됩니다.
아직 기본 맵을 설정하지 않았다면 먼저 웹사이트에 인터랙티브 맵 추가하기를 시작하고 스타일링을 위해 여기로 돌아오세요.
기본 맵 스타일이 일반적으로 보이는 이유
타일 제공자의 기본 스타일은 가능한 가장 광범위한 맥락에서 가능한 가장 광범위한 청중을 위해 보편적으로 읽기 쉽도록 설계되었습니다. 미적 의견보다 정보 밀도를 우선시합니다. 도로가 보여야 합니다. 레이블은 대비가 있어야 합니다. POI 아이콘은 인식 가능해야 합니다.
이러한 목표 중 어느 것도 제품의 목표와 일치하지 않습니다. 앱은 맵에 있는 것의 작은 부분 집합, 배송 경로, 부동산 위치, 의료 시설에 관심이 있으며 다른 모든 것은 시각적 노이즈입니다.
커스텀 스타일링은 필요하지 않은 것을 억제하고, 필요한 것을 강조하며, 맵이 서드파티 위젯으로 삽입된 것이 아니라 제품의 일부로 읽히도록 합니다.
스타일 사양 이해하기
MapAtlas 스타일은 다섯 가지 핵심 섹션이 있는 JSON 문서입니다.
{
"version": 8,
"name": "My Brand Style",
"sources": { ... },
"glyphs": "https://tiles.mapatlas.eu/fonts/{fontstack}/{range}.pbf?key=YOUR_API_KEY",
"sprite": "https://tiles.mapatlas.eu/sprites/basic?key=YOUR_API_KEY",
"layers": [ ... ]
}
sources: 맵 데이터가 어디서 오는지 (MapAtlas 벡터 타일 엔드포인트)glyphs: 레이블 렌더링을 위한 폰트 파일을 로드하는 곳sprite: POI 마커를 위한 아이콘 이미지를 로드하는 곳layers: 각각 페인트 및 레이아웃 속성이 있는 시각적 레이어의 순서가 있는 목록
layers 배열이 대부분의 시간을 보내는 곳입니다. 각 레이어는 데이터 유형(fill, line, symbol, circle, fill-extrusion), 어떤 소스 피처를 그릴지, 어떻게 페인팅할지를 지정합니다.
다음은 벡터 타일 베이스를 렌더링하는 최소하지만 완전한 스타일입니다.
{
"version": 8,
"name": "Brand Base",
"sources": {
"mapatlas": {
"type": "vector",
"tiles": ["https://tiles.mapatlas.eu/v1/tiles/{z}/{x}/{y}.mvt?key=YOUR_API_KEY"],
"minzoom": 0,
"maxzoom": 14
}
},
"glyphs": "https://tiles.mapatlas.eu/fonts/{fontstack}/{range}.pbf?key=YOUR_API_KEY",
"sprite": "https://tiles.mapatlas.eu/sprites/basic?key=YOUR_API_KEY",
"layers": [
{
"id": "background",
"type": "background",
"paint": { "background-color": "#f5f0eb" }
}
]
}
이것은 선택한 배경색의 빈 캔버스를 렌더링합니다. 여기서부터 물, 토지 이용, 도로, 건물, 레이블을 위한 레이어를 추가합니다.
다크 모드: 핵심 색상 변경하기
다크 모드 맵은 단순히 반전된 래스터 이미지가 아닙니다. 동일한 벡터 지오메트리에 적용되는 완전히 다른 페인트 속성 세트입니다. 이것이 벡터 타일이 존재하는 핵심 이유 중 하나입니다. 하나의 타일, 무한한 시각적 해석.
다크 테마를 위해 업데이트해야 하는 주요 색상:
| 레이어 | 라이트 모드 | 다크 모드 |
|---|---|---|
| 배경 (육지) | #f5f0eb | #1a1a2e |
| 물 | #a8d5e5 | #0d3b66 |
| 도시 토지 이용 | #e8e0d5 | #16213e |
| 공원/녹지 | #c8e6c9 | #1b4332 |
| 도로 (주요) | #ffffff | #3a3a5c |
| 도로 (부) | #efefef | #2d2d4a |
| 도로 레이블 | #333333 | #cccccc |
스타일 레이어에 이것을 적용하는 방법:
{
"id": "water",
"type": "fill",
"source": "mapatlas",
"source-layer": "water",
"paint": {
"fill-color": "#0d3b66",
"fill-opacity": 1
}
}
{
"id": "road-major",
"type": "line",
"source": "mapatlas",
"source-layer": "transportation",
"filter": ["==", "class", "primary"],
"layout": {
"line-join": "round",
"line-cap": "round"
},
"paint": {
"line-color": "#3a3a5c",
"line-width": ["interpolate", ["linear"], ["zoom"], 10, 1, 16, 4]
}
}
line-width의 interpolate 표현식은 줌 레벨에 따라 도로 너비를 조정합니다. 낮은 줌에서는 좁고, 줌 인하면 더 넓어집니다. 추가 네트워크 요청 없이 데이터 기반 스타일링입니다.
브랜드 색상 적용하기
대부분의 디자인 시스템은 기본 색상(예: #97C70A), 보조 색상, 중립 팔레트를 정의합니다. 맵은 동일한 값을 사용해야 하며, 근사치가 아닌 정확한 값이어야 합니다.
브랜드 색상 적용을 위해 이러한 레이어를 타겟으로 하세요.
브랜드 요소로서의 도로. 브랜드 색상이 충분히 생생하다면 주요 도로나 강조된 경로에 사용하세요.
{
"id": "road-highlighted",
"type": "line",
"source": "mapatlas",
"source-layer": "transportation",
"filter": ["==", "class", "primary"],
"paint": {
"line-color": "#97C70A",
"line-width": 3,
"line-opacity": 0.8
}
}
커스텀 POI 마커. 커스텀 스프라이트 시트를 호스팅하고 sprite URL을 업데이트하여 기본 스프라이트 아이콘을 자체 아이콘으로 교체하세요. 그런 다음 심볼 레이어에서 아이콘을 참조하세요.
{
"id": "brand-poi",
"type": "symbol",
"source": "mapatlas",
"source-layer": "poi",
"layout": {
"icon-image": "brand-pin",
"icon-size": 1.2,
"text-field": ["get", "name"],
"text-font": ["Inter Bold", "Noto Sans Regular"],
"text-size": 12,
"text-offset": [0, 1.5],
"text-anchor": "top"
},
"paint": {
"text-color": "#97C70A",
"text-halo-color": "#1a1a2e",
"text-halo-width": 1
}
}
맵 레이블을 위한 커스텀 폰트
기본 맵 레이블 폰트는 일반적입니다. 브랜드에서 Inter, Roboto 또는 커스텀 서체를 사용한다면 맵 레이블에도 사용할 수 있습니다.
MapAtlas는 표준 Mapbox 글리프 형식을 지원하는 자체 글리프 엔드포인트에서 글리프를 제공합니다. 커스텀 폰트를 사용하려면:
fontnik과 같은 도구를 사용하여 서체에서.pbf글리프 파일을 생성하세요.- CDN 또는 자체 서버에 글리프 파일을 호스팅하세요.
- 스타일 JSON의
glyphs필드를 업데이트하세요.
{
"glyphs": "https://your-cdn.com/fonts/{fontstack}/{range}.pbf"
}
- 심볼 레이어의
text-font속성에서 폰트를 참조하세요.
"text-font": ["Inter Bold", "Noto Sans Regular"]
항상 대체 폰트를 제공하세요(Noto Sans는 기본 폰트에 없을 수 있는 유니코드 문자를 다룹니다). 렌더러는 각 문자에 대해 글리프를 포함하는 배열의 첫 번째 폰트를 사용합니다.
워터마크 및 귀속 제거하기
MapAtlas는 완전한 화이트 라벨 배포를 허용합니다. 맵에서 MapAtlas 로고를 완전히 제거할 수 있습니다.
SDK에서 귀속은 비활성화할 수 있는 컨트롤로 처리됩니다.
const map = new mapmetricsgl.Map({
container: 'map',
style: 'https://tiles.mapatlas.eu/styles/basic/style.json?key=YOUR_API_KEY',
center: [4.9041, 52.3676],
zoom: 12,
attributionControl: false, // Remove the default attribution control
});
귀속을 유지하되 UI에 맞게 스타일링하려면, 기본 컨트롤을 숨기고 자체 컨트롤을 추가하세요.
map.addControl(
new mapmetricsgl.AttributionControl({
customAttribution: 'Map data © OpenStreetMap contributors',
compact: true,
}),
'bottom-left'
);
이것은 브랜딩을 OpenStreetMap의 라이선스를 존중하면서 UI에 맞는 최소한의 법적 준수 귀속으로 대체합니다. 플랜에 관계없이 항상 로고를 보이게 요구하는 Google Maps와 달리, MapAtlas는 완전한 제어권을 제공합니다.
React에서 라이트/다크 테마 토글
다음은 CSS 커스텀 속성을 사용하여 나머지 UI와 테마를 동기화하며 라이트/다크 토글이 있는 맵을 관리하는 완전한 React 컴포넌트입니다.
import { useEffect, useRef, useState } from 'react';
import mapmetricsgl from '@mapmetrics/mapmetrics-gl';
import '@mapmetrics/mapmetrics-gl/dist/mapmetrics-gl.css';
const STYLES = {
light: 'https://tiles.mapatlas.eu/styles/basic/style.json?key=YOUR_API_KEY',
dark: 'https://tiles.mapatlas.eu/styles/dark/style.json?key=YOUR_API_KEY',
};
export function BrandedMap({ center = [4.9041, 52.3676], zoom = 12 }) {
const containerRef = useRef(null);
const mapRef = useRef(null);
const [theme, setTheme] = useState('light');
useEffect(() => {
const map = new mapmetricsgl.Map({
container: containerRef.current,
style: STYLES.light,
center,
zoom,
attributionControl: false,
});
map.addControl(
new mapmetricsgl.AttributionControl({ compact: true }),
'bottom-left'
);
mapRef.current = map;
return () => map.remove();
}, []);
useEffect(() => {
if (mapRef.current) {
mapRef.current.setStyle(STYLES[theme]);
}
}, [theme]);
return (
<div style={{ position: 'relative' }}>
<div ref={containerRef} style={{ width: '100%', height: '500px' }} />
<button
onClick={() => setTheme(t => t === 'light' ? 'dark' : 'light')}
style={{
position: 'absolute',
top: 12,
right: 12,
padding: '8px 16px',
background: theme === 'dark' ? '#ffffff' : '#1a1a2e',
color: theme === 'dark' ? '#1a1a2e' : '#ffffff',
border: 'none',
borderRadius: 6,
cursor: 'pointer',
zIndex: 1,
}}
>
{theme === 'light' ? 'Dark mode' : 'Light mode'}
</button>
</div>
);
}
setStyle 호출은 새 색상 구성으로 맵을 다시 렌더링합니다. 이미 캐시에 있는 타일 데이터는 다시 가져오지 않습니다. 시각적 해석만 변경됩니다.
커스텀 스타일 JSON 호스팅
완전한 제어를 위해 스타일 JSON을 CDN 또는 S3 버킷의 정적 파일로 호스팅하세요. 이를 통해:
- 애플리케이션 코드와 함께 스타일을 버전 관리할 수 있습니다.
- 애플리케이션을 재배포하지 않고 시각적 디자인을 업데이트할 수 있습니다(호스팅된 JSON만 업데이트).
- 다른 환경(미리보기 vs. 프로덕션)에 다른 스타일을 사용할 수 있습니다.
런타임에 호스팅된 스타일 로드:
const map = new mapmetricsgl.Map({
container: 'map',
style: 'https://your-cdn.com/styles/brand-dark.json',
center: [4.9041, 52.3676],
zoom: 12,
});
유일한 제약은 CORS입니다. 스타일 JSON은 브라우저가 크로스 오리진으로 가져올 수 있도록 Access-Control-Allow-Origin: *(또는 특정 도메인)으로 제공되어야 합니다.
스타일 개발 워크플로
커스텀 스타일을 구축하는 가장 빠른 방법은 반복적이며, 코드를 다시 작성하지 않고 실시간으로 변경 사항을 확인합니다.
- MapAtlas 기본 스타일 JSON을 기반으로 시작하세요.
https://tiles.mapatlas.eu/styles/basic/style.json?key=YOUR_API_KEY를 가져와서 다운로드하세요. - 편집기에서 JSON을 편집하면서 어떤 레이어가 어떤 시각적 요소에 영향을 미치는지 확인하세요.
- 수정된 스타일 JSON으로 맵을 다시 로드하여 결과를 확인하세요.
- 안정되면 스타일 JSON을 리포지토리에 커밋하고 CDN에 호스팅하세요.
더 깊은 커스터마이징을 위해 전체 레이어 참조, 페인트 속성 유형 및 표현식 구문은 맵 시각화 및 스타일링 문서를 확인하세요.
Mapbox에서 넘어와서 변경된 것을 궁금해한다면, Mapbox vs. MapAtlas: EU 프로젝트에 적합한 지도 API는?에서 기능과 가격의 병렬 비교를 확인하세요.
벡터 타일이 이 모든 것을 가능하게 하는 아키텍처적 근거에 대해서는 벡터 타일 vs. 래스터 타일이 렌더링 파이프라인을 자세히 설명합니다.
요약
커스텀 맵 스타일링은 사치품이 아닙니다. 서드파티 위젯처럼 느껴지는 맵과 제품을 위해 구축된 것처럼 느껴지는 맵 사이의 차이입니다. MapAtlas를 사용하면:
- 스타일 사양은 Mapbox GL JS 툴링과 호환되는 표준 JSON입니다.
- 다크 모드는 스타일 JSON 교체이지 새로운 타일 세트나 서버 구성이 아닙니다.
- 브랜드 색상은 페인트 속성을 통해 도로, 레이블, POI 아이콘에 적용됩니다.
- 커스텀 폰트는 제어하는 모든 글리프 엔드포인트에서 로드됩니다.
- 워터마크와 귀속은 완전히 구성 가능하며, 화이트 라벨은 모든 유료 플랜에서 지원됩니다.
- 전체 스타일은 페이지 다시 로드 없이 런타임에 토글할 수 있습니다.
오늘 브랜드 맵 구축을 시작하세요. 무료 MapAtlas API 키 신청으로 시작점으로 기본 스타일 JSON을 로드하세요. 첫 번째 커스텀 스타일은 올바르게 만드는 데 약 30분이 걸리고, 이후 반복은 몇 분이면 됩니다.
자주 묻는 질문
MapAtlas 워터마크를 맵에서 제거할 수 있나요?
네. Google Maps 및 일부 Mapbox 플랜과 달리, MapAtlas는 필수 귀속 워터마크 없이 완전한 화이트 라벨 맵을 허용합니다. 로고를 완전히 제거하고 자체 브랜딩으로 교체할 수 있습니다.
MapAtlas 스타일 형식이 Mapbox GL JS 스타일과 호환되나요?
네. MapAtlas는 Mapbox GL JS 및 MapLibre GL에서 사용하는 것과 동일한 JSON 형식인 Mapbox Style Specification을 사용합니다. 기존 Mapbox 스타일 JSON은 소스 URL만 업데이트하면 MapAtlas와 함께 작동합니다.
페이지를 다시 로드하지 않고 라이트 및 다크 맵 스타일 간에 전환할 수 있나요?
네. 새 스타일 URL 또는 객체로 map.setStyle()을 호출하세요. 맵이 이미 캐시된 타일 데이터를 다시 가져오지 않고 새 시각적 구성으로 다시 렌더링됩니다. CSS 커스텀 속성과 결합하면 테마 인식 맵 컴포넌트가 완성됩니다.

