개발이야기/자바스크립트

[자바스크립트] 카카오맵 API 이용해 폴리곤으로 대한민국(시/도) 구분하기

후린개발자 2023. 7. 24.
반응형

아래 코드는 gson.json의 지리적 데이터를 사용하여 시/도를 다각형으로 표시하고, 마우스 이벤트에 따라 지역을 표시하고 지역을 클릭하면 해당 지역의 중심으로 맵을 확대하는 여러 가지 기능을 카카오 맵 API를 통해 구현해 봤습니다.

 

  • 소스코드 설명
  • displayMap
    • GeoJSON 데이터 파일을 가져와서 displayMap 함수에 좌표와 이름을 넣고 호출합니다. 좌표를 사용해 다각형을 생성하고 맵에 표시합니다. 또한 다각형과의 마우스 오버, 마우스 이동, 마우스 아웃 및 클릭에 대한 이벤트 리스너를 설정합니다.
  • centerMap
    • 다각형의 꼭짓점 좌표를 기반으로 다각형의 중심점(중심)을 계산합니다.
  • overlaySet
    • 지역 이름이 표시된 커스텀 오버레이를 설정합니다. 다각형의 중심점을 계산하고 해당 위치에 커스텀 오버레이를 생성합니다.

 

소스 코드 확인하시고 응용해서 사용하시면 됩니다.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta http-equiv="Expires" content="-1">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<style>
.overlaybox {top:-50px; left:-50px; position:relative;width:100px;height:100px;background:url('https://t1.daumcdn.net/localimg/localimages/07/mapapidoc/box_movie.png') no-repeat;padding:15px 10px;}
.overlaybox .boxtitle {text-align:center; color:#fff;font-size:16px;font-weight:bold;margin-bottom:8px;}
</style>
<script type="text/javascript" src="https://code.jquery.com/jquery-1.10.2.min.js" /></script>
<script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=카카오맵키&libraries=services"></script>
</head>
<body>
 <div class="map-wrap" style="position: absolute; left: 0; top: 0; right: 0; bottom: 60px;">
	<div id="map" style="width:100%; height:100%"></div>
</div>
<script>
var mapContainer = document.getElementById('map'), // 지도를 표시할 div 
    mapOption = { 
        center: new kakao.maps.LatLng(36.6358, 127.4911), // 지도의 중심좌표:충북
        level: 12// 지도의 확대 레벨
    };

var map = new kakao.maps.Map(mapContainer, mapOption)
    customOverlay = new kakao.maps.CustomOverlay({});

$.getJSON('gson.json', function(geojson) {
	var data = geojson.features;
	var coordinates = [];    
	var name = '';           

	$.each(data, function(index, val) {
		coordinates = val.geometry.coordinates;
		name = val.properties.CTP_KOR_NM;
		
		displayMap(coordinates, name);

	});
});
var polygons=[]; //전역변수
    
//대한민국 지도 폴리곤
function displayMap(coordinates, name) {

    var path = [];            
    var points = []; 
	var pathArr = [];
    $.each(coordinates[0], function(index, coordinate) {        
        var point = new Object(); 
        point.x = coordinate[1];
        point.y = coordinate[0];
        points.push(point);
        path.push(new daum.maps.LatLng(coordinate[1], coordinate[0]))
		pathArr.push([coordinate[1], coordinate[0]]);
    });
    
    // 다각형을 생성합니다 
    var polygon = new daum.maps.Polygon({
        map : map, // 다각형을 표시할 지도 객체
        path : path,
        strokeWeight : 2,
        strokeColor : '#004c80',
        strokeOpacity : 0.8,
        fillColor : '#fff',
        fillOpacity : 0.7
    });
    
    polygons.push(polygon);            
	overlaySet(name, points);

    daum.maps.event.addListener(polygon, 'mouseover', function(mouseEvent) {
        polygon.setOptions({
            fillColor : '#09f'
        });
		var content= '<div class="overlaybox">';
			content += ' <div class="boxtitle">' + name + '</div> ';
			content += '</div>';
		
		customOverlay.setContent(content);
		customOverlay.setPosition(mouseEvent.latLng);
		customOverlay.setMap(map);	

    });

    // 다각형에 mousemove 이벤트를 등록하고 이벤트가 발생하면 동작한다.
    daum.maps.event.addListener(polygon, 'mousemove', function(mouseEvent) {
		console.log('mousemove 이벤트');
        
    });
 
    // 다각형에 mouseout 이벤트를 등록하고 이벤트가 발생하면 폴리곤의 색을 변경하고, 커스텀오버레이를 변경한다.
    // 커스텀 오버레이를 지도에서 제거합니다 
    daum.maps.event.addListener(polygon, 'mouseout', function() {
        polygon.setOptions({
            fillColor : '#fff'
        });
        customOverlay.setMap(null);
		overlaySet(name, points);
    });
 
    // 다각형에 click 이벤트를 등록하고 이벤트가 발생하면 해당 지역 확대을 확대한다.
    daum.maps.event.addListener(polygon, 'click', function() {
        // 현재 지도 레벨에서 2레벨 확대한 레벨
        var level = map.getLevel()-2;
        
        // 지도를 클릭된 폴리곤의 중앙 위치를 기준으로 확대합니다
        map.setLevel(level, {anchor: centerMap(points), animate: {
            duration: 350       
        }});             
    });
} 

 //centroid 알고리즘 (폴리곤 중심좌표 구하기 위함)
function centerMap (points) {
    var i, j, len, p1, p2, f, area, x, y;
 
    area = x = y = 0;
 
    for (i = 0, len = points.length, j = len - 1; i < len; j = i++) {
            p1 = points[i];
            p2 = points[j];
 
            f = p1.y * p2.x - p2.y * p1.x;
            x += (p1.x + p2.x) * f;
            y += (p1.y + p2.y) * f;
            area += f * 3;
    }
    return new daum.maps.LatLng(x / area, y / area);
}
function overlaySet (name, points) {
	var content = '<div class="area" style="font-weight:bold; font-size:10px;">' + name + '</div>';

	// 커스텀 오버레이가 표시될 위치입니다 
	var position = centerMap(points);

	// 커스텀 오버레이를 생성합니다
	customOverlay = new kakao.maps.CustomOverlay({
		position: position,
		content: content,
		xAnchor: 0.3,
		yAnchor: 0.91
	});

	// 커스텀 오버레이를 지도에 표시합니다
	customOverlay.setMap(map);	 
}

</script>
</body>
</html>

 

소스코드 화면

 

아래는 제가 사용한 폴리곤 데이터 파일 입니다.

gson.json
0.39MB

반응형

댓글

💲 추천 글