|
|
| <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style type="text/css"> html, body { position: relative; width: 100%; height: 100%; border: none; margin: 0px; padding: 0px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: small; } #header { position:relative; background-color: #fffff0; height: 50px; border: 2px solid #f15922; margin: 0; padding: 0; } #map { position:absolute; top:54px; bottom: 0px; width: 100%; height: auto; border: none; margin: 0; padding: 0; } </style> <script type="text/javascript" src=http://dapi.kakao.com/v2/maps/sdk.js?appkey=발급받은키charset="utf-8"></script> </head> <body> <div id="header"> 관심지역 보이기: <input type="checkbox" id="myCheck" checked = "true" xxonclick="myFunction()"> </div> <div id="map"> </div> <script> window.xxonload = function() { Init_Map(); } var map; function Init_Map() { var container = document.getElementById('map'); var options = { center: new daum.maps.LatLng(37.54699, 127.09598), level: 7 }; map = new daum.maps.Map(container, options); getGeoServerWFS(map); /////////////////////////////////// /////////////////////////////////// //중복실행방지 var ticking = false; var debounce = (function() { return function(callback) { window.setTimeout(callback, 1000 / 60); }; })(); function updateWMS() { setTimeout(function() { //if (map.getLevel() < 11) //데이터가 많을경우 적절하게 줌레벨에 따라 그리기 getGeoServerWFS(map); //else remove_marker(); ticking = false; }, 500); } /////////////////////////////////// daum.maps.event.addListener(map, 'bounds_changed', function() { var checkBox = document.getElementById("myCheck"); if ((checkBox.checked == true)&&(!ticking)) { ticking = true; debounce(updateWMS); } }); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// var markers = []; function remove_marker() { for (var i = 0; i < markers.length; i++) { markers[i].setMap(null); } markers = []; } function GetID_marker(id) { for (var i = 0; i < markers.length; i++) { var marker = markers[i]; if(marker.id == id){ return true; } } return false; } function getGeoServerWFS(_map) { //_map.relayout(); var container = document.getElementById('map'); var imageSize = new daum.maps.Size(container.clientWidth, container.clientHeight); var Centerlatlng = _map.getCenter(); var bounds = _map.getBounds(); var minXY = bounds.getSouthWest(); var maxXY = bounds.getNorthEast(); var LAYERS = "kdpaMap,danger_area"; var searchUrl = "http://www.gisapplication.kr:8080/geoserver/triphos/wfs?service=WFS&version=1.1.0&request=GetFeature" +"&outputFormat=application/json&srsName=EPSG:4326" + "&typeName="+ LAYERS +"&cql_filter=BBOX(the_geom," + minXY.getLng() + "," + minXY.getLat() + "," + maxXY.getLng() + "," + maxXY.getLat() + ",'EPSG:4326')"; var reqUrl = encodeURI(searchUrl); var xhr = null; if(window.XMLHttpRequest){ xhr = new XMLHttpRequest(); }else{ xhr = new ActiveXObject("Microsoft.XMLHTTP"); } xhr.open("GET", reqUrl, true); xhr.setRequestHeader("Content-type","application/xml"); xhr.onreadystatechange = function(){ if ((xhr.readyState === XMLHttpRequest.DONE) && (xhr.status === 200)) { var NweID = []; var objJSON = eval("(function(){return " + xhr.responseText + ";})()"); if(objJSON.totalFeatures > 0){ for(var item in objJSON.features) { //markers에 이미 등록된 객체는 제외 var id = objJSON.features[item].id; NweID.push(id); if(!GetID_marker(id)){ CreatePolygon(_map, objJSON, item); } } }; //새로 등록된 ID외의 객체 삭제 if(NweID.length >0){ for (var i = markers.length-1; i >= 0; i--) { var delete_Ok = true; for (var j = 0; j < NweID.length; j++) { if(markers[i].id == NweID[j]){ delete_Ok = false; break; } } if(delete_Ok){ markers[i].setMap(null); markers.splice(i, 1); } } }else{ remove_marker(); } } else { } }; xhr.send(); } function CreatePolygon(_map, objJSON, item) { var id = objJSON.features[item].id; var ORIG_NAME = objJSON.features[item].properties.ORIG_NAME; var DESIG = objJSON.features[item].properties.DESIG; var DESIG_ENG = objJSON.features[item].properties.DESIG_ENG; var coordinates = objJSON.features[item].geometry.coordinates; var polygonPath = []; for (var i = 0; i < coordinates.length; i++) { var polygons = coordinates[i]; for (var j = 0; j < polygons.length; j++) { var polygonOne = []; var polygon = polygons[j]; for (var k = 0; k < polygon.length; k++) { var long_lat = polygon[k]; polygonOne.push( new daum.maps.LatLng(long_lat[1], long_lat[0]) ); } polygonPath.push(polygonOne); } } var _Color = '#FFFF00'; if(DESIG_ENG == 'National Park')_Color = '#145d06'; else if(DESIG_ENG == 'Provincial Park')_Color = '#078b0f'; else if(DESIG_ENG == 'County Park')_Color = '#1dcc0d'; else if(DESIG_ENG == 'Water Source Protection Area')_Color = '#00FFFF'; var polygon = new daum.maps.Polygon({ path:polygonPath, strokeWeight: 3, strokeColor: _Color, strokeOpacity: 1.0, fillColor: _Color, fillOpacity: 0.5 }); polygon.id = id; polygon.setMap(map); markers.push(polygon); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////** function myFunction() { var checkBox = document.getElementById("myCheck"); if (checkBox.checked == true){ getGeoServerWFS(map); } else { remove_marker(); } } </script> </body> </html> |
2. GeoServer의 데이터를 WMS방식으로 쿼리해서
다음의 new daum.maps.MarkerImage함수로 표출하기.
지도 MBR변화시 중복실행을 방지하고, 줌레벨 11정도이상에서만 표출함.
줌레벨 11이상시 좌표불일치됨, 다음 좌표계로 서비스해도 그런거 같습니다. 데모는 구글 좌표계 서비스를 올려본것입니다.
| <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style type="text/css"> html, body { position: relative; width: 100%; height: 100%; border: none; margin: 0px; padding: 0px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: small; } #header { position:relative; background-color: #fffff0; height: 50px; border: 2px solid #f15922; margin: 0; padding: 0; } #map { position:absolute; top:54px; bottom: 0px; width: 100%; height: auto; border: none; margin: 0; padding: 0; } </style> <script type="text/javascript" src="http://dapi.kakao.com/v2/maps/sdk.js?appkey=발급받은키" charset="utf-8"></script> </head> <body> <div id="header"> 관심지역 보이기: <input type="checkbox" id="myCheck" checked = "true" xxonclick="myFunction()"> </div> <div id="map"> </div> <script> window.xxonload = function() { Init_Map(); } var map; function Init_Map() { var container = document.getElementById('map'); var options = { center: new daum.maps.LatLng(37.54699, 127.09598), level: 7 }; map = new daum.maps.Map(container, options); getGeoServerWMS(map); /////////////////////////////////// //중복실행방지 var ticking = false; var debounce = (function() { return function(callback) { window.setTimeout(callback, 1000 / 60); }; })(); function updateWMS() { setTimeout(function() { if (map.getLevel() < 11) //구글좌표계로 발행된 레이어에선 불필요 getGeoServerWMS(map); ticking = false; }, 500); } /////////////////////////////////// daum.maps.event.addListener(map, 'bounds_changed', function() { var checkBox = document.getElementById("myCheck"); if ((checkBox.checked == true)&&(!ticking)) { ticking = true; remove_marker(); debounce(updateWMS); } }); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// var marker = null; function remove_marker() { if (marker) marker.setMap(null); //삭제 marker = null; } function getGeoServerWMS(_map) { //_map.relayout(); var container = document.getElementById('map'); var imageSize = new daum.maps.Size(container.clientWidth, container.clientHeight); var Centerlatlng = _map.getCenter(); var bounds = _map.getBounds(); var minXY = bounds.getSouthWest(); var maxXY = bounds.getNorthEast(); 'SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES=' + '&LAYERS=triphos%3AkdpaMap,triphos%3Adanger_area' + '&SRS=EPSG%3A4326' + '&WIDTH=' + imageSize.width + '&HEIGHT=' + imageSize.height + '&BBOX=' + minXY.getLng() + '%2C' + minXY.getLat() + '%2C' + maxXY.getLng() + ' %2C' + maxXY.getLat(); CreateMarkerImage(_map, imageSrc, imageSize, Centerlatlng) } function CreateMarkerImage(_map, imageSrc, imageSize, Centerlatlng) { var newImg = new Image; newImg.xxonload = function() { var imageOption = { offset: new daum.maps.Point(imageSize.width / 2, imageSize.height / 2) }; var markerImage = new daum.maps.MarkerImage(imageSrc, imageSize, imageOption); var markerPosition = new daum.maps.LatLng(Centerlatlng.getLat(), Centerlatlng.getLng()); remove_marker(); marker = new daum.maps.Marker({ position: markerPosition, image: markerImage }); marker.setMap(_map); //추가 } newImg.src = imageSrc; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////** function myFunction() { var checkBox = document.getElementById("myCheck"); if (checkBox.checked == true){ getGeoServerWMS(map); } else { remove_marker(); } } </script> </body> </html> |
|
|