feat: 현장투수시험_평균투수계수_투수계수_총수두_하이픈_입력_지원

main
thkim 2025-10-16 16:52:55 +09:00
parent 91b72e5fc9
commit 1529c7ccaa
7 changed files with 352 additions and 27 deletions

View File

@ -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()) {

View File

@ -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"));

View File

@ -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---------------------------------");
}
}

View File

@ -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: "<div class='td-data'>#= (fieldperCasingDia == null) ? '0' : fieldperCasingDia #</div>" },
{ field: "fieldperCasingHeight", title: "케이싱길이(m)", editor: chooseEditor, width:120, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldperCasingHeight == null) ? '0' : fieldperCasingHeight #</div>" },
{ field: "fieldperAvgPermeability", title: "평균투수계수<br>(cm/sec)", editor: chooseTest, width:120, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldperAvgPermeability == null) ? '0' : fieldperAvgPermeability #</div>" },
{ field: "fieldperAvgPermeability", title: "평균투수계수<br>(cm/sec)", editor: chooseTest, width:120, attributes: { style:"text-align: right" },
template: function(data) {
//"<div class='td-data'>#= (fieldperAvgPermeability == null) ? '0' : fieldperAvgPermeability #</div>"
if( data.fieldperAvgPermeability === "") {
data.fieldperAvgPermeability = "0";
} else if( data.fieldperAvgPermeability === null) {
data.fieldperAvgPermeability = "0";
} else if( data.fieldperAvgPermeability === "-999") {
data.fieldperAvgPermeability = "-";
}
var url = "<div class='td-data' data-allow-hyphen='true'>" + data.fieldperAvgPermeability + "</div>";
return url;
}
},
{ field: "fieldperInspectedBy", title: "조사자", width:150, attributes: { style:"text-align: left" }, template: "<div class='td-data'>#= (fieldperInspectedBy == null) ? '-' : fieldperInspectedBy #</div>" },
{ field: "fieldperCheckedBy", title: "검수자", width:150, attributes: { style:"text-align: left" }, template: "<div class='td-data'>#= (fieldperCheckedBy == null) ? '-' : fieldperCheckedBy #</div>" },
{ field: "fieldperRemark", title: "비고", width:120, attributes: { style:"text-align: left" }, template: "<div class='td-data'>#= (fieldperRemark == null) ? '-' : fieldperRemark #</div>" },
@ -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: "시험<br>순서", width:60, attributes: { style:"text-align: center" } },
{ field: "fieldperSubTime", title: "시간(sec)<br/>(값 중복 허용 안 함)", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldperSubTime == null) ? '0' : fieldperSubTime #</div>" },
{ field: "fieldperSubTotalHead", title: "총수두(cm)", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldperSubTotalHead == null) ? '0' : fieldperSubTotalHead #</div>" },
{ field: "fieldperSubTotalHead", title: "총수두(cm)", editor: chooseEditorAllowHyphen, attributes: { style:"text-align: right" },
template: function(data) {
//"<div class='td-data'>#= (fieldperSubTotalHead == null) ? '0' : fieldperSubTotalHead #</div>"
if( data.fieldperSubTotalHead === "") {
data.fieldperSubTotalHead = "0";
} else if( data.fieldperSubTotalHead === null) {
data.fieldperSubTotalHead = "0";
} else if( data.fieldperSubTotalHead === "-999") {
data.fieldperSubTotalHead = "-";
}
var url = "<div class='td-data' data-allow-hyphen='true'>" + data.fieldperSubTotalHead + "</div>";
return url;
}
},
{ field: "fieldperSubFallingHead", title: "수두차(cm)", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldperSubFallingHead == null) ? '0' : fieldperSubFallingHead #</div>" },
{ field: "fieldperSubWaterLoose", title: "유출수량(㎤)", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldperSubWaterLoose == null) ? '0' : fieldperSubWaterLoose #</div>" },
{ field: "fieldperSubQuantity", title: "수량(㎤)", editor: chooseEditor, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldperSubQuantity == null) ? '0' : fieldperSubQuantity #</div>" },
{ field: "fieldperSubPermeability", title: "투수계수(K,cm/sec)", editor: chooseTest, attributes: { style:"text-align: right" }, template: "<div class='td-data'>#= (fieldperSubPermeability == null) ? '0' : fieldperSubPermeability #</div>" },
{ field: "fieldperSubPermeability", title: "투수계수(K,cm/sec)", editor: chooseTest, attributes: { style:"text-align: right" },
template: function(data) {
//"<div class='td-data'>#= (fieldperSubPermeability == null) ? '0' : fieldperSubPermeability #</div>"
if( data.fieldperSubPermeability === "") {
data.fieldperSubPermeability = "0";
} else if( data.fieldperSubPermeability === null) {
data.fieldperSubPermeability = "0";
} else if( data.fieldperSubPermeability === "-999") {
data.fieldperSubPermeability = "-";
}
var url = "<div class='td-data' data-allow-hyphen='true'>" + data.fieldperSubPermeability + "</div>";
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) {

View File

@ -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 =
'<div id="geologyMinePopup" style="position: absolute; width: 300px; z-index: 10000; box-shadow: 0 5px 15px rgba(0,0,0,0.5); font-family: \'Malgun Gothic\', sans-serif; visibility: hidden;">' +
' <div class="popup-header" style="background-color: #004e99; color: white; font-size: 16px; font-weight: bold; padding: 8px 10px; cursor: move; display: flex; justify-content: space-between; align-items: center;">' +
' <span>광산 레이어 선택</span>' +
' <button id="closeMinePopupBtn" style="background: none; border: none; font-size: 20px; color: white; cursor: pointer; line-height: 1;">&times;</button>' +
' </div>' +
' <ul id="mineLayerListContainer" style="list-style: none; padding: 0; margin: 0; max-height: 400px; overflow-y: auto; border: 1px solid #ddd; background-color: #fff;">';
for (var i = 0; i < mineLayerList.length; i++) {
popupHtml += '<li class="mine-layer-item" style="padding: 10px; border-bottom: 1px solid #eee; cursor: pointer;">' + mineLayerList[i].replace('지화학도_', '') + '</li>';
}
popupHtml += '</ul></div>';
// 3. 생성된 HTML을 <body>에 추가하고 위치를 계산합니다.
$('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();
});
}