diff --git a/src/main/java/geoinfo/com/WebConfirm.java b/src/main/java/geoinfo/com/WebConfirm.java index d4628b48..4ad77d4f 100644 --- a/src/main/java/geoinfo/com/WebConfirm.java +++ b/src/main/java/geoinfo/com/WebConfirm.java @@ -1727,7 +1727,8 @@ public class WebConfirm com_code = isnull(resultSet.getString("COM_CODE")); } else { - sql = "SELECT MAX(TO_NUMBER(COM_CODE))+1 AS MAX_CODE FROM " + tbl_name; + sql = "SELECT MAX(TO_NUMBER(COM_CODE))+1 AS MAX_CODE FROM " + tbl_name + " " + + "WHERE REGEXP_LIKE(COM_CODE, '^[0-9]+$')"; query = new DatabaseQuery(sql); resultSet = query.execute(connection); if (resultSet.next()) { diff --git a/src/main/java/geoinfo/main/main/MainController.java b/src/main/java/geoinfo/main/main/MainController.java index 65715694..1b190b71 100644 --- a/src/main/java/geoinfo/main/main/MainController.java +++ b/src/main/java/geoinfo/main/main/MainController.java @@ -179,6 +179,8 @@ public class MainController ModelAndView mv = new ModelAndView(); String src = request.getParameter("src"); + + int nCls = MyUtil.getIntegerFromObject(request.getSession().getAttribute("CLS")); if( src != null && src.toLowerCase().equals("drilling") ) { mv.addObject("isFromDrillingSystem", true); @@ -207,8 +209,7 @@ public class MainController } else { mv.addObject("isLogin", true); - - if ("admin_user".equals(request.getSession().getAttribute("USERID").toString()) == true) { + if ("admin_user".equals(request.getSession().getAttribute("USERID").toString()) == true || nCls == 65535) { EgovMap regiCount = commonService.getRegiCountAdmin(); mv.addObject("WAIT_CNT", regiCount.get("waitCnt")); mv.addObject("CONFIRM_CNT", regiCount.get("confirmCnt")); diff --git a/src/main/java/geoinfo/security/MyPermission b/src/main/java/geoinfo/security/MyPermission new file mode 100644 index 00000000..14026b95 --- /dev/null +++ b/src/main/java/geoinfo/security/MyPermission @@ -0,0 +1,65 @@ +public class MyPermission { + + // 1. 각 권한에 대한 플래그를 2의 거듭제곱으로 정의합니다. + public static final int PERMISSION_NONE = 0; // 0000 + public static final int PERMISSION_READ = 1; // 0001 + public static final int PERMISSION_WRITE = 2; // 0010 + public static final int PERMISSION_EXECUTE = 4; // 0100 + public static final int PERMISSION_DELETE = 8; // 1000 + + public static void main(String[] args) { + + // 2. 여러 권한을 하나의 정수 변수에 할당 (읽기 + 쓰기 권한 부여) + int myPermissions = PERMISSION_READ | PERMISSION_WRITE; // 1 | 2 = 3 (0011) + + System.out.println("초기 권한 설정 (읽기, 쓰기)"); + printPermissions(myPermissions); + + // 3. 특정 권한이 있는지 확인 + System.out.println("\n--- 권한 확인 ---"); + // (myPermissions & PERMISSION_READ) != 0 으로 체크해도 동일합니다. + if ((myPermissions & PERMISSION_READ) == PERMISSION_READ) { + System.out.println("결과: 읽기 권한이 있습니다."); + } + if ((myPermissions & PERMISSION_EXECUTE) == PERMISSION_EXECUTE) { + System.out.println("결과: 실행 권한이 있습니다."); + } else { + System.out.println("결과: 실행 권한이 없습니다."); + } + + // 4. 기존 권한에 새로운 권한 추가 (실행 권한 추가) + System.out.println("\n--- 실행 권한 추가 ---"); + myPermissions |= PERMISSION_EXECUTE; // myPermissions = myPermissions | PERMISSION_EXECUTE; + printPermissions(myPermissions); + + // 5. 특정 권한 제거 (쓰기 권한 제거) + System.out.println("\n--- 쓰기 권한 제거 ---"); + myPermissions &= ~PERMISSION_WRITE; // myPermissions = myPermissions & ~PERMISSION_WRITE; + printPermissions(myPermissions); + + // 6. 권한 토글 (XOR 연산, 있으면 없애고 없으면 추가) + System.out.println("\n--- 읽기 권한 토글 (제거) ---"); + myPermissions ^= PERMISSION_READ; + printPermissions(myPermissions); + + System.out.println("\n--- 읽기 권한 토글 (다시 추가) ---"); + myPermissions ^= PERMISSION_READ; + printPermissions(myPermissions); + } + + /** + * 현재 설정된 권한 상태를 출력하는 헬퍼 메서드 + */ + public static void printPermissions(int permissions) { + System.out.println("현재 권한 값 (Decimal): " + permissions); + System.out.println("현재 권한 값 (Binary): " + Integer.toBinaryString(permissions)); + + System.out.print("포함된 권한: "); + if ((permissions & PERMISSION_READ) == PERMISSION_READ) System.out.print("READ "); + if ((permissions & PERMISSION_WRITE) == PERMISSION_WRITE) System.out.print("WRITE "); + if ((permissions & PERMISSION_EXECUTE) == PERMISSION_EXECUTE) System.out.print("EXECUTE "); + if ((permissions & PERMISSION_DELETE) == PERMISSION_DELETE) System.out.print("DELETE "); + if (permissions == PERMISSION_NONE) System.out.print("NONE"); + System.out.println("\n---------------------------------"); + } +} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/web/input/basic/labInfoFieldPermeability.jsp b/src/main/webapp/WEB-INF/views/web/input/basic/labInfoFieldPermeability.jsp index ff5224c8..dd2a54ec 100644 --- a/src/main/webapp/WEB-INF/views/web/input/basic/labInfoFieldPermeability.jsp +++ b/src/main/webapp/WEB-INF/views/web/input/basic/labInfoFieldPermeability.jsp @@ -232,6 +232,9 @@ function fn_isNumeric(fieldData, fieldName, msgTest) { function fn_validateLength(fieldData, fieldName, msgTest, intLength, decimalLength) { for (let i = 0; i < fieldData.length; i++) { let value = fieldData[i][fieldName]; + if( value === -999 ) { + continue; + } let parts = value.toString().split("."); if (parts[0].length > intLength || (parts[1] && parts[1].length > decimalLength)) { alert(msgTest + "의 값은 정수 : " + intLength + "자리, 소수점 이하 : " + decimalLength + "자리까지 입력할 수 있습니다."); @@ -241,14 +244,43 @@ function fn_validateLength(fieldData, fieldName, msgTest, intLength, decimalLeng return true; } +function changeHyphenToMinus999Main(data) { + for( idx in data ) { + // -(hyphen) 허용한 것을 -999로 변환한다. + var targetItemKey = 'fieldperAvgPermeability'; + data[idx][targetItemKey] = changeHyphenToMinus999(data[idx][targetItemKey]); + } + + return data; +} + +function changeHyphenToMinus999Sub(data) { + for( idx in data ) { + // -(hyphen) 허용한 것을 -999로 변환한다. + var targetItemKey = 'fieldperSubTotalHead'; + data[idx][targetItemKey] = changeHyphenToMinus999(data[idx][targetItemKey]); + + targetItemKey = 'fieldperSubPermeability'; + data[idx][targetItemKey] = changeHyphenToMinus999(data[idx][targetItemKey]); + } + + return data; +} + +function changeHyphenToMinus999(data) { + if( data === '-' ) { + data = -999; + } + return data; +} + //Data 저장. function fn_save(rUrl) { - //240103 임효주 - 현장투수시험 (평균)투수계수의 type 에러 예방. 해당 값이 숫자 또는 공백인지 확인 let fieldData1 = kendoJQuery("#kictGrid1").data("kendoGrid")._data; let fieldName1 = "fieldperAvgPermeability"; // 수정됨 let msgTest1 = "평균투수계수"; - + fieldData1 = changeHyphenToMinus999Main(fieldData1); if (!fn_isNumeric(fieldData1, fieldName1, msgTest1)) { return false; } @@ -256,7 +288,7 @@ function fn_save(rUrl) { let fieldData2 = kendoJQuery("#kictGrid2").data("kendoGrid")._data; let fieldName2 = "fieldperSubPermeability"; // 수정됨 let msgTest2 = "투수계수"; - + fieldData2 = changeHyphenToMinus999Sub(fieldData2); if (!fn_isNumeric(fieldData2, fieldName2, msgTest2)) { return false; } @@ -339,9 +371,11 @@ function fn_save(rUrl) { if(fn_saveNumberCheckKendo("ROW", dataSource2, grid2, "gridCheck2", 0, rowInfo2, rowInfoItem2) == false)return false; //data1 + data1 = changeHyphenToMinus999Main(data1); var kendoData1 = fn_kendoAllDataXml02(grid1, kendoColCount1, kendoRowCount1, 0, data1); //data2 + data2 = changeHyphenToMinus999Sub(data2); var kendoData2 = fn_kendoAllDataXml02(grid2, kendoColCount2, kendoRowCount2, 0, data2); // ----------------------- kendoGrid XML 구조저장 끝 ----------------------- @@ -887,7 +921,20 @@ function fn_grid_refresh(){ }, { field: "fieldperCasingDia", title: "케이싱지름(cm)", editor: chooseEditor, width:120, attributes: { style:"text-align: right" }, template: "
#= (fieldperCasingDia == null) ? '0' : fieldperCasingDia #
" }, { field: "fieldperCasingHeight", title: "케이싱길이(m)", editor: chooseEditor, width:120, attributes: { style:"text-align: right" }, template: "
#= (fieldperCasingHeight == null) ? '0' : fieldperCasingHeight #
" }, - { field: "fieldperAvgPermeability", title: "평균투수계수
(cm/sec)", editor: chooseTest, width:120, attributes: { style:"text-align: right" }, template: "
#= (fieldperAvgPermeability == null) ? '0' : fieldperAvgPermeability #
" }, + { field: "fieldperAvgPermeability", title: "평균투수계수
(cm/sec)", editor: chooseTest, width:120, attributes: { style:"text-align: right" }, + template: function(data) { + //"
#= (fieldperAvgPermeability == null) ? '0' : fieldperAvgPermeability #
" + if( data.fieldperAvgPermeability === "") { + data.fieldperAvgPermeability = "0"; + } else if( data.fieldperAvgPermeability === null) { + data.fieldperAvgPermeability = "0"; + } else if( data.fieldperAvgPermeability === "-999") { + data.fieldperAvgPermeability = "-"; + } + var url = "
" + data.fieldperAvgPermeability + "
"; + return url; + } + }, { field: "fieldperInspectedBy", title: "조사자", width:150, attributes: { style:"text-align: left" }, template: "
#= (fieldperInspectedBy == null) ? '-' : fieldperInspectedBy #
" }, { field: "fieldperCheckedBy", title: "검수자", width:150, attributes: { style:"text-align: left" }, template: "
#= (fieldperCheckedBy == null) ? '-' : fieldperCheckedBy #
" }, { field: "fieldperRemark", title: "비고", width:120, attributes: { style:"text-align: left" }, template: "
#= (fieldperRemark == null) ? '-' : fieldperRemark #
" }, @@ -962,7 +1009,7 @@ function fn_grid_refresh(){ oldFieldperCode: { type: "string" }, fieldperOrder: { type: "number", editable: false }, fieldperSubTime: { type: "number" }, - fieldperSubTotalHead: { type: "number" }, + fieldperSubTotalHead: { type: "string" }, fieldperSubFallingHead: { type: "number" }, fieldperSubWaterLoose: { type: "number" }, fieldperSubQuantity: { type: "number" }, @@ -977,11 +1024,37 @@ function fn_grid_refresh(){ columns: [ { field: "fieldperOrder", title: "시험
순서", width:60, attributes: { style:"text-align: center" } }, { field: "fieldperSubTime", title: "시간(sec)
(값 중복 허용 안 함)", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "
#= (fieldperSubTime == null) ? '0' : fieldperSubTime #
" }, - { field: "fieldperSubTotalHead", title: "총수두(cm)", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "
#= (fieldperSubTotalHead == null) ? '0' : fieldperSubTotalHead #
" }, + { field: "fieldperSubTotalHead", title: "총수두(cm)", editor: chooseEditorAllowHyphen, attributes: { style:"text-align: right" }, + template: function(data) { + //"
#= (fieldperSubTotalHead == null) ? '0' : fieldperSubTotalHead #
" + if( data.fieldperSubTotalHead === "") { + data.fieldperSubTotalHead = "0"; + } else if( data.fieldperSubTotalHead === null) { + data.fieldperSubTotalHead = "0"; + } else if( data.fieldperSubTotalHead === "-999") { + data.fieldperSubTotalHead = "-"; + } + var url = "
" + data.fieldperSubTotalHead + "
"; + return url; + } + }, { field: "fieldperSubFallingHead", title: "수두차(cm)", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "
#= (fieldperSubFallingHead == null) ? '0' : fieldperSubFallingHead #
" }, { field: "fieldperSubWaterLoose", title: "유출수량(㎤)", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "
#= (fieldperSubWaterLoose == null) ? '0' : fieldperSubWaterLoose #
" }, { field: "fieldperSubQuantity", title: "수량(㎤)", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "
#= (fieldperSubQuantity == null) ? '0' : fieldperSubQuantity #
" }, - { field: "fieldperSubPermeability", title: "투수계수(K,cm/sec)", editor: chooseTest, attributes: { style:"text-align: right" }, template: "
#= (fieldperSubPermeability == null) ? '0' : fieldperSubPermeability #
" }, + { field: "fieldperSubPermeability", title: "투수계수(K,cm/sec)", editor: chooseTest, attributes: { style:"text-align: right" }, + template: function(data) { + //"
#= (fieldperSubPermeability == null) ? '0' : fieldperSubPermeability #
" + if( data.fieldperSubPermeability === "") { + data.fieldperSubPermeability = "0"; + } else if( data.fieldperSubPermeability === null) { + data.fieldperSubPermeability = "0"; + } else if( data.fieldperSubPermeability === "-999") { + data.fieldperSubPermeability = "-"; + } + var url = "
" + data.fieldperSubPermeability + "
"; + return url; + } + }, { field: "seq", hidden: true }, { field: "newFieldperCode", hidden: true }, { field: "oldFieldperCode", hidden: true }, @@ -1040,6 +1113,14 @@ function fn_grid_refresh(){ break; } } + + function chooseEditorAllowHyphen(container, options) { + switch (options.model.COLUMN) { + default: + numericEditorAllowHyphen(container, options); + break; + } + } function chooseTest(container, options) { diff --git a/src/main/webapp/js/map/main/map.js b/src/main/webapp/js/map/main/map.js index 7a2b1348..476e1d4a 100644 --- a/src/main/webapp/js/map/main/map.js +++ b/src/main/webapp/js/map/main/map.js @@ -383,6 +383,58 @@ var autoCircle = false; var circleDraw = false; +var MINE_POPUP = null; // 광산 팝업 객체를 저장할 변수 +var mineDragControl = null; // 광산 팝업의 드래그 컨트롤을 저장할 변수 +var geologyLayers = { + "지질도_5만_지질도": "L_50K_Geology_Map", + "지질도_25만_지질도": "L_250K_Geology_Map", + "지질도_100만_지질도": "L_1M_Geology_Map", + "5만_지질도_도곽": "l_50k_geology_frame_latest", + "지구물리이상도_부게중력이상도": "Bouguer_Gravity_Raster_2018", + "지구물리이상도_지각평형중력이상도": "Isostatic_Gravity_Raster_2018", + "지구물리이상도_자력이상도": "Magnetic_Raster_2018", + "지화학도_전기전도도": "L_geochemMP_SW_EC", + "지화학도_수소이온농도도": "L_geochemMP_SW_PH", + "지화학도_니켈": "L_geochemMP_NI", + "지화학도_루비듐": "L_geochemMP_RB", + "지화학도_리튬": "L_geochemMP_LI", + "지화학도_마그네슘": "L_geochemMP_MGO", + "지화학도_망간": "L_geochemMP_MNO", + "지화학도_바나듐": "L_geochemMP_V", + "지화학도_바륨": "L_geochemMP_BA", + "지화학도_스트론튬": "L_geochemMP_SR", + "지화학도_아연": "L_geochemMP_V", + "지화학도_지르코늄": "L_geochemMP_V", + "지화학도_철": "L_geochemMP_V", + "지화학도_칼륨": "L_geochemMP_V", + "지화학도_칼슘": "L_geochemMP_V", + "지화학도_코발트": "L_geochemMP_V", + "지화학도_크롬": "L_geochemMP_V", + "지화학도_티탄": "L_geochemMP_V", + "지화학도_납": "L_geochemMP_V", + "지화학도_구리": "L_geochemMP_V", + "탄전지질도_1만_탄전지질도": "L_10k_coalfield_geologic_map", + "탄전지질도_2.5만_탄전지질도": "L_25k_coalfield_geologic_map", + "해저지질도_탐사항적도": "Marine_geology_prospect", + "해저지질도_해저지형도": "M_geology_topography", + "해저지질도_시료채취위치도": "M_geology_sample_location", + "해저지질도_표층퇴적물평균입도분포도": "M_geology_deposits_mean_particle", + "해저지질도_표층퇴적물유형분포도": "M_geology_deposits_type", + "해저지질도_유기탄소함량분포도": "M_geology_organic_carbon", + "해저지질도_해저퇴적물등층후도": "M_geology_deposits_isopach", + "해저지질도_자력특성분포도": "M_geology_magnetic", + "해저지질도_중력특성분포도": "M_geology_gravity", + "해저지질도_탐사파단면해석도": "M_geology_seismic_sections", + "동위원소_연대지도_심성암_동위원소": "L_1M_isotope_plutonic", + "동위원소_연대지도_화산암_동위원소": "L_1M_isotope_volcanic", + "동위원소_연대지도_변성암_동위원소": "L_1M_isotope_plutonic", + "동위원소_연대지도_광상_동위원소": "L_1M_isotope_plutonic", + "지체구조도": "G_tectonic", + "한국의_지질노두": "outcrop_korea", + "메디컬_점토": "medical_clay" + }; +var geologyLayersKey = null; // 지질 광산 layer명 + function initApp(param){ // --------------------- // 지도 생성 @@ -703,16 +755,19 @@ function initApp(param){ BASE_MAP.addLayer(HOLE_LAYER); + + + + geologyLayersKey = "지질도_25만_지질도"; // ▼▼▼ 지질도 WMS 레이어 생성 (초기에는 보이지 않도록 설정) ▼▼▼ // 1. 고정 파라미터를 포함한 기본 URL을 문자열로 정의합니다. - var geologyBaseUrl = "https://data.kigam.re.kr/openapi/wms" + + var geologyBaseUrl = "https://sgeoinfo.kict.re.kr/wms_cache/openapi/wms" + "?SERVICE=WMS" + "&VERSION=1.3.0" + // 정상 동작하는 요청의 버전 "&REQUEST=GetMap" + "&FORMAT=image/png" + "&TRANSPARENT=true" + - "&key=1v1mp2XH6yPhiYdLCo6MFQJQ53970A" + // 소문자 'key' - "&LAYERS=L_250K_Geology_Map" + + "&LAYERS=" + geologyLayers[geologyLayersKey] //https://data.kigam.re.kr/map/openapimanual/openapiLayerList.html "&TILED=true" + "&CRS=EPSG:3857" + // 1.3.0 버전에 맞는 CRS "&STYLES="; @@ -5012,6 +5067,8 @@ function showSichuInfo2(){ } +//기존 geologyMode 함수를 지우고 아래의 코드로 교체하세요. + function geologyMode() { initControl(); // 다른 컨트롤 상태 초기화 @@ -5024,26 +5081,146 @@ function geologyMode() { // 현재 레이어의 표시 상태를 가져옵니다. var isVisible = GEOLOGY_LAYER.getVisibility(); - if (isVisible) { + if (isVisible && geologyLayersKey === "지질도_25만_지질도" ) { // 레이어가 현재 보이고 있다면, 숨깁니다. GEOLOGY_LAYER.setVisibility(false); CTL_INFO.setText("지질 Off"); CTL_INFO.deactivate(); // 정보창도 비활성화 } else { - // 레이어가 현재 숨겨져 있다면, 보이게 합니다. - GEOLOGY_LAYER.setVisibility(true); - CTL_INFO.setText("지질 On"); - CTL_INFO.activate(); - $("#CTL_INFO").css("bottom", "65px"); - $("#CTL_INFO").css("left", "20px"); + // 레이어가 현재 숨겨져 있다면, + // 1. 표시할 기본 지질도 키를 설정합니다. + geologyLayersKey = "지질도_25만_지질도"; + var wmsLayerName = geologyLayers[geologyLayersKey]; + + if (wmsLayerName) { + // 2. 정규표현식을 사용하여 URL에서 'LAYERS=' 파라미터의 값만 교체합니다. + // (광산 뷰에서 다른 레이어로 변경되었을 수 있으므로 항상 기본값으로 재설정) + var newUrl = GEOLOGY_LAYER.url.replace(/(LAYERS=)([^&]*)/, '$1' + wmsLayerName); + + // 3. 레이어 객체의 url 속성을 직접 변경합니다. + GEOLOGY_LAYER.url = newUrl; + + // 4. 레이어를 보이게 설정하고 강제로 다시 그립니다. + GEOLOGY_LAYER.setVisibility(true); + GEOLOGY_LAYER.redraw(true); + + // 5. 정보창 텍스트를 업데이트합니다. + CTL_INFO.setText("지질 On"); + CTL_INFO.activate(); + $("#CTL_INFO").css("bottom", "65px"); + $("#CTL_INFO").css("left", "20px"); + } else { + console.error("기본 지질도 레이어를 찾을 수 없습니다:", geologyLayersKey); + } } } -function geologyMine(){ - initControl(); - CTL_INFO.setText("광산 On"); - CTL_INFO.activate(); - $("#CTL_INFO").css("bottom","65px"); - $("#CTL_INFO").css("left","20px"); -} +function geologyMine() { + initControl(); // 다른 컨트롤 상태 초기화 + + // 이전에 생성된 팝업과 관련 이벤트 리스너를 확실하게 제거합니다. + $(document).off('mousemove.minePopup').off('mouseup.minePopup'); + if ($('#geologyMinePopup').length > 0) { + $('#geologyMinePopup').remove(); + } + + // 1. 팝업에 표시할 목록 데이터를 배열로 정의합니다. + var mineLayerList = [ + "지화학도_전기전도도", "지화학도_수소이온농도도", "지화학도_니켈", + "지화학도_루비듐", "지화학도_리튬", "지화학도_마그네슘", "지화학도_망간", + "지화학도_바나듐", "지화학도_바륨", "지화학도_스트론튬", "지화학도_아연", + "지화학도_지르코늄", "지화학도_철", "지화학도_칼륨", "지화학도_칼슘", + "지화학도_코발트", "지화학도_크롬", "지화학도_티탄", "지화학도_납", "지화학도_구리" + ].reverse(); + + // 2. 팝업창의 HTML 구조를 만듭니다. + var popupHtml = + ''; + + // 3. 생성된 HTML을 에 추가하고 위치를 계산합니다. + $('body').append(popupHtml); + var popup = $('#geologyMinePopup'); + var popupWidth = popup.outerWidth(); + var popupHeight = popup.outerHeight(); + var initialTop = $(window).height() - popupHeight - 20; + var initialLeft = $(window).width() - popupWidth - 80; + popup.css({ + top: initialTop + 'px', + left: initialLeft + 'px', + visibility: 'visible' + }); + + // 4. 드래그 기능 구현 + var isDragging = false; + var offset = { x: 0, y: 0 }; + var header = popup.find('.popup-header'); + + header.on('mousedown', function(e) { + isDragging = true; + var popupPos = popup.offset(); + offset.x = e.pageX - popupPos.left; + offset.y = e.pageY - popupPos.top; + e.preventDefault(); + }); + + $(document).on('mousemove.minePopup', function(e) { + if (isDragging) { + popup.offset({ + top: e.pageY - offset.y, + left: e.pageX - offset.x + }); + } + }); + + $(document).on('mouseup.minePopup', function() { + isDragging = false; + }); + + // 5. 팝업 내 요소들에 이벤트 바인딩 + $('#closeMinePopupBtn').on('click', function() { + $(document).off('mousemove.minePopup').off('mouseup.minePopup'); + popup.remove(); + }); + + $('.mine-layer-item').hover( + function() { $(this).css('background-color', '#e9efff'); }, + function() { $(this).css('background-color', '#fff'); } + ).click(function() { + var selectedItemText = $(this).text(); + geologyLayersKey = "지화학도_" + selectedItemText; + var wmsLayerName = geologyLayers[geologyLayersKey]; + + if (GEOLOGY_LAYER && wmsLayerName) { + var newUrl = GEOLOGY_LAYER.url.replace(/(LAYERS=)([^&]*)/, '$1' + wmsLayerName); + + // ▼▼▼ 핵심 수정 부분 ▼▼▼ + // 레이어 객체의 url 속성을 직접 변경하는 대신, setUrl() 메소드를 사용합니다. + GEOLOGY_LAYER.setUrl(newUrl); + // ▲▲▲ 핵심 수정 부분 ▲▲▲ + + GEOLOGY_LAYER.setVisibility(true); + GEOLOGY_LAYER.redraw(true); + + CTL_INFO.setText("광산: " + selectedItemText); + CTL_INFO.activate(); + $("#CTL_INFO").css("bottom", "65px"); + $("#CTL_INFO").css("left", "20px"); + } else { + console.error("선택한 항목에 대한 레이어를 찾을 수 없습니다:", geologyLayersKey); + } + + $(document).off('mousemove.minePopup').off('mouseup.minePopup'); + popup.remove(); + }); +} \ No newline at end of file diff --git a/src/main/webapp/web/preview/FIELD_PERMEABILITY.reb b/src/main/webapp/web/preview/FIELD_PERMEABILITY.reb index 967e7809..0350108a 100644 Binary files a/src/main/webapp/web/preview/FIELD_PERMEABILITY.reb and b/src/main/webapp/web/preview/FIELD_PERMEABILITY.reb differ diff --git a/src/main/webapp/web/service/FIELD_PERMEABILITY.reb b/src/main/webapp/web/service/FIELD_PERMEABILITY.reb index 2307ee00..11046a8d 100644 Binary files a/src/main/webapp/web/service/FIELD_PERMEABILITY.reb and b/src/main/webapp/web/service/FIELD_PERMEABILITY.reb differ