Leaflet 지도 기본 활용
일、기본 소개
Leaflet은 인터랙티브 지도 애플리케이션을 구축하기 위한 인기 있는 오픈소스 JavaScript 라이브러리입니다. 간결한 API, 가벼운 무게와 높은 성능으로 유명하며, 지리 정보 시각화, 위치 추적 등 다양한 지리 정보 표현 시나리오에 웹페이지에 지도 기능을 통합하기 쉽습니다.
二、주요 기능 요약
1. 지도 로딩
- 기능 설명: OpenStreetMap과 같은 오픈소스 지도부터 Mapbox와 같은 상업적 지도까지 다양한 유형의 지도 타일을 배경 지도로 로드할 수 있습니다.
- 실제 적용: 예를 들어, 여행 웹사이트에서 목적지 도시의 지도를 사용자에게 표시할 수 있습니다. 다음 코드는 OpenStreetMap을 배경으로 로드합니다:
// 지도 컨테이너 생성
var myMap = L.map('mapContainer').setView([35.6812, 139.7671], 13);
// OpenStreetMap 타일 레이어 로드
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
}).addTo(myMap);
이 코드는 먼저 지도 컨테이너를 생성하고, 초기 중심 좌표(위도 35.6812, 경도 139.7671)와 확대 레벨 13을 설정합니다. 그 다음 OpenStreetMap의 타일 레이어를 로드하여 지도에 추가합니다.
2. 마커 추가
- 기능 설명: 간단한 코드를 통해 지도에 마커(Marker)를 추가할 수 있으며, 마커의 아이콘, 위치, 팝업 정보 등을 사용자 정의할 수 있습니다.
- 실제 적용: 식당 추천 웹사이트에서 각 식당을 지도에 마커로 표시할 수 있습니다. 식당 데이터가 이름, 위치(위도/경도), 소개를 포함하는 배열이라면 다음과 같이 코드를 작성할 수 있습니다:
var diningLocations = [
{
name: "한식당 A", lat: 37.5665, lng: 126.9780, description: "전통 한식 제공"},
{
name: "양식당 B", lat: 37.5723, lng: 126.9882, description: "미식 스테이크 전문"}
];
diningLocations.forEach(function(location) {
var restaurantMarker = L.marker([location.lat, location.lng]).addTo(myMap);
restaurantMarker.bindPopup("<b>" + location.name + "</b><br>" + location.description);
});
여기서는 식당 데이터 배열을 순회하여 각 식당에 대한 마커를 생성하고 지도에 추가하며, 팝업 상자를 바인딩합니다. 사용자가 마커를 클릭하면 팝업 상자에 식당 이름과 소개가 표시됩니다.
3. 레이어 제어
- 기능 설명: 지도의 여러 레이어를 관리할 수 있으며, 추가, 제거, 표시 및 숨김 등의 작업을 통해 사용자가 필요에 따라 다양한 지리 정보를 확인할 수 있습니다.
- 실제 적용: 도시 계획 애플리케이션에서 기본 지형 레이어, 교통 레이어, 건물 레이어가 있습니다. 다음과 같이 레이어를 제어할 수 있습니다:
// 기본 지형 레이어 로드
var terrainLayer = L.tileLayer('https://{s}.tile.example.com/terrain/{z}/{x}/{y}.png', {
attribution: '지형 레이어 출처'
}).addTo(myMap);
// 교통 레이어 로드
var transitLayer = L.tileLayer('https://{s}.tile.example.com/transit/{z}/{x}/{y}.png', {
attribution: '교통 레이어 출처'
});
// 건물 레이어 로드
var structureLayer = L.tileLayer('https://{s}.tile.example.com/structures/{z}/{x}/{y}.png', {
attribution: '건물 레이어 출처'
});
// 레이어 제어 객체 생성 및 레이어 추가
var layerController = L.control.layers({
"기본 지형": terrainLayer
}, {
"교통 정보": transitLayer,
"건물 정보": structureLayer
}).addTo(myMap);
이 예제에서는 기본 지형, 교통, 건물 세 가지 레이어를 생성했습니다. L.control.layers를 사용하여 레이어 제어 객체를 만들고 교통 및 건물 레이어를 추가했습니다. 사용자는 인터페이스의 레이어 제어 부품을 통해 교통 및 건물 레이어의 표시 여부를 선택할 수 있습니다.
4. 도형 그리기
- 기능 설명: 지도에 점, 선, 다각형 등 다양한 기하 도형을 그릴 수 있으며, 그린 도형을 편집하고 속성을 설정할 수 있습니다.
- 실제 적용: 토지 측정 애플리케이션에서 사용자가 지도에 토지 경계를 그릴 수 있습니다. 코드는 다음과 같습니다:
// 다각형 그리기 기능 활성화
var drawnShapes = new L.FeatureGroup();
myMap.addLayer(drawnShapes);
var drawController = new L.Control.Draw({
edit: {
featureGroup: drawnShapes
},
draw: {
polygon: true,
polyline: true,
rectangle: true,
circle: true
}
});
myMap.addControl(drawController);
// 그리기 완료 이벤트 리스너
myMap.on('draw:created', function (event) {
var shapeLayer = event.layer;
drawnShapes.addLayer(shapeLayer);
// 여기서 그린 도형의 좌표 정보를 가져와 후속 처리를 할 수 있습니다
});
이 코드는 지도에 다각형을 그리는 기능을 활성화하고, 그린 도형을 저장하기 위해 FeatureGroup을 생성합니다. 사용자가 다각형을 그리면 해당 도형을 FeatureGroup에 추가하고, 토지 면적 계산 등 후속 처리를 위해 도형의 좌표 정보를 가져올 수 있습니다.
5. 데이터 집계
- 기능 설명: 지도의 대량 지점 데이터를 집계하여 시각적 혼란을 줄이며, 일정한 거리나 규칙에 따라 여러 지점을 하나의 표시 요소로 합치고 집계된 정보를 표시합니다.
- 실제 적용: 인구 밀도 표시 애플리케이션에서 대량의 인구 분포 지점 데이터가 있습니다. 다음과 같이 특정 지리적 영역(예: 동네) 단위로 집계할 수 있습니다:
// 인구 분포 지점 배열 points가 있다고 가정 (각 지점은 위치(위도/경도)와 인구 수 속성을 가짐)
var populationHexbin = L.hexbinLayer(points, {
radius: 150, // 집반경 (단위는 지도 투영에 따라 다름)
valueFn: function(point) {
return point.population; }, // 집계 지점의 인구 수를 집계값으로 사용
tooltipFn: function(hexagon) {
return "인구 수: " + hexagon.length; } // 집계 후 툴팁 정보
}).addTo(myMap);
여기서 L.hexbinLayer 함수를 사용하여 인구 분포 지점을 집계합니다. 반경 범위 내의 지점을 하나의 육각형으로 집계하고 인구 수를 집계값으로 사용하며, 사용자가 마우스를 집계된 육각형 위로 가져가면 인구 수 관련 정보가 표시되도록 툴팁을 설정합니다.
6. 특수 효과
- 기능 설명: 지도 또는 지도 요소에 그림자, 발광, 애니메이션 등 다양한 특수 효과를 추가하여 지도의 시각적 효과와 상호작용성을 향상시킵니다.
- 실제 적용: 야경 지도 애플리케이션에서 도시 건물 레이어에 발광 효과를 추가하여 건물을 더 입체적으로 보이게 합니다. 건물 레이어가 사용자 정의 벡터 레이어
buildingVectorLayer라고 가정하면:
// 건물 레이어에 발광 효과 추가 (타사 플러그인이나 사용자 정의 CSS 스타일 필요)
buildingVectorLayer.setStyle({
'fill-opacity': 0.7,
'stroke': 'yellow',
'stroke-width': 3,
'box-shadow': '0 0 15px yellow' // 발광 효과 CSS 스타일 추가
});
건물 레이어의 스타일을 설정하여 발광 효과를 추가하고 지도에서 더 눈에 띄게 만들어 야경의 시각적 효과를 연출합니다. 동시에 다양한 시나리오와 요구에 따라 지도 확대/축소 시의 부드러운 전환 애니메이션과 같은 다른 유형의 효과를 추가할 수 있습니다.
실제 적용 예시
Leaflet 지도 로딩 기능에 대한 몇 가지 적용 예시는 다음과 같습니다:
1. 여러 출처의 지도 레이어 로드 및 전환
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Leaflet 다중 지도 레이어 예제</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
<style>
#mapContainer {
height: 500px;
width: 100%;
}
</style>
</head>
<body>
<div id="mapContainer"></div>
<script>
var map = L.map('mapContainer').setView([37.5665, 126.9780], 12);
// OpenStreetMap 레이어
var osmLayer = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
});