๊ฐ๋ฐ๊ธฐ/Front
[Leaflet(๋ฆฌํ๋ฆฟ)] ์ฌ์ฉ๋ฐฉ๋ฒ ์ตํ๊ธฐ ๋ฉ๋ชจ
๋ ๋
2025. 2. 7. 00:04
Leaflet(๋ฆฌํ๋ฆฟ)
๋ฆฌํ๋ฆฟ์ ์น ๋งคํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์คํ ์์ค ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. 2011๋ ์ฒ์ ์ถ์๋์์ผ๋ฉฐ, HTML5์ CSS3๋ฅผ ์ง์ํ๊ณ ๋๋ถ๋ถ์ ๋ชจ๋ฐ์ผ ๋ฐ ๋ฐ์คํฌํฑ ํ๋ซํผ์ ์ง์ํ๋ค.
๊ฐ๋ฐ ๋์ ์ ๋ฆฌํ๋ฆฟ์ ์ตํ๊ธฐ ์ํด ํ ์คํธํ๋ ๊ฒ๋ค ๋ฉ๋ชจ
ํจ๊ป ๋ณธ ๋งํฌ๋ค
- https://www.openstreetmap.org/#map=10/36.9696/126.8495&layers=N
- https://download.geofabrik.de/
- https://leafletjs.com/reference.html
- https://learnosm.org/ko/beginner/
- https://mollangpiu.tistory.com/253
- ๊ธฐ๋ณธ ์์น์ก๊ธฐ
var latlng = L.latLng(37.54165, 126.97166);
var map = L.map('map').setView([37.54233, 126.97244], 18);
์์น [37.54233, 126.97244]
์ค 18๋ก ์ค์
- ๋ ์ด์ด ๋งํ์ ๋์ฐ๊ธฐ
//๋ ์ด์ด
var layerCont = "๋ ์ด์ด ๋ ์ฐ๊ธฐ<br>๋ ์ด์ด ๋ ์ฐ๊ธฐ";
layerCont += "๋ ์ด์ด ๋ ์ฐ๊ธฐ<br>๋ ์ด์ด ๋ ์ฐ๊ธฐ";
layerCont += "๋ ์ด์ด ๋ ์ฐ๊ธฐ<br>๋ ์ด์ด ๋ ์ฐ๊ธฐ";
layerCont += "๋ ์ด์ด ๋ ์ฐ๊ธฐ<br>๋ ์ด์ด ๋ ์ฐ๊ธฐ";
var marker = L.marker([37.54165, 126.97166], {alt: '๋จ์์ญ'}).addTo(map)
.bindPopup(layerCont);

- ๋ง์ปค ์ ์ฐ๊ธฐ
// ๋ง์ปค 1
var myIcon = L.divIcon({className: 'my-div-icon'}); // you can set .my-div-icon styles in CSS
L.marker([37.54339,126.97220], {icon: myIcon}).addTo(map);
.my-div-icon{
width: 50px; height: 50px;
background-color: red;
border-radius: 50%;
}

- ๋ง์ปค ์ด๋ฏธ์ง + ๋ ์ด์ด ๋งํ์ ๋์ฐ๊ธฐ
// ๋ง์ปค 2 + ๋ ์ด์ด
var myIcon = L.icon({
iconUrl: '/resources/images/icon/my-icon.png',
iconSize: [30, 30],
iconAnchor: [20, 20],
popupAnchor: [0, -10],
crossOrigin: false
});
// L.marker([37.54257,126.97091], {icon: myIcon}).addTo(map);
var layerCont = "๋ ์ด์ด ๋ ์ฐ๊ธฐ22222222222<br>";
layerCont += "๋ ์ด์ด ๋ ์ฐ๊ธฐ22222222222<br>";
layerCont += "๋ ์ด์ด ๋ ์ฐ๊ธฐ22222222222<br>";
layerCont += "๋ ์ด์ด ๋ ์ฐ๊ธฐ22222222222<br>";
layerCont += "๋ ์ด์ด ๋ ์ฐ๊ธฐ22222222222<br>";
var marker = L.marker([37.54257,126.97091], {icon: myIcon}, {alt: '์น์์ผํฐ'}).addTo(map)
.bindPopup(layerCont);

์์ด์ฝ ์ฌ์ด์ฆ : iconSize์์ฑ์ผ๋ก ์ค์
๋ ์ด์ด ๋จ๋ ์์น : popupAnchor [์ข์ฐ, ์ํ] (๋ง์ด๋์ค ๋ถ์ ์๊ฐ ์ ๋ฐฉํฅ)
- ๋ ์ด์ด ํด๋ฆญ ์ด๋ฒคํธ alert ์ถ๋ ฅ
var layerCont = "<div class='red'>๋ ์ด์ด ๋ ์ฐ๊ธฐ22222222222<br>";
layerCont += "๋ ์ด์ด ๋ ์ฐ๊ธฐ22222222222<br>";
layerCont += "๋ ์ด์ด ๋ ์ฐ๊ธฐ22222222222<br>";
layerCont += "๋ ์ด์ด ๋ ์ฐ๊ธฐ22222222222<br>";
layerCont += "<button type='button' onclick='test()'>ํด๋ฆญ</button>";
layerCont += "๋ ์ด์ด ๋ ์ฐ๊ธฐ22222222222<br></div>";
var marker = L.marker([37.54257,126.97091], {icon: myIcon}, {alt: '์น์์ผํฐ'}).addTo(map)
.bindPopup(layerCont);
}
function test(){
alert("ํด๋ฆญํ๋ค");
}

- ์์ด์ฝ ๋ฐ์ ๋ฌธ๊ตฌ๋ฐ์ค ๋ง๋ค๊ธฐ
// ๋ง์ปค ๋ฐ์ ์ด๋ฆ๋ถ์ด๊ธฐ - ๋ฏผ์ฃผ์ธ๊ถ๊ธฐ๋
๊ด
var customIcon01 = L.divIcon({
html: '<div>์ฌ๊ธฐ์์ด์ฝ?</div><div class="icon-label">์ด์1-1</div>',
className: 'my-div-icon',
iconSize: [40, 40],
iconAnchor: [20, 20],
crossOrigin: false
});
L.marker([37.54033,126.97218], {icon: customIcon01}).addTo(map);
.icon-label{display: inline-block; background-color: #fff; color: red; width: max-content;}
.my-div-icon{background-color: red;}
.my-div-icon .icon-label{
/* transform: translate(-35%, 30%); */
}

- ๋ฌธ๊ตฌ๋ฐ์ค ๋์์ธ ๋ณ๊ฒฝ
.my-div-icon-02{
position: relative; background:pink url(/resources/images/icon/select-arrow.png);
}
.my-div-icon > div{
position: absolute;
top: 0;
}
.icon-label{
display: inline-block; background-color: #fff; color: red; width: max-content;
position: absolute;
bottom: -20px;
left: 50%;
transform: translate(-50%);
}

color: black;
text-shadow: 1px 0 #fff, 0 1px #fff, -1px 0 #fff, 0 -1px #fff;

color: #fff;
text-shadow: 1px 0 #000, 0 1px #000, -1px 0 #000, 0 -1px #000;
