var OL_Map2D = new function() { var that = this; var Map_View; var JIJUK_WFSLayer; this.Map2D = null; this.Init_Map = function() { var _html = '<div class="map_popup-bg hide">' + '<div id="map_popup_container" class="map_popup-container">' + '<div class="map_popup-top">' + '<h2 class="map_popup-title">사업지 선택</h2>' + '<button type="button" class="btClose" style="filter: invert(100%);" xxonclick="OL_Map2D.hide();">닫기</button>' + '</div>' + '<div id="map_popup_2Dmap" class="map_popup-map"></div>' + '</div>' + '</div>'; $('body').append(_html); var toolbarContainer = '<div id="toolbarContainer">' + '<div class="sm_toolBox sm_ui">' + '<div class="sm_toolIcons">' + '<div class="sm_toolIcon sm_drag sm_selected" title="지적도 선택">' + '<div class="sm_icon"></div>' + '<p class="sm_text">지적선택</p>' + '</div>' + '<div class="sm_toolIcon sm_polygon" title="영역 그리기">' + '<div class="sm_icon"></div>' + '<p class="sm_text">그리기</p>' + '</div>' + '<div class="sm_toolIcon sm_closeSHP" title="분석결과 지우기">' + '<div class="sm_icon"></div>' + '<p class="sm_text">지우기</p>' + '</div>' + '</div>' + '</div>' + '</div>' + '<div id="toolbarContainer_ex">' + '<div class="sm_toolIcon_ex sm_Undo" title="되돌리기" xxonclick="OL_Map2D.history_undo();">' + '<div class="sm_icon"></div>' + '<p class="sm_text">되돌리기</p>' + '</div>' + '<div class="sm_toolIcon_ex sm_Redo" title="다시하기" xxonclick="OL_Map2D.history_Redo();">' + '<div class="sm_icon"></div>' + '<p class="sm_text">다시하기</p>' + '</div>' + '</div>' + '<button type="button" class="bt bg secondary" style="position: absolute;top: 40px;left: 261px;margin: 0px;padding: 0px;border-radius: 0;height: 46px;width: 102px;font-size: 16px;z-index: 999999999999;" xxonclick="OL_Map2D.BUILD_InitArea()">사업구역확정</button>'; $('#map_popup_container').append(toolbarContainer); Map_View = new ol.View({ projection: new ol.proj.Projection({ code: 'EPSG:3857', units: 'm', axisOrientation: 'neu', //global: true }), extent: ol.proj.get("EPSG:3857").getExtent(), minZoom: 7, maxZoom: 21, constrainResolution: true, smoothResolutionConstraint: true, }) var Vwordmap_layer = new ol.layer.Tile({ opacity: 1.0, source: new ol.source.XYZ({ crossOrigin: 'anonymous', url: vworldURL, tileSize: [256, 256], imageSmoothing: false, maxZoom: 19, }) }); var _URL_WFS = VworldWFS_URL + "APIKEY=" + VWorldKey + "&domain=" + _getServerName(mainurl); JIJUK_WFSLayer = createVworldWFSLayer("JIJUK_WFSLayer", _URL_WFS, 'lt_c_landinfobasemap', null, 18, false); //lp_pa_cbnd_bonbun,lp_pa_cbnd_bubun JIJUKLayer_Snap = new ol.interaction.Snap({ source: JIJUK_WFSLayer.getSource(), pixelTolerance: 10, edge: false, vertex: true, }); LayerEditingLayer = new ol.layer.Vector({ id: 'LayerEditingLayer', name: 'LayerEditingLayer', layerName: 'LayerEditingLayer', source: new ol.source.Vector(), style: LayerEditingStyles({ stroke: '#f15922', fill: 'rgba(0,0,255,0.1)', point: '#f15922', zIndex: 1 }), }); LayerEditing_Snap = new ol.interaction.Snap({ source: LayerEditingLayer.getSource(), pixelTolerance: 10, edge: false, vertex: true, }); this.Map2D = new ol.Map({ target: document.getElementById('map_popup_2Dmap'), layers: [ Vwordmap_layer, JIJUK_WFSLayer, LayerEditingLayer ], view: Map_View, overlays: [], }); LayerEditing_Select = new ol.interaction.Select({ layers: [LayerEditingLayer], style: LayerEditingStyles({ stroke: '#1D4BA6', fill: 'rgba(0,255,255,0.2)', point: '#0D2555', zIndex: 9 }), multi: true, condition: ol.events.condition.singleClick, toggleCondition: ol.events.condition.never }); LayerEditing_Select.on('select', function (e) { try { //기존 버튼 제거 if (main_deleteOverlay) { that.Map2D.removeOverlay(main_deleteOverlay); main_deleteOverlay = null; } // 그리기 모드 차단, draw 중 차단 if (CURRENT_MODE != "MOVE" || IS_DRAWING) { LayerEditing_Select.getFeatures().clear(); return; } var selected = e.selected; if (!selected || selected.length === 0) return; var feature = selected[0]; //가장 작은 feature 찾기 var minArea = Infinity; selected.forEach(function(f) { try { var area = f.getGeometry().getArea(); if (area < minArea) { minArea = area; feature = f; } } catch (error) {
} }); var features = LayerEditing_Select.getFeatures(); features.clear(); features.push(feature); var geometry = feature.getGeometry(); var coord = geometry.getInteriorPoint().getCoordinates(); var btn = document.createElement('div'); btn.className = 'delete-btn'; btn.innerHTML = '삭제'; btn.style.cssText = 'background: red; color: #fff; padding: 4px 8px; border-radius: 4px; cursor: pointer; white-space: nowrap;'; btn.xxonclick = function () { LayerEditingLayer.getSource().removeFeature(feature); history_saveState(); that.Map2D.removeOverlay(main_deleteOverlay); main_deleteOverlay = null; }; main_deleteOverlay = new ol.Overlay({ element: btn, positioning: 'center-center', stopEvent: true }); main_deleteOverlay.setPosition(coord); that.Map2D.addOverlay(main_deleteOverlay); } catch (error) {
} }); that.Map2D.addInteraction(LayerEditing_Select); LayerEditing_Modify = new ol.interaction.ModifyTouch({ source: LayerEditingLayer.getSource(), }); LayerEditing_Modify.on('modifyend', function(evt) { try { history_saveState(); } catch (error) {
} }, this); that.Map2D.addInteraction(LayerEditing_Modify); that.Map2D.on('singleclick', function(evt) { if (CURRENT_MODE != "MOVE") return; //그리기 모드일 때 차단 if (IS_DRAWING) return; //draw 진행 중이면 차단 //기존 feature 클릭이면 차단 var isEditingFeature = false; that.Map2D.forEachFeatureAtPixel(evt.pixel, function(feature, layer) { if (layer === LayerEditingLayer) { isEditingFeature = true; } }); if (isEditingFeature) return; SearchJibun_PT(evt.coordinate); }); this.map_3Dto2D_move(); ////////////////////////////////////////////////////////////////////// $('.sm_toolIcon').on('click', function (e) { $('.sm_toolIcons').find('*').removeClass('sm_selected'); var Tool_Element = e.target.parentElement; var _className = Tool_Element.className; _className = _className.replace('sm_toolIcon ', ''); MapControlMode('MOVE'); if (_className == 'sm_polygon') { MapControlMode('Polygon'); } if (_className == 'sm_closeSHP') { that.Editing_remove(); } $(Tool_Element).addClass('sm_selected'); }); ////////////////////////////////////////////////////////////////////// $(window).on('resize', function(){ that.Map2D.updateSize(); }); } //-------------------------------------------------------------------------------// //-------------------------------------------------------------------------------// this.clear = function() { history_Stack = []; currentIndex_Stack = -1; history_updateUI(); this.Editing_remove(); MapControlMode('MOVE'); $('.sm_toolIcons').find('*').removeClass('sm_selected'); $('.sm_drag').addClass('sm_selected'); JIJUK_WFSLayer.setVisible(false); } this.show = function() { this.clear(); $('.map_popup-bg').removeClass('hide'); this.Map2D.updateSize(); this.map_3Dto2D_move(); JIJUK_WFSLayer.setVisible(true); } this.hide = function() { this.clear(); $('.map_popup-bg').addClass('hide'); } this.map_3Dto2D_move = function() { try { var MapCenterZoom = getMapCenterZoom(); if(MapCenterZoom){ this.Map2D.updateSize(); var transCoordz = ol.proj.transform([MapCenterZoom[0], MapCenterZoom[1]], "EPSG:4326", "EPSG:900913"); this.Map2D.getView().setCenter(transCoordz); this.Map2D.getView().setZoom(MapCenterZoom[2]); } } catch (error) {
} } //-------------------------------------------------------------------------------// this.Editing_remove = function() { if (LayerEditing_draw) that.Map2D.removeInteraction(LayerEditing_draw); if (main_deleteOverlay) { that.Map2D.removeOverlay(main_deleteOverlay); main_deleteOverlay = null; } LayerEditingLayer.getSource().clear(); } //-------------------------------------------------------------------------------// //-------------------------------------------------------------------------------// this.BUILD_InitArea = function (){ var _union_Geometry = null; var Features = LayerEditingLayer.getSource().getFeatures(); if(Features && Features.length > 0){ var map_extent = that.Map2D.getView().calculateExtent(that.Map2D.getSize()); Features.forEach(function(f) { try { var geom = f.getGeometry(); //화면에 보이는 것만 필터 : 사용자가 타지역 선택 객체 안지울 경우 if (ol.extent.intersects(map_extent, geom.getExtent())){ if(!_union_Geometry) _union_Geometry = geom.clone(); else{ _union_Geometry = Get_union(_union_Geometry, geom); } } } catch (error) {
} }); } if(_union_Geometry){ var _Center = ol.extent.getCenter(_union_Geometry.getExtent()); _Center = ol.proj.toLonLat(_Center); var currentMBR = _union_Geometry.getExtent(); var _Distance = Math.min(currentMBR[2] - currentMBR[0], currentMBR[3] - currentMBR[1]); _Distance = _Distance / 2; plon = _Center[0]; plat = _Center[1]; pdist = _Distance; locatixxonMove(); Main_Analysis_Geometry = _union_Geometry; Main_Analysis_Addr = '사업지'; var feature = new ol.Feature(_union_Geometry); Analysis_JijukResult(feature, function () { BUILD_BalanceForUrbanReProject(); }); $('#BT_PolygontMode').removeClass('On'); $('#BT_PointMode').removeClass('On');
Main_PolygonDraw_OK = false; Main_MeasureHeight_OK = false; } OL_Map2D.hide(); } //-------------------------------------------------------------------------------// function SearchJibun_PT(coordinate){ var WFS_URL = VworldData_URL; var param = "?service=data"; param += "&request=GetFeature"; param += "&data="+ "LT_C_LANDINFOBASEMAP"; param += "&geomFilter=" + "POINT(" + coordinate[0] + " " + coordinate[1] +")"; param += "&format=json"; param += "&crs=EPSG:900913"; param += "&key=" + VWorldKey; param += "&domain=" + _getServerName(mainurl); var reqUrl = encodeURI(WFS_URL + param); $.ajax({ url: reqUrl, type:'GET', //dataType: "jsonp", jsonp : "callback", success: function (responseData){ try{ var geojson_Feature = responseData.response.result.featureCollection.features[0]; var feature = (new ol.format.GeoJSON()).readFeature(geojson_Feature); var geom = feature.getGeometry(); if (geom instanceof ol.geom.MultiPolygon) { var polygons = geom.getPolygons(); if (polygons.length > 0) { //feature.setGeometry(polygons[0]); // 첫번째 폴리곤만 사용 geom = polygons[0]; } } var New_feature = new ol.Feature(geom); LayerEditingLayer.getSource().addFeature(New_feature); history_saveState(); }catch(e) {
} }, error: null }); } //-------------------------------------------------------------------------------// var CURRENT_MODE = "MOVE"; // MOVE | Polygon var IS_DRAWING = false; var LayerEditingLayer; //편집레이어 var main_deleteOverlay; //객체삭제 Overlay var main_AutoDrawOverlay; //영역자동설정 Overlay var LayerEditing_Select, LayerEditing_Modify, LayerEditing_draw, JIJUKLayer_Snap, LayerEditing_Snap; //interaction function MapControlMode(mode){ CURRENT_MODE = mode; IS_DRAWING = false; if (LayerEditing_Select) LayerEditing_Select.getFeatures().clear(); if (main_deleteOverlay) { that.Map2D.removeOverlay(main_deleteOverlay); main_deleteOverlay = null; } if (main_AutoDrawOverlay) { that.Map2D.removeOverlay(main_AutoDrawOverlay); main_AutoDrawOverlay = null; } if (JIJUKLayer_Snap)that.Map2D.removeInteraction(JIJUKLayer_Snap); if (LayerEditing_Snap)that.Map2D.removeInteraction(LayerEditing_Snap); if (LayerEditing_draw) that.Map2D.removeInteraction(LayerEditing_draw); if(mode == "Polygon"){ LayerEditing_draw = new ol.interaction.Draw({ source: LayerEditingLayer.getSource(), type: 'Polygon', freehand: false, }); LayerEditing_draw.on('drawstart', function (evt) { try { IS_DRAWING = true; } catch (error) {} },this ); LayerEditing_draw.on('drawend', function (evt) { try { IS_DRAWING = false;
if (main_AutoDrawOverlay) { that.Map2D.removeOverlay(main_AutoDrawOverlay); main_AutoDrawOverlay = null; } var feature = evt.feature; var geometry = feature.getGeometry(); var coord = geometry.getInteriorPoint().getCoordinates(); var btn = document.createElement('div'); btn.className = 'delete-btn'; btn.innerHTML = '영역자동설정'; btn.style.cssText = 'background: #1D4BA6; color: #fff; padding: 4px 8px; border-radius: 4px; cursor: pointer; white-space: nowrap;'; btn.xxonclick = function () { Createfeature_Auto_Draw(feature); that.Map2D.removeOverlay(main_AutoDrawOverlay); main_AutoDrawOverlay = null; }; main_AutoDrawOverlay = new ol.Overlay({ element: btn, positioning: 'center-center', stopEvent: true }); main_AutoDrawOverlay.setPosition(coord); that.Map2D.addOverlay(main_AutoDrawOverlay); setTimeout(function () { history_saveState(); }, 100); } catch (error) {} }, this ); LayerEditing_draw.on('drawabort', function (evt) { try {
} catch (error) {} }, this ); that.Map2D.addInteraction(LayerEditing_draw); that.Map2D.addInteraction(JIJUKLayer_Snap); that.Map2D.addInteraction(LayerEditing_Snap); } } function LayerEditingStyles(options) { options = options || {}; var strokeColor = options.stroke || '#f15922'; var fillColor = options.fill || 'rgba(0, 0, 255, 0.1)'; var pointColor = options.point || '#f15922'; var Style_feature = new ol.style.Style({ fill: new ol.style.Fill({ color: fillColor, }), stroke: new ol.style.Stroke({ color: strokeColor, width: 4, }), zIndex: options.zIndex || 0 }); var Style_point = new ol.style.Style({ image: new ol.style.Circle({ radius: 5, fill: new ol.style.Fill({ color: pointColor, }), stroke: new ol.style.Stroke({ color: '#fff', width: 1, }), }), zIndex: (options.zIndex || 0) + 1, geometry: function (feature) { var coordinatesALL = []; var Geometry = feature.getGeometry(); var coordinates = Geometry.getCoordinates(); if (!Array.isArray(coordinates[0])) coordinates = [coordinates]; function AllVertex(_coordinates) { for (var i in _coordinates) { var _coord = _coordinates[i]; if (_coord[0] instanceof Array) { AllVertex(_coord); } else { coordinatesALL.push(_coord); } } } AllVertex(coordinates); return new ol.geom.MultiPoint(coordinatesALL); }, }); return [Style_feature, Style_point]; } //-------------------------------------------------------------------------------// function createVworldWFSLayer(LayerName, WMSURL, _Layers, minZoom, maxZoom, _visible, change_function){ if(maxZoom)maxZoom = maxZoom-1; if(!minZoom)minZoom = Map_View.getMaxZoom(); var vectorSource = new ol.source.Vector({ projection: 'EPSG:900913', loader: function(extent, resolution, projection) { var url = WMSURL + "&SERVICE=WFS" + "&REQUEST=GetFeature" + "&TYPENAME=" + _Layers + "&BBOX=" + extent[0] + ',' + extent[1] + ',' + extent[2] + ',' + extent[3] + "&VERSION=1.1.0&SRSNAME=EPSG:900913&OUTPUT=application/json&maxfeatures=1000"; $.ajax({ url: url + "&format_options=callback:", success: function(response) { if (response.error) {
} else { var features = (new ol.format.GeoJSON()).readFeatures(response); if(change_function) features = change_function(extent, features); vectorSource.addFeatures(features); } }, error : function(xhr, stat, err) { } }); }, strategy: ol.loadingstrategy.tile(ol.tilegrid.createXYZ({ tileSize: 256 })) }); return new ol.layer.Vector({ id: LayerName, name: LayerName, layerName: LayerName, source: vectorSource, opacity:0.5, style: new ol.style.Style({ fill: new ol.style.Fill({ color: 'rgba(255,0,0,0.0)' }), stroke: new ol.style.Stroke({ color: '#000080', //'rgba(26,0,196,0.8)', //'rgba(0,0,255,0.8)', width: 1 }) }), renderMode: 'image', //'vector' minResolution: resolutionForZoom(minZoom), maxResolution: resolutionForZoom(maxZoom), visible: _visible }); }; function resolutionForZoom(zoom) { var resolution = Infinity; try{ if(zoom != null){ resolution = Map_View.getResolutionForZoom(zoom); } }catch (e){ } return resolution; } //-------------------------------------------------------------------------------// //영역자동설정 function Createfeature_Auto_Draw(_feature){ try { Auto_Draw_jijuk_ALL(_feature, function (_jijuk_Features){ if (_jijuk_Features && _jijuk_Features.length > 0){ var PG_Geometry = _feature.getGeometry(); for (var i = 0; i < _jijuk_Features.length-1; i++) { try { var feature = _jijuk_Features[i]; var geometry = feature.values_["Org_geometry"] || feature.getGeometry(); var intersection_Geometry = Get_intersection(PG_Geometry, geometry); if (intersection_Geometry) { var Area_geometry = GetArea(geometry);//ol.sphere.getArea(geometry); var Area_intersection = GetArea(intersection_Geometry);//ol.sphere.getArea(intersection_Geometry); var _Percent = Area_intersection / Area_geometry * 100; //자신에 대한 중첩 비율 if (_Percent >= 70 && _Percent < 100) { PG_Geometry = Get_union(PG_Geometry, geometry); } else if (_Percent > 0 && _Percent <= 15) { var jibun = feature.values_["jibun"]; if (jibun && jibun.indexOf('도') >= 0){ //if (_Percent <= 5) PG_Geometry = Get_difference(PG_Geometry, geometry); }else{ PG_Geometry = Get_difference(PG_Geometry, geometry); } } } } catch (error) {
} } _feature.setGeometry(PG_Geometry); history_saveState(); } }); } catch (error) {
} } function Auto_Draw_jijuk_ALL(_feature, _callback_featureFn) { var coordinate = ol.extent.getCenter(_feature.getGeometry().getExtent()); Call_NaverToVworld_Jijuk(coordinate, Call_back, Call_fail); function Call_back(_Features) { if (_Features.length > 0) { var trans_Feature = _Features[0]; var CT_diffX = trans_Feature.values_["CT_diffX"]; var CT_diffY = trans_Feature.values_["CT_diffY"]; if (CT_diffX && CT_diffY) { Auto_Draw_jijuk_ALL_EX(_feature, trans_Feature, _callback_featureFn); } else { Auto_Draw_jijuk_ALL_EX(_feature, null, _callback_featureFn); } } else { Auto_Draw_jijuk_ALL_EX(_feature, null, _callback_featureFn); } }; function Call_fail(error) { Auto_Draw_jijuk_ALL_EX(_feature, null, _callback_featureFn); } } function Auto_Draw_jijuk_ALL_EX(_feature, trans_Feature, _callback_featureFn) { var correction_Ok = true; //지적도 포함시 보정 (90%포함시 원본 포함, 5%포함시 버림) var jijuk_Features = []; var Togi_geometry = _feature.getGeometry(); var Area_Source = GetArea(Togi_geometry);//ol.sphere.getArea(PG_Geometry); var Search_pageIndex = 1; var extent = Togi_geometry.getExtent(); //이동되었을경우 var CT_diffX = 0; var CT_diffY = 0; if (trans_Feature) { CT_diffX = trans_Feature.values_["CT_diffX"]; CT_diffY = trans_Feature.values_["CT_diffY"]; if (CT_diffX && CT_diffY) { var Move_PG_Geometry = Togi_geometry.clone(); Move_PG_Geometry.translate(-CT_diffX, -CT_diffY); extent = Move_PG_Geometry.getExtent(); } else { CT_diffX = 0; CT_diffY = 0; } } var searchUrl = VWorld_searchUrl + 'cadastral' + "/data?"; var GeometryParam = "BBOX(" + extent[0] + ',' + extent[1] + ',' + extent[2] + ',' + extent[3] + ")"; var param = ""; param += "geometry=" + GeometryParam; param += "&output=json"; param += "&srsName=EPSG:900913"; param += "&apiKey=" + VWorldKey; param += "&domain=" + _getServerName(mainurl); param += "&pageIndex=" + Search_pageIndex.toString(); param += "&pageUnit=1000"; param += "&size=500"; var reqUrl = ProxyPHPVWorld_WFS + searchUrl + param; $.ajax({ type: 'GET', //dataType: "jsonp", jsonp: "callback", url: reqUrl, success: function (data) { try { var paginationInfoObj = data.paginationInfo; if (paginationInfoObj) { var Features_ALL = [] for (var idx = 0; idx < data.featureCollection.features.length; idx++) { try { var geojson_Feature = data.featureCollection.features[idx]; var geojsonObject = geojson_Feature.geometry; var features = (new ol.format.GeoJSON()).readFeatures(geojsonObject); for (var i = 0; i < features.length; i++) { try { var feature = features[i]; feature["id_"] = geojson_Feature.id; feature["properties"] = {}; for (var key in geojson_Feature.properties) { try { var value = geojson_Feature.properties[key]; feature.values_[key] = value; feature.properties[key] = value; } catch (e) { } } if (CT_diffX && CT_diffY) { feature.getGeometry().translate(CT_diffX, CT_diffY); } } catch (e) { } Features_ALL = Features_ALL.concat(features); } } catch (e) { } } Call_Function(Togi_geometry, Features_ALL); } else { if (_callback_featureFn) _callback_featureFn(null); } } catch (e) { } }, error: function (xhr, status, error) { if (_callback_featureFn) _callback_featureFn(null); } }); //////////////////////////////////////////////////////////////////////////////////////////////// function Call_Function(PG_Geometry, features) { var jijuk_count = 0; for (var i = 0; i < features.length; i++) { try { var feature = features[i]; var jibun = feature.values_["jibun"]; if (jibun) { var geometry = feature.getGeometry(); var intersection_Geometry = Get_intersection(PG_Geometry, geometry); if (intersection_Geometry) { try { var Area_intersection = GetArea(intersection_Geometry);//ol.sphere.getArea(intersection_Geometry); var JImok = ""; JImok = jibun.toString(); JImok = JImok.substr(JImok.length - 1); if (Number(JImok)) { JImok = ""; } if (Area_intersection > 0) { var Area_geometry = GetArea(geometry);//ol.sphere.getArea(geometry); var _Percent = Area_intersection / Area_geometry * 100; if (_Percent > 100) _Percent = 100; //영역자동설정에 반환 if (_Percent > 5 || _callback_featureFn) { //지적도 포함시 보정 (90%포함시 원본 포함, 5%포함시 버림) if (correction_Ok) { //if(_Percent >= 90){ if (_Percent >= 95) { intersection_Geometry = geometry; Area_intersection = Area_geometry; _Percent = 100; //New_PG_Geometry = Get_union(New_PG_Geometry, geometry) } } if (intersection_Geometry) { var _SourcePercent = Area_intersection / Area_Source * 100; if (_SourcePercent > 100) _SourcePercent = 100; _SourcePercent = Number(_SourcePercent.toFixed(2)); if (_SourcePercent > 0) { feature.setGeometry(intersection_Geometry); var addr = feature.values_["addr"]; var pnu = feature.values_["pnu"]; var Full_addr = addr + JImok; feature.values_["Org_geometry"] = geometry; feature.values_["addr"] = Full_addr; feature.values_["area"] = Area_intersection; feature.values_["Percent"] = _Percent;//_SourcePercent; feature.values_["HINT"] = Full_addr + "(" + _SourcePercent.toFixed(2) + "%)"; jijuk_Features.push(feature); jijuk_count++; } } } else { //지적도 포함시 보정 (90%포함시 원본 포함, 5%포함시 버림) if (correction_Ok) { //New_PG_Geometry = Get_difference(New_PG_Geometry, geometry); } } } } catch (e) { intersection_Geometry = intersection_Geometry; } } } } catch (e) { } } //영역자동설정에 반환 if (_callback_featureFn) { _callback_featureFn(jijuk_Features); }
} } //-------------------------------------------------------------------------------// var history_Stack = []; var currentIndex_Stack = -1; function history_saveState() { var features = LayerEditingLayer.getSource().getFeatures(); var cloned = features.map(f => f.clone()); //undo 상태에서만 redo 제거 if (currentIndex_Stack < history_Stack.length - 1) { history_Stack = history_Stack.slice(0, currentIndex_Stack + 1); } history_Stack.push(cloned); currentIndex_Stack++; history_updateUI(); } function history_applyState(state) { if (LayerEditing_Select) LayerEditing_Select.getFeatures().clear(); if (main_deleteOverlay) { that.Map2D.removeOverlay(main_deleteOverlay); main_deleteOverlay = null; } if (main_AutoDrawOverlay) { that.Map2D.removeOverlay(main_AutoDrawOverlay); main_AutoDrawOverlay = null; } var source = LayerEditingLayer.getSource(); source.clear(); state.forEach(function(f) { source.addFeature(f); }); } this.history_undo = function () { if (currentIndex_Stack <= 0) return; currentIndex_Stack--; var state = history_Stack[currentIndex_Stack]; history_applyState(state); history_updateUI(); } this.history_Redo = function () { if (currentIndex_Stack >= history_Stack.length - 1) return; currentIndex_Stack++; var state = history_Stack[currentIndex_Stack]; history_applyState(state); history_updateUI(); } function history_updateUI() { var canUndo = currentIndex_Stack > 0; var canRedo = currentIndex_Stack < history_Stack.length - 1; $('.sm_Undo').toggleClass('disabled', !canUndo); $('.sm_Redo').toggleClass('disabled', !canRedo); $('.sm_Undo .sm_text').text('되돌리기' + (currentIndex_Stack > 0 ? ('(' + currentIndex_Stack + ')'):'')); var _Index_Stack = (history_Stack.length - currentIndex_Stack - 1); $('.sm_Redo .sm_text').text('다시하기' + (_Index_Stack > 0 ? ('(' + _Index_Stack + ')'):'')); }; //-------------------------------------------------------------------------------// } |