@@ -156,7 +170,7 @@ export default function DrgtSttn() {
onChange: (date: string | undefined) => {
const year = date ? date.slice(0, 4) : '';
let month = date?.slice(4);
- if (month&&month?.length < 2) {
+ if (month && month?.length < 2) {
month = month?.padStart(2, "0");
}
const formatted = `${year}${month}`;
@@ -172,7 +186,7 @@ export default function DrgtSttn() {
onChange: (date: string | undefined) => {
const year = date ? date.slice(0, 4) : '';
let month = date?.slice(4);
- if (month&&month.length < 2) {
+ if (month && month.length < 2) {
month = month?.padStart(2, "0");
}
const formatted = `${year}${month}`;
@@ -211,7 +225,7 @@ export default function DrgtSttn() {
sggText = sidoText;
}
- const searchArr:string[] = [];
+ const searchArr: string[] = [];
if (sidoText) searchArr.push(sidoText);
if (Array.isArray(sggText)) {
searchArr.push(...sggText);
@@ -234,7 +248,7 @@ export default function DrgtSttn() {
diff --git a/apps/wr/middleware.ts b/apps/wr/middleware.ts
index d068f6aa5..c5c7f8c01 100644
--- a/apps/wr/middleware.ts
+++ b/apps/wr/middleware.ts
@@ -91,6 +91,8 @@ export function middleware(req: NextRequest) {
let queryParams = searchParams.toString();
const typename = searchParams.get("TYPENAME");
console.log("typename ", typename);
+ const startYmd = searchParams.get("START_YMD") ?? null;
+ const endYmd = searchParams.get("END_YMD") ?? null;
let newUrl = `${GEOSERVER_URL}${pathname.replace("/geoserver", "")}${queryParams ? `?${queryParams}` : ""}`;
@@ -116,10 +118,13 @@ export function middleware(req: NextRequest) {
typename == "hasudo:tb_wr_rswtr_fclt" || //중수도시설
typename == "hasudo:tb_wr_htdfl_fclt" || //온배수시설
typename == "hasudo:tb_wr_ruse_fclt_dmd_co" || //수요처
- typename == "hasudo:tb_wr_tmpr_dmd_co" //잠재수요처
+ typename == "hasudo:tb_wr_tmpr_dmd_co" || //잠재수요처
+ typename?.startsWith("hasudo:drought") //가뭄 지도
) {
const url = req.nextUrl.clone();
url.searchParams.set("TYPENAME", typename.replace("hasudo:", ""));
+ if (startYmd) url.searchParams.set("startYmd", startYmd);
+ if (endYmd) url.searchParams.set("endYmd", endYmd);
queryParams = url.searchParams.toString();
newUrl = `${SEWERAGE_API_URL}/v1/map/geometry${queryParams ? `?${queryParams}` : ""}`;
}
diff --git a/apps/wr/package.json b/apps/wr/package.json
index a29dcd66b..bb170c820 100644
--- a/apps/wr/package.json
+++ b/apps/wr/package.json
@@ -21,6 +21,8 @@
"lucide-react": "^0.474.0",
"moment": "^2.30.1",
"next": "15.1.7",
+ "ol": "^7.3.0",
+ "ol-ext": "^4.0.11",
"react-hook-form": "^7.54.2",
"react-hot-toast": "^2.5.2",
"react-i18next": "^15.6.0",
diff --git a/packages/common/business_components/src/ui/map/Gis.js b/packages/common/business_components/src/ui/map/Gis.js
index 2ca7ed051..3d810b48d 100644
--- a/packages/common/business_components/src/ui/map/Gis.js
+++ b/packages/common/business_components/src/ui/map/Gis.js
@@ -123,8 +123,8 @@ function Gis({
orderedLayers = [],
checkInterval = 3000,
height: height = "h-[calc(100vh-5rem)]",
- onOpenPopup=(data)=>{}
-
+ onOpenPopup = (data) => { },
+ droughtDates = { startYmd: '', endYmd: '' }
}) {
const mapRef = useRef();
const [mapObject, setMapObject] = useState({});
@@ -283,6 +283,17 @@ function Gis({
GisApp.layerCode = layerCode; // 전역 레이어 코드 설정
}, [treeData]);
+ // droughtDates를 전역(GisApp)에 반영
+ useEffect(() => {
+ if (typeof window === "undefined") return;
+ if (droughtDates?.startYmd && droughtDates?.endYmd) {
+ GisApp.DROUGHT_DATES = {
+ startYmd: String(droughtDates.startYmd),
+ endYmd: String(droughtDates.endYmd),
+ };
+ }
+ }, [droughtDates?.startYmd, droughtDates?.endYmd]);
+
const getLayerItems = (layerCode) => {
const layerItems = Object.entries(layerCode)
.filter(([key, obj], idx) => obj?.updtPsblYn === "Y")
diff --git a/packages/common/business_components/src/ui/map/lib/gis.core.js b/packages/common/business_components/src/ui/map/lib/gis.core.js
index d2379e417..5a6e705da 100644
--- a/packages/common/business_components/src/ui/map/lib/gis.core.js
+++ b/packages/common/business_components/src/ui/map/lib/gis.core.js
@@ -27,6 +27,8 @@ const GisApp = {};
*/
//레이어 정보
GisApp.layerInfos = [];
+// 가뭄 레이어 날짜 전역 보관소 추가
+GisApp.DROUGHT_DATES = { startYmd: '', endYmd: '' };
//기본정보
GisApp.GEOSERVER_URL = '/geoserver/hasudo/ows';
GisApp.GEOSERVER_WMS_URL = '/geoserver/hasudo/wms';
diff --git a/packages/common/business_components/src/ui/map/lib/gis.layer.js b/packages/common/business_components/src/ui/map/lib/gis.layer.js
index 2d436ed12..6cbc054f8 100644
--- a/packages/common/business_components/src/ui/map/lib/gis.layer.js
+++ b/packages/common/business_components/src/ui/map/lib/gis.layer.js
@@ -112,7 +112,7 @@ GisOlLayer.prototype = {
let toProj = GisApp.TO_PROJ;
let lyrTyNm = options.lyrTyNm;
let typename = this.storageNm + lyrTyNm;
- let filter = options?.flterSql && options.flterSql && options.flterSql.trim() !== ''
+ let filter = options?.flterSql && options.flterSql && options.flterSql.trim() !== '';
let params = {};
params['TYPENAME'] = typename;
@@ -122,6 +122,10 @@ GisOlLayer.prototype = {
params['SRS'] = toProj;
params['OUTPUTFORMAT'] = 'application/json';
if (filter) params['CQL_FILTER'] = filter;
+ else if (GisApp.DROUGHT_DATES) {
+ params['START_YMD'] = GisApp.DROUGHT_DATES.startYmd;
+ params['END_YMD'] = GisApp.DROUGHT_DATES.endYmd;
+ }
let strParams = new URLSearchParams(params).toString();
let source = new VectorSource({
diff --git a/packages/common/business_components/src/ui/map/searchBar/comboSearchBar.tsx b/packages/common/business_components/src/ui/map/searchBar/comboSearchBar.tsx
index 999b46569..3289ae53f 100644
--- a/packages/common/business_components/src/ui/map/searchBar/comboSearchBar.tsx
+++ b/packages/common/business_components/src/ui/map/searchBar/comboSearchBar.tsx
@@ -54,30 +54,25 @@ export const ComboSearchBar = ({
//시도, 시군구 조회
const fetchSido = async () => {
- const url = `/cms-service/api/v1/code/cache/ADSTDSTRCD/Y`;
- const res = await fetch(url);
- const json = await res.json();
- const sidoList = json
- .filter(
- (item: any) =>
- typeof item.lwpoCd === "string" && item.lwpoCd.length === 2,
- )
- .map((feature: any) => ({
- val: feature.lwpoCd,
- text: feature.lwpoCdNm,
- }));
- setSidoData([{ text: "선택", val: "0" }, ...sidoList]);
+ const url = `/geoserver/hasudo/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=hasudo:tb_ms_ctpv&outputFormat=application/json&propertyName=mctpv_korn_nm,mctpv_cd`;
+ const res = await fetch(url).then(res => res.json());
- const sigunList = json
- .filter(
- (item: any) =>
- typeof item.lwpoCd === "string" && item.lwpoCd.length !== 2,
- )
- .map((feature: any) => ({
- val: feature.lwpoCd,
- text: feature.lwpoCdNm,
- }));
- setSigunData(sigunList);
+ const list = res.features.map((f: any) => ({
+ text: f.properties.mctpv_korn_nm,
+ val: f.properties.mctpv_cd,
+ }));
+ setSidoData([{ text: "선택", val: "0" }, ...list]);
+ };
+
+ const fetchSigungu = async () => {
+ const url = `/geoserver/hasudo/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=hasudo:tb_ms_sgg&outputFormat=application/json&propertyName=sgg_cd,sgg_korn_nm`;
+ const res = await fetch(url).then(res => res.json());
+
+ const list = res.features.map((f: any) => ({
+ text: f.properties.sgg_korn_nm,
+ val: f.properties.sgg_cd,
+ }));
+ setSigunData(list);
};
//시설명 콤보박스 조회
@@ -170,6 +165,7 @@ export const ComboSearchBar = ({
//시도, 시군구 초기 데이터 조회
useEffect(() => {
fetchSido();
+ fetchSigungu();
}, []);
//시군구 데이터 초기화
diff --git a/packages/common/business_components/src/ui/map/searchBar/procSearchBar.tsx b/packages/common/business_components/src/ui/map/searchBar/procSearchBar.tsx
index b5f00d07b..dbded59af 100644
--- a/packages/common/business_components/src/ui/map/searchBar/procSearchBar.tsx
+++ b/packages/common/business_components/src/ui/map/searchBar/procSearchBar.tsx
@@ -39,32 +39,26 @@ export const ProcSearchBar = ({ gisMaps, facilityTypes }: SearchBarProps) => {
: "0",
);
- //시도, 시군구 조회
const fetchSido = async () => {
- const url = `/cms-service/api/v1/code/cache/ADSTDSTRCD/Y`;
- const res = await fetch(url);
- const json = await res.json();
- const sidoList = json
- .filter(
- (item: any) =>
- typeof item.lwpoCd === "string" && item.lwpoCd.length === 2,
- )
- .map((feature: any) => ({
- val: feature.lwpoCd,
- text: feature.lwpoCdNm,
- }));
- setSidoData([{ text: "시도", val: "0" }, ...sidoList]);
+ const url = `/geoserver/hasudo/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=hasudo:tb_ms_ctpv&outputFormat=application/json&propertyName=mctpv_korn_nm,mctpv_cd`;
+ const res = await fetch(url).then(res => res.json());
- const sigunList = json
- .filter(
- (item: any) =>
- typeof item.lwpoCd === "string" && item.lwpoCd.length !== 2,
- )
- .map((feature: any) => ({
- val: feature.lwpoCd,
- text: feature.lwpoCdNm,
- }));
- setSigunData(sigunList);
+ const list = res.features.map((f: any) => ({
+ text: f.properties.mctpv_korn_nm,
+ val: f.properties.mctpv_cd,
+ }));
+ setSidoData([{ text: "선택", val: "0" }, ...list]);
+ };
+
+ const fetchSigungu = async () => {
+ const url = `/geoserver/hasudo/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=hasudo:tb_ms_sgg&outputFormat=application/json&propertyName=sgg_cd,sgg_korn_nm`;
+ const res = await fetch(url).then(res => res.json());
+
+ const list = res.features.map((f: any) => ({
+ text: f.properties.sgg_korn_nm,
+ val: f.properties.sgg_cd,
+ }));
+ setSigunData(list);
};
//시설명 콤보박스 조회
@@ -157,6 +151,7 @@ export const ProcSearchBar = ({ gisMaps, facilityTypes }: SearchBarProps) => {
//시도, 시군구 초기 데이터 조회
useEffect(() => {
fetchSido();
+ fetchSigungu();
}, []);
//시군구 데이터 초기화