이번 글에서는 정보와 범례 창을 추가해 보도록 하겠습니다.
leaflet은 지도 창 위에 보여지는 요소 중 지도를 제외하고 모두 컨트롤로 취급합니다. 정보와 범례 모두 html 요소 중 div 태그(tag)를 사용한 요소입니다.
정보 컨트롤은 마우스 커서를 해당 구에 올려 놓으면 해당 구의 영역을 하일라이트로 표시하고 구 이름과 통계 지표값(예제에서는 value)을 표시합니다. 범례 컨트롤은 지도 화면 우측 하단에 지표 단계별 색상 목록을 표시합니다.
이전 예제와 다른 점은 우선 브이월드 제공 배경지도 중 회색 배경지도를 사용해 통계가 좀 더 확연히 드러나게 수정했습니다. 첨부한 소스 배경지도 설정 부분에 vworldLayer URL주소에 보시면 2d/Base -> 2d/gray로 바뀐 부분을 참고하시면 됩니다. Base, gray 외에도 midnight(야간), Hybrid(하이브리드), Satellite(항공사진)을 배경지도로 제공하고 있습니다.
주요 자바스크립트 소스는 아래와 같습니다.
function getColor(v) {
return v > 100 ? '#800026' :
v > 80 ? '#BD0026' :
v > 60 ? '#E31A1C' :
v > 40 ? '#FC4E2A' :
v > 20 ? '#FD8D3C' :
v > 0 ? '#FEB24C' :
'#FED976';
}
geojson = L.geoJson(data, {
style: function (feature) {
var v = feature.properties.value;
var fColor = getColor(v);
return {
"fillColor": fColor,
"weight": 2,
"opacity": 1,
"color": 'white',
"dashArray": '3',
"fillOpacity": 0.7
}
},
onEachFeature: function(feature, layer) {
layer.on({
"mouseover": function(e) {
var layer = e.target;
layer.setStyle({
weight: 5,
color: '#1AA160',
dashArray: '',
fillOpacity: 0.7
});
if (!L.Browser.ie && !L.Browser.opera && !L.Browser.edge) {
layer.bringToFront();
}
info.update(layer.feature.properties);
},
"mouseout":function(e) {
geojson.resetStyle(e.target);
info.update();
},
"click":function(e) {
map.fitBounds(e.target.getBounds());
}
});
}
}).addTo(map);
// 정보 표시 컨트롤 추가
var info = L.control();
info.onAdd = function (map) {
this._div = L.DomUtil.create('div', 'info');
this._div.style = 'padding: 6px 8px;font: 14px/16px Arial, Helvetica, sans-serif;background: white;background: rgba(255,255,255,0.8);box-shadow: 0 0 15px rgba(0,0,0,0.2);border-radius: 5px;';
this.update();
return this._div;
};
// method that we will use to update the control based on feature properties passed
info.update = function (props) {
this._div.innerHTML = '<h4 style="margin: 0 0 5px;color: #777;">서울시 구별 통계</h4>' + (props ?
'<b>' + props.adm_nm + '</b><br />' + props.value + '%'
: '마우스를 올려보세요.');
};
info.addTo(map);
// 범례 표시 컨트롤 추가
var legend = L.control({position: 'bottomright'});
legend.onAdd = function (map) {
var div = L.DomUtil.create('div', 'info legend'),
grades = [0, 20, 40, 60, 80, 100],
labels = [];
div.style = "padding: 6px 8px;background: white;background: rgba(255,255,255,0.8);line-height: 18px;color: #555;";
for (var i = 0; i < grades.length; i++) {
div.innerHTML +=
'<i style="width: 18px;height: 18px;float: left;margin-right: 8px;opacity: 0.7;background:' + getColor(grades[i] + 1) + '"></i> ' +
grades[i] + (grades[i + 1] ? '–' + grades[i + 1] + '%<br>' : '+');
}
return div;
};
legend.addTo(map);
소스코드를 대략적으로 설명 드리면,
1~9: 값에 따른 색상값 리턴
24~50: 서울 시 구별로 마우스 커서를 올렸을 때, 빠졌을 때, 클릭했을 때 action을 정의
53~70: 지도 오른쪽 상단에 표시할 정보 창(컨트롤) 추가
72~91: 지도 오른쪽 하단에 범례 창(컨트롤) 추가
이번 통계지도는 leaflet 홈페이지에 있는 통계지도 샘플을 기초로 만들었으면, 배경지도는 오픈플랫폼, 행정구역 경계는 통계청 자료를 참고해서 만들었습니다. 다른 샘플, 데이터, 예제는 해당 사이트를 참고하시면 되겠습니다.
'코딩 강좌 > 웹 지도 만들기' 카테고리의 다른 글
지도 위에 경로를 그리고 회전시키는 웹 앱 만들기 (0) | 2024.11.05 |
---|---|
다각형 외부의 점에서 가장 가까운 점 다각형 내 위치 찾기 (1) | 2024.11.04 |
leaflet - #10 통계지도 만들기 2편 (0) | 2022.02.02 |
leaflet - #9 통계지도 만들기 1편 (0) | 2022.02.01 |
leaflet - #8 거리와 면적 측정하기 2편 (0) | 2022.01.29 |