- 정보공유
[API] [다음 지도 api] 클러스터러 + 인포윈도우 + 사용자콘트롤박스
다음 지도 api 를 이용한 클러스터러 + 인포윈도우 + 사용자콘트롤박스 입니다.
api 키는 http://apis.map.daum.net/ 에서 발급받으시면 됩니다.
css 단
.wrap {position: absolute;left: 0;bottom: 40px;width: 288px;height: 132px;margin-left: -144px;text-align: left;overflow: hidden;font-size: 12px;font-family: 'Malgun Gothic', dotum, '돋움', sans-serif;line-height: 1.5;} .wrap * {padding: 0;margin: 0;} .wrap .info {width: 286px;height: 120px;border-radius: 5px;border-bottom: 2px solid #ccc;border-right: 1px solid #ccc;overflow: hidden;background: #fff;} .wrap .info:nth-child(1) {border: 0;box-shadow: 0px 1px 2px #888;} .info .title {padding: 5px 0 0 10px;height: 30px;background: #eee;border-bottom: 1px solid #ddd;font-size: 18px;font-weight: bold;} .info .close {position: absolute;top: 10px;right: 10px;color: #888;width: 17px;height: 17px;background: url('http://i1.daumcdn.net/localimg/localimages/07/mapapidoc/overlay_close.png');} .info .close:hover {cursor: pointer;} .info .body {position: relative;overflow: hidden;} .info .desc {position: relative;margin: 13px 0 0 90px;height: 75px;} .desc .ellipsis {overflow: hidden;text-overflow: ellipsis;white-space: nowrap;} .desc .jibun {font-size: 11px;color: #888;margin-top: -2px;} .info .img {position: absolute;top: 6px;left: 5px;width: 73px;height: 71px;border: 1px solid #ddd;color: #888;overflow: hidden;} .info:after {content: '';position: absolute;margin-left: -12px;left: 50%;bottom: 0;width: 22px;height: 12px;background: url('http://i1.daumcdn.net/localimg/localimages/07/mapapidoc/vertex_white.png')} .info .link {color: #5085BB;} .map_wrap {position:relative;overflow:hidden;} .radius_border{border:1px solid #919191;border-radius:5px;} .custom_typecontrol {position:absolute;top:10px;right:10px;overflow:hidden;width:130px;height:30px;margin:0;padding:0;z-index:1;font-size:12px;font-family:'Malgun Gothic', '맑은 고딕', sans-serif;} .custom_typecontrol span {display:block;width:65px;height:30px;float:left;text-align:center;line-height:30px;cursor:pointer;} .custom_typecontrol .btn {background:#fff;background:linear-gradient(#fff, #e6e6e6);} .custom_typecontrol .btn:hover {background:#f5f5f5;background:linear-gradient(#f5f5f5,#e3e3e3);} .custom_typecontrol .btn:active {background:#e6e6e6;background:linear-gradient(#e6e6e6, #fff);} .custom_typecontrol .selected_btn {color:#fff;background:#425470;background:linear-gradient(#425470, #5b6d8a);} .custom_typecontrol .selected_btn:hover {color:#fff;} .custom_zoomcontrol {position:absolute;top:50px;right:10px;width:36px;height:80px;overflow:hidden;z-index:1;background-color:#f5f5f5;} .custom_zoomcontrol span {display:block;width:36px;height:40px;text-align:center;cursor:pointer;} .custom_zoomcontrol span img {width:15px;height:15px;padding:12px 0;border:none;} .custom_zoomcontrol span:first-child{border-bottom:1px solid #bfbfbf;}
javascript 단
<script type="text/javascript" src="//apis.daum.net/maps/maps3.js?apikey=[다음API키]&libraries=clusterer"></script> <script> var mapContainer = document.getElementById('map'), // 지도를 표시할 div mapOption = { center: new daum.maps.LatLng(37.55496653314019, 126.97579237424095), // 지도의 중심좌표 level: 10 // 지도의 확대 레벨 }; var map = new daum.maps.Map(mapContainer, mapOption); // 지도를 생성합니다 // 마커 클러스터러를 생성합니다 var clusterer = new daum.maps.MarkerClusterer({ map: map, // 마커들을 클러스터로 관리하고 표시할 지도 객체 averageCenter: true, // 클러스터에 포함된 마커들의 평균 위치를 클러스터 마커 위치로 설정 minLevel: 10 // 클러스터 할 최소 지도 레벨 }); // 데이터를 가져오기 위해 jQuery를 사용합니다 // 데이터를 가져와 마커를 생성하고 클러스터러 객체에 넘겨줍니다 $.get("./list.data.json.php", function(data) { // 데이터에서 좌표 값을 가지고 마커를 표시합니다 // 마커 클러스터러로 관리할 마커 객체는 생성할 때 지도 객체를 설정하지 않습니다 var markers = $(data.positions).map(function(i, position) { var maks = new daum.maps.Marker({ map: map, position : new daum.maps.LatLng(position.lat, position.lng) }); var infowindow = new daum.maps.InfoWindow({ content: position.html, removable : true }); daum.maps.event.addListener(maks, 'click', makeOverListener(map, maks, infowindow)); daum.maps.event.addListener(maks, 'mouseout', makeOutListener(infowindow)); return maks; }); // 클러스터러에 마커들을 추가합니다 clusterer.addMarkers(markers); }); // 인포윈도우를 표시하는 클로저를 만드는 함수입니다 function makeOverListener(map, marker, infowindow) { infowindow.close(); return function() { infowindow.open(map, marker); }; } // 인포윈도우를 닫는 클로저를 만드는 함수입니다 function makeOutListener(infowindow) { return function() { infowindow.close(); }; } function setMapType(maptype) { var roadmapControl = document.getElementById('btnRoadmap'); var skyviewControl = document.getElementById('btnSkyview'); if (maptype === 'roadmap') { map.setMapTypeId(daum.maps.MapTypeId.ROADMAP); roadmapControl.className = 'selected_btn'; skyviewControl.className = 'btn'; } else { map.setMapTypeId(daum.maps.MapTypeId.HYBRID); skyviewControl.className = 'selected_btn'; roadmapControl.className = 'btn'; } } // 지도 확대, 축소 컨트롤에서 확대 버튼을 누르면 호출되어 지도를 확대하는 함수입니다 function zoomIn() { map.setLevel(map.getLevel() - 1); } // 지도 확대, 축소 컨트롤에서 축소 버튼을 누르면 호출되어 지도를 확대하는 함수입니다 function zoomOut() { map.setLevel(map.getLevel() + 1); } </script>
php json 단
<?php header('Content-Type: application/json'); die('{ "positions": [ { "html":"서울시 중구 중구동 중2203", "lat": 37.27943075229118, "lng": 127.01763998406159 }, { "html":"서울시 중구 중구동 중2203", "lat": 37.27953075229118, "lng": 127.01763998406159 }, { "html":"서울시 중구 중구동 중2203", "lat": 37.55915668706214, "lng": 126.92536526611102 }, { "html":"서울시 중구 중구동 중2203", "lat": 37.55995668706214, "lng": 126.95536526611102 } ] }');