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