sn: 지도 중심 위치로

This commit is contained in:
2026-03-13 13:33:59 +09:00
parent ea490bcdbc
commit 5f42eb080e
3 changed files with 419 additions and 100 deletions
@@ -2,8 +2,9 @@
import { SelectBox, type SelectDataType } from "../../../ui";
import { Button } from "@common/components/ui";
import { useCallback, useEffect, useState } from "react";
import { transform } from "ol/proj";
import GisApp from "../lib/gis.core";
import { moveMapToCenter, sidoCenter, sigunguCenter } from "./utils";
// import { getGeometryCenter } from "./utils";
const geoserverUrl =
"/geoserver/hasudo/ows?service=WFS&version=1.0.0&request=GetFeature&outputFormat=application/json";
@@ -18,7 +19,7 @@ interface SearchBarProps {
}
interface CenterSelectDataType extends SelectDataType {
center?: [number, number];
center?: [number, number]; // 좌표 중심 위치
}
export const ProcSearchBar = ({ gisMaps, facilityTypes }: SearchBarProps) => {
@@ -42,100 +43,16 @@ export const ProcSearchBar = ({ gisMaps, facilityTypes }: SearchBarProps) => {
facilityTypes?.length === 1 && facilityTypes[0] ? facilityTypes[0].val : "0",
);
const getGeometryCenter = (geometry: any): [number, number] | null => {
if (!geometry?.coordinates) return null;
let minX = Number.POSITIVE_INFINITY;
let minY = Number.POSITIVE_INFINITY;
let maxX = Number.NEGATIVE_INFINITY;
let maxY = Number.NEGATIVE_INFINITY;
const visit = (coords: any) => {
if (!Array.isArray(coords)) return;
if (
coords.length >= 2 &&
typeof coords[0] === "number" &&
typeof coords[1] === "number"
) {
const x = coords[0];
const y = coords[1];
if (x < minX) minX = x;
if (y < minY) minY = y;
if (x > maxX) maxX = x;
if (y > maxY) maxY = y;
return;
}
coords.forEach(visit);
};
visit(geometry.coordinates);
if (
!Number.isFinite(minX) ||
!Number.isFinite(minY) ||
!Number.isFinite(maxX) ||
!Number.isFinite(maxY)
) {
return null;
}
return [(minX + maxX) / 2, (minY + maxY) / 2];
};
const getMapCenterCoordinate = (centerCoord: [number, number]): [number, number] => {
const [x, y] = centerCoord;
const looksLikeLonLat = Math.abs(x) <= 180 && Math.abs(y) <= 90;
const looksLikeLatLonSwapped = Math.abs(x) <= 90 && Math.abs(y) <= 180;
if (looksLikeLonLat) {
return transform(centerCoord, GisApp.FROM_PROJ, GisApp.TO_PROJ) as [number, number];
}
if (looksLikeLatLonSwapped) {
return transform([y, x], GisApp.FROM_PROJ, GisApp.TO_PROJ) as [number, number];
}
return centerCoord;
};
const moveMapToCenter = (centerCoord?: [number, number], zoom?: number) => {
if (!centerCoord) return;
const map = gisMaps.current;
if (!map?.getView) return;
const view = map.getView();
const center = getMapCenterCoordinate(centerCoord);
if (!Number.isFinite(center[0]) || !Number.isFinite(center[1])) return;
const projection = view.getProjection?.();
const extent = projection?.getExtent?.();
if (extent) {
const [minX, minY, maxX, maxY] = extent;
if (center[0] < minX || center[0] > maxX || center[1] < minY || center[1] > maxY) {
console.warn("중심좌표가 지도 범위를 벗어나 이동을 중단합니다.", { center });
return;
}
}
view.animate({
center,
...(typeof zoom === "number" ? { zoom } : {}),
duration: 500,
});
};
const fetchSido = async () => {
const url = `/geoserver/hasudo/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=hasudo:tb_ms_ctpv&srsName=${GisApp.TO_PROJ}&outputFormat=application/json&propertyName=mctpv_korn_nm,mctpv_cd,geom`;
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((r) => r.json());
const list = (res.features || [])
.map((f: any) => ({
text: f.properties.mctpv_korn_nm,
val: f.properties.mctpv_cd,
center: getGeometryCenter(f.geometry) ?? undefined,
center: sidoCenter[f.properties.mctpv_cd?.trim()] //getGeometryCenter(f.geometry) ?? undefined,
}))
// .sort((a: any, b: any) => a.text.localeCompare(b.text, "ko"));
.sort((a: any, b: any) => {
// 커스텀 순서 정의
const customOrder = [
@@ -173,19 +90,19 @@ export const ProcSearchBar = ({ gisMaps, facilityTypes }: SearchBarProps) => {
// 둘 다 커스텀 순서에 없으면 기본 알파벳 순서
return a.text.localeCompare(b.text, 'ko');
});
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&srsName=${GisApp.TO_PROJ}&outputFormat=application/json&propertyName=sgg_cd,sgg_korn_nm,geom`;
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 url = `/geoserver/hasudo/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=hasudo:tb_ms_sgg&srsName=${GisApp.TO_PROJ}&outputFormat=application/json&propertyName=sgg_cd,sgg_korn_nm,geom`;
const res = await fetch(url).then((r) => r.json());
const list = (res.features || [])
.map((f: any) => ({
text: f.properties.sgg_korn_nm,
val: f.properties.sgg_cd,
center: getGeometryCenter(f.geometry) ?? undefined,
center: sigunguCenter[f.properties.sgg_cd?.trim()] //getGeometryCenter(f.geometry) ?? undefined,
}))
.sort((a: any, b: any) => a.text.localeCompare(b.text, "ko"));
@@ -349,13 +266,13 @@ export const ProcSearchBar = ({ gisMaps, facilityTypes }: SearchBarProps) => {
sigunData.find((item) => item.val === sigunValue);
if (selectedSigun?.center) {
moveMapToCenter(selectedSigun.center, 12);
moveMapToCenter(gisMaps, selectedSigun.center, 12);
return;
}
}
moveMapToCenter(selectedSido.center, 11);
}, [sidoValue, sigunValue, sidoData, filteredSigunData, sigunData]);
moveMapToCenter(gisMaps, selectedSido.center, 11);
}, [gisMaps, sidoValue, sigunValue, sidoData, filteredSigunData, sigunData]);
const handleFeatureFocus = (data: any) => {
const map = gisMaps.current;
@@ -4,6 +4,7 @@ import { Button } from "@common/components/ui";
import { useCallback, useEffect, useState } from "react";
import SearchInputText from "./SearchInputText";
import GisApp from "../lib/gis.core";
import { moveMapToCenter, sidoCenter, sigunguCenter } from "./utils";
const FACILITY_TYPE_URL_MAP: Record<string, string> = {
tb_il_swage_prcs_fclt:
@@ -29,6 +30,10 @@ interface SearchBarProps {
onInit?: any;
}
interface CenterSelectDataType extends SelectDataType {
center?: [number, number];
}
export const SearchBar = ({
gisMaps,
facilityTypes,
@@ -45,13 +50,13 @@ export const SearchBar = ({
[]
);
const [sidoData, setSidoData] = useState<SelectDataType[]>([
const [sidoData, setSidoData] = useState<CenterSelectDataType[]>([
{ text: "시도", val: "0" },
]);
const [sigunData, setSigunData] = useState<SelectDataType[]>([
const [sigunData, setSigunData] = useState<CenterSelectDataType[]>([
{ text: "시군구", val: "0" },
]);
const [filteredSigunData, setFilteredSigunData] = useState<SelectDataType[]>([
const [filteredSigunData, setFilteredSigunData] = useState<CenterSelectDataType[]>([
{ text: "시군구", val: "0" },
]);
@@ -60,7 +65,11 @@ export const SearchBar = ({
const json = await res.json();
const sidoList = json
.filter((item: any) => item.lwpoCd?.length === 2)
.map((item: any) => ({ val: item.lwpoCd, text: item.lwpoCdNm }))
.map((item: any) => ({
val: item.lwpoCd,
text: item.lwpoCdNm,
center: sidoCenter[item.lwpoCd?.trim()],
}))
.sort((a: any, b: any) => {
// 커스텀 순서 정의
const customOrder = [
@@ -100,7 +109,11 @@ export const SearchBar = ({
});
const sigunList = json
.filter((item: any) => item.lwpoCd?.length > 2)
.map((item: any) => ({ val: item.lwpoCd, text: item.lwpoCdNm }))
.map((item: any) => ({
val: item.lwpoCd,
text: item.lwpoCdNm,
center: sigunguCenter[item.lwpoCd?.trim()],
}))
.sort((a: any, b: any) => a.text.localeCompare(b.text, 'ko'));
setSidoData([{ text: "시도", val: "0" }, ...sidoList]);
setSigunData(sigunList);
@@ -146,7 +159,29 @@ export const SearchBar = ({
);
const handleSearch = async () => {
if (!fcltyNm) return alert("시설명을 입력하세요.");
if (!fcltyNm) {
if (sidoValue === "0") {
alert("시도를 선택해 주세요");
return;
}
const selectedSido = sidoData.find((item) => item.val === sidoValue);
if (!selectedSido?.center) return;
if (sigunValue !== "0") {
const selectedSigun =
filteredSigunData.find((item) => item.val === sigunValue) ??
sigunData.find((item) => item.val === sigunValue);
if (selectedSigun?.center) {
moveMapToCenter(gisMaps, selectedSigun.center, 12);
return;
}
}
moveMapToCenter(gisMaps, selectedSido.center, 11);
return;
}
const sidoNm = sidoData.find((item) => item.val === sidoValue)?.text || "";
const sggNm = sigunData.find((item) => item.val === sigunValue)?.text || "";
@@ -0,0 +1,367 @@
import type { RefObject } from "react";
import { transform } from "ol/proj";
import GisApp from "../lib/gis.core";
export const getGeometryCenter = (geometry: any): [number, number] | null => {
if (!geometry?.coordinates) return null;
let minX = Number.POSITIVE_INFINITY;
let minY = Number.POSITIVE_INFINITY;
let maxX = Number.NEGATIVE_INFINITY;
let maxY = Number.NEGATIVE_INFINITY;
const visit = (coords: any) => {
if (!Array.isArray(coords)) return;
if (
coords.length >= 2 &&
typeof coords[0] === "number" &&
typeof coords[1] === "number"
) {
const x = coords[0];
const y = coords[1];
if (x < minX) minX = x;
if (y < minY) minY = y;
if (x > maxX) maxX = x;
if (y > maxY) maxY = y;
return;
}
coords.forEach(visit);
};
visit(geometry.coordinates);
if (
!Number.isFinite(minX) ||
!Number.isFinite(minY) ||
!Number.isFinite(maxX) ||
!Number.isFinite(maxY)
) {
return null;
}
return [(minX + maxX) / 2, (minY + maxY) / 2];
};
export const getMapCenterCoordinate = (centerCoord: [number, number]): [number, number] => {
const [x, y] = centerCoord;
const looksLikeLonLat = Math.abs(x) <= 180 && Math.abs(y) <= 90;
const looksLikeLatLonSwapped = Math.abs(x) <= 90 && Math.abs(y) <= 180;
if (looksLikeLonLat) {
return transform(centerCoord, GisApp.FROM_PROJ, GisApp.TO_PROJ) as [number, number];
}
if (looksLikeLatLonSwapped) {
return transform([y, x], GisApp.FROM_PROJ, GisApp.TO_PROJ) as [number, number];
}
return centerCoord;
};
export const moveMapToCenter = (
gisMaps: RefObject<any>,
centerCoord?: [number, number],
zoom?: number,
) => {
if (!centerCoord) return;
const map = gisMaps.current;
if (!map?.getView) return;
const view = map.getView();
const center = getMapCenterCoordinate(centerCoord);
if (!Number.isFinite(center[0]) || !Number.isFinite(center[1])) return;
const projection = view.getProjection?.();
const extent = projection?.getExtent?.();
if (extent) {
const [minX, minY, maxX, maxY] = extent;
if (center[0] < minX || center[0] > maxX || center[1] < minY || center[1] > maxY) {
console.warn("중심좌표가 지도 범위를 벗어나 이동을 중단합니다.", { center });
return;
}
}
view.animate({
center,
...(typeof zoom === "number" ? { zoom } : {}),
duration: 500,
});
};
export const sidoCenter: Record<string, [number, number]> = {
"11": [953551.4119216551, 1951826.357686395], // 서울특별시
"26": [1139616.39795744, 1683535.70569214], // 부산광역시
"27": [1101486.7843035748, 1774852.3345170799], // 대구광역시
"28": [923114.560964345, 1943066.5795316151], // 인천광역시
"29": [939294.465052485, 1684630.0528689548], // 광주광역시
"30": [991301.069516585, 1816039.953510165], // 대전광역시
"31": [1155621.6870651902, 1727062.69578941], // 울산광역시
"36": [979381.304388835, 1841430.83666584], // 세종특별자치시
"41": [965621.8990488851, 1954345.5683645], // 경기도
"51": [1065114.938094025, 1980661.8453088552], // 강원특별자치도
"43": [1041183.7558293699, 1848671.9260201901], // 충청북도
"44": [918689.7963483699, 1836216.9375309348], // 충청남도
"52": [949568.330647045, 1748060.215177075], // 전북특별자치도
"46": [906934.38266853, 1637218.959990745], // 전라남도
"47": [1207219.543276005, 1843195.136606685], // 경상북도
"48": [1081504.77257488, 1690185.644486565], // 경상남도
"50": [912295.3285630699, 1508716.724020285], // 제주특별자치도
};
export const sigunguCenter: Record<string, [number, number]> = {
"41820": [994886.197272545, 1979052.53325589], // 가평군
"11680": [961673.31210415, 1944170.63969123], // 강남구
"11740": [968769.7482373801, 1950018.61637764], // 강동구
"51150": [1117008.10469879, 1968660.393087245], // 강릉시
"11305": [957184.89551525, 1960948.17897649], // 강북구
"11500": [940169.1006571399, 1952038.261591505], // 강서구
"26440": [1125722.34144724, 1680630.4026719849], // 강서구
"46810": [933212.18802734, 1624923.4715329101], // 강진군
"28710": [889789.267999845, 1967857.594168955], // 강화군
"48310": [1102135.950034755, 1651860.5015630699], // 거제시
"48880": [1035035.401801025, 1746287.958522825], // 거창군
"47290": [1119807.604852405, 1761907.1228125598], // 경산시
"47130": [1157713.8626030548, 1763907.92371664], // 경주시
"44250": [977015.65488622, 1810444.360246635], // 계룡시
"28245": [932663.7165225251, 1951314.751646345], // 계양구
"47830": [1074241.6005863552, 1748726.26930297], // 고령군
"48820": [1073144.623548525, 1668111.92215727], // 고성군
"51820": [1079906.976889925, 2044841.96337935], // 고성군
"41281": [945034.57886003, 1962467.607140625], // 고양시 덕양구
"41285": [937759.4023643399, 1964877.5403761598], // 고양시 일산동구
"41287": [931767.42700348, 1964473.38259711], // 고양시 일산서구
"52790": [918393.62804468, 1716132.826828825], // 고창군
"46770": [982955.40283695, 1619845.06015117], // 고흥군
"46720": [976956.4637679299, 1689787.68075054], // 곡성군
"44150": [962642.898486655, 1831283.240475945], // 공주시
"41290": [956128.575373195, 1937342.1591869402], // 과천시
"11620": [950816.2708264501, 1940837.18159646], // 관악구
"41210": [943658.93750771, 1938982.666803485], // 광명시
"29200": [931929.616476265, 1685710.56302553], // 광산구
"46230": [1014247.5910250349, 1670923.40464431], // 광양시
"41610": [981367.9647162401, 1933496.23707509], // 광주시
"11215": [963403.339472115, 1949946.5079550901], // 광진구
"43760": [1030949.630659295, 1864086.615596175], // 괴산군
"46730": [999616.7466281, 1692737.2456203648], // 구례군
"11530": [943255.85156361, 1944224.7496726601], // 구로구
"41310": [967836.346287095, 1955821.725581055], // 구리시
"47190": [1076297.5737083051, 1801900.2253747801], // 구미시
"52130": [904674.42544751, 1767715.183037305], // 군산시
"27720": [1103849.611897755, 1797204.1944948], // 군위군
"41410": [948411.5776788951, 1927135.757437655], // 군포시
"44710": [998110.87580872, 1792026.97835628], // 금산군
"26410": [1144696.85330015, 1697028.92074261], // 금정구
"11545": [946955.492372005, 1940271.753176735], // 금천구
"26710": [1155182.296211175, 1700204.308554315], // 기장군
"52210": [935224.890489175, 1755205.56953502], // 김제시
"47150": [1052988.6733146599, 1783129.650228145], // 김천시
"41570": [925936.0119416551, 1965389.1203246699], // 김포시
"48250": [1123054.361467805, 1698359.11561172], // 김해시
"46170": [927543.498211845, 1666547.3264012402], // 나주시
"26290": [1145395.56557786, 1682401.034936155], // 남구
"27200": [1097723.545359045, 1760233.9235273101], // 남구
"29155": [939966.74427248, 1678697.8498475049], // 남구
"31140": [1164388.02782853, 1725008.616189565], // 남구
"28200": [931330.60305263, 1937119.742216935], // 남동구
"41360": [976250.43203106, 1960416.01281481], // 남양주시
"52190": [993534.846345315, 1715101.9621615452], // 남원시
"48840": [1042145.28987352, 1636788.3540021451], // 남해군
"11350": [962686.53614943, 1961831.238915105], // 노원구
"44230": [969310.08745166, 1800569.86826501], // 논산시
"43800": [1083099.584261365, 1887213.24789353], // 단양군
"27290": [1092874.923985485, 1758802.075636735], // 달서구
"27710": [1092556.27778919, 1753550.63671916], // 달성군
"46710": [953252.8048743049, 1699620.87304459], // 담양군
"44270": [922626.193186825, 1879100.4990195702], // 당진시
"30230": [995239.980794815, 1823508.474804295], // 대덕구
"11320": [958705.07469343, 1963040.273132075], // 도봉구
"26170": [1140792.941703185, 1682445.908553165], // 동구
"27140": [1106713.2635032, 1771459.692642915], // 동구
"28140": [923114.560964345, 1943066.5795316151], // 동구
"29110": [950418.0804989601, 1680571.52359467], // 동구
"30110": [998801.519490555, 1813337.0627496801], // 동구
"31170": [1174320.64841428, 1726780.57547608], // 동구
"11230": [960324.5009049701, 1953909.102229775], // 동대문구
"41250": [963148.54470934, 1991284.1699954001], // 동두천시
"26260": [1143854.4548997101, 1691107.4825817398], // 동래구
"11590": [950875.3949149849, 1944274.8505625948], // 동작구
"51170": [1137915.778823135, 1947378.462972425], // 동해시
"11440": [947783.55349907, 1951598.7669664049], // 마포구
"46110": [897040.76889998, 1645038.46904772], // 목포시
"46840": [899587.661355305, 1664175.9893810651], // 무안군
"52730": [1019648.0651991949, 1770211.22681309], // 무주군
"47280": [1055620.11152262, 1855147.380883595], // 문경시
"28177": [926226.3594373399, 1940093.5607894901], // 미추홀구
"48270": [1117632.749546145, 1722736.830743895], // 밀양시
"44180": [896412.984839845, 1817364.412693855], // 보령시
"46780": [974939.082074685, 1646364.3864357], // 보성군
"43720": [1018843.696119875, 1832681.50774474], // 보은군
"47920": [1125627.975921425, 1881676.019098885], // 봉화군
"26230": [1140857.032737495, 1686905.10585393], // 부산진구
"52800": [906904.98605649, 1743711.597374285], // 부안군
"44760": [943835.889385045, 1803731.764881715], // 부여군
"41194": [937043.513148805, 1941917.36078241], // 부천시 소사구
"41196": [937651.62357278, 1948088.650724335], // 부천시 오정구
"41192": [936542.71080553, 1945011.678412175], // 부천시 원미구
"28237": [931536.9013984001, 1944153.806361985], // 부평구
"26320": [1138778.50401134, 1694043.434930405], // 북구
"27230": [1096421.976926225, 1771028.86509079], // 북구
"29170": [947985.671802775, 1688420.968474115], // 북구
"31200": [1170007.9393788301, 1735147.271494125], // 북구
"26530": [1135648.05832921, 1685887.73780504], // 사상구
"48240": [1048464.90586407, 1669923.18795966], // 사천시
"26380": [1134089.12930976, 1669378.70600097], // 사하구
"48860": [1036496.214687915, 1711373.1111203502], // 산청군
"51230": [1142435.56217199, 1918978.17539709], // 삼척시
"47250": [1050861.110185015, 1827830.141259105], // 상주시
"26140": [1137931.5983933099, 1678744.3981297952], // 서구
"27170": [1094695.438967345, 1764784.74637237], // 서구
"28260": [922809.601799805, 1950975.3525035651], // 서구
"29140": [941246.057711575, 1682370.2693891348], // 서구
"30170": [985795.240808525, 1808929.24401602], // 서구
"50130": [912245.46105533, 1478972.2801259952], // 서귀포시
"11410": [950162.9458121, 1953864.48715979], // 서대문구
"44210": [909519.454637895, 1868915.7895147852], // 서산시
"44770": [925279.862903135, 1788678.070235445], // 서천군
"11650": [959137.357577965, 1942072.4465401699], // 서초구
"41135": [964805.8995280201, 1930763.3113245051], // 성남시 분당구
"41131": [965443.992413075, 1937401.663424345], // 성남시 수정구
"41133": [969601.35785571, 1937919.08950087], // 성남시 중원구
"11200": [959451.922221585, 1950244.43970465], // 성동구
"11290": [957924.54027983, 1956512.99273417], // 성북구
"47840": [1065227.20912238, 1769071.96163128], // 성주군
"36110": [979381.304388835, 1841430.83666584], // 세종특별자치시
"51210": [1089137.1194603802, 2019900.279034885], // 속초시
"11710": [965928.83189988, 1945132.495701395], // 송파구
"27260": [1104712.551021275, 1760363.086093105], // 수성구
"26500": [1146933.8448469099, 1686288.07716536], // 수영구
"41113": [954297.6961326799, 1918466.4324002499], // 수원시 권선구
"41117": [961096.623048695, 1919787.236461525], // 수원시 영통구
"41111": [955699.294199125, 1924459.3724800851], // 수원시 장안구
"41115": [956709.41575029, 1919672.72074137], // 수원시 팔달구
"52770": [962532.77503817, 1714757.02288094], // 순창군
"46150": [989441.17839757, 1668074.09581569], // 순천시
"41390": [934025.6249972349, 1932609.450570995], // 시흥시
"46910": [837068.838454425, 1628081.7615658198], // 신안군
"44200": [953095.1457245699, 1866467.6723041101], // 아산시
"47170": [1108716.740335165, 1841036.9856003649], // 안동시
"41273": [921146.8917017151, 1914174.551465955], // 안산시 단원구
"41271": [944787.9139680951, 1925074.1128969], // 안산시 상록구
"41550": [983047.68986298, 1891835.77152603], // 안성시
"41173": [951774.092625505, 1933701.863194715], // 안양시 동안구
"41171": [947757.35105343, 1934091.7197804102], // 안양시 만안구
"51800": [1044799.8868826301, 2018930.475621245], // 양구군
"48330": [1140452.0009971252, 1713003.89300298], // 양산시
"51830": [1097181.1822994999, 2001875.93591869], // 양양군
"41630": [957059.65493005, 1978556.8707086649], // 양주시
"11470": [943115.85871501, 1947726.50098438], // 양천구
"41830": [1006799.81121338, 1946640.3454016], // 양평군
"46130": [1005710.6789662449, 1606473.622557845], // 여수시
"41670": [1007389.488139985, 1920986.5590416798], // 여주시
"28185": [924301.1973107599, 1932716.5874987599], // 연수구
"26470": [1143967.4104618952, 1688206.29479672], // 연제구
"41800": [955142.1788103101, 2011772.731874695], // 연천군
"46870": [892341.432019105, 1700705.951765325], // 영광군
"47770": [1161246.6696252748, 1831801.285765445], // 영덕군
"26200": [1142949.35128876, 1676148.93128651], // 영도구
"43740": [1029111.7777370601, 1796414.720970885], // 영동군
"11560": [948221.9355719599, 1946989.433783595], // 영등포구
"46830": [918568.42419672, 1645644.03685685], // 영암군
"47760": [1147157.8720550952, 1855483.55416634], // 영양군
"51750": [1089601.7085692, 1913792.65877573], // 영월군
"47210": [1096747.798418135, 1876468.75553605], // 영주시
"47230": [1128168.955619915, 1779896.3669964802], // 영천시
"44810": [935536.49511435, 1852175.0178411552], // 예산군
"47900": [1083616.75364318, 1850758.419176175], // 예천군
"41370": [959957.253397675, 1907245.6871241601], // 오산시
"43730": [1016925.1630849349, 1812306.15335931], // 옥천군
"28720": [831017.06725137, 1941763.7671776651], // 옹진군
"46890": [934681.072970785, 1580260.96434381], // 완도군
"52710": [971714.974980355, 1764297.860421155], // 완주군
"11170": [954152.265892775, 1948105.11473188], // 용산구
"41463": [966362.167328945, 1919086.059435395], // 용인시 기흥구
"41465": [962751.309054115, 1926067.760215145], // 용인시 수지구
"41461": [979413.39966679, 1913728.657159615], // 용인시 처인구
"47940": [1339459.86503077, 1939972.251018405], // 울릉군
"31710": [1152103.383022245, 1727062.6953479801], // 울주군
"47930": [1158508.6557213152, 1879083.142978875], // 울진군
"51130": [1042675.604280725, 1925192.470561375], // 원주시
"30200": [985050.9636310451, 1820539.200680445], // 유성구
"11380": [949045.72456328, 1957730.2124330248], // 은평구
"43770": [1010863.03644352, 1888460.954926385], // 음성군
"48720": [1069027.787455435, 1710230.081700215], // 의령군
"47730": [1098114.724920975, 1818807.01762542], // 의성군
"41430": [954677.940289845, 1928890.756176705], // 의왕시
"41150": [962517.29720437, 1970466.861837395], // 의정부시
"41500": [998578.52141335, 1911408.9081171248], // 이천시
"52140": [954517.27659099, 1780482.64843965], // 익산시
"51810": [1065461.7186508449, 2010839.9914423148], // 인제군
"52750": [978229.1338949, 1735882.14962747], // 임실군
"46880": [932255.0392670301, 1705063.362106785], // 장성군
"52740": [1002766.6532682499, 1739693.270420835], // 장수군
"46800": [946864.73876017, 1628580.0165673052], // 장흥군
"52113": [965336.86328101, 1761811.9640769851], // 전주시 덕진구
"52111": [966893.605588815, 1754468.0213283598], // 전주시 완산구
"51770": [1110360.32014753, 1931013.538670365], // 정선군
"52180": [947098.239651715, 1735070.37728938], // 정읍시
"50110": [912295.3285630699, 1517557.88079664], // 제주시
"43150": [1055671.53255738, 1893115.04197246], // 제천시
"11110": [954639.31671291, 1955652.65017071], // 종로구
"11140": [955326.326625775, 1951065.0090038702], // 중구
"26110": [1139836.3880665852, 1680068.477323895], // 중구
"27110": [1098795.054998835, 1763956.48671014], // 중구
"28110": [911564.657720635, 1939430.9255974651], // 중구
"30140": [992213.91688503, 1809014.1589880502], // 중구
"31110": [1163388.19285627, 1732177.831362065], // 중구
"11260": [964157.58830932, 1955182.665424475], // 중랑구
"43745": [1009013.34585424, 1864734.46162539], // 증평군
"46900": [870540.7578711801, 1597916.46618356], // 진도군
"52720": [995028.62264954, 1758625.23076353], // 진안군
"48170": [1057167.869451315, 1689727.04548209], // 진주시
"43750": [994342.7517215649, 1875793.7535851048], // 진천군
"48740": [1090841.266427235, 1726085.44764784], // 창녕군
"48125": [1090604.085880495, 1682986.7331746249], // 창원시 마산합포구
"48127": [1095576.787610035, 1692901.162402945], // 창원시 마산회원구
"48123": [1106540.710278115, 1689830.08565991], // 창원시 성산구
"48121": [1105558.14181398, 1701648.763579805], // 창원시 의창구
"48129": [1111617.62626141, 1680996.6599733299], // 창원시 진해구
"44131": [974478.67761805, 1862026.08139811], // 천안시 동남구
"44133": [971707.02854063, 1875704.530427825], // 천안시 서북구
"51780": [997447.306165415, 2024301.05104793], // 철원군
"47820": [1116479.97088183, 1746481.442573125], // 청도군
"47750": [1139213.58132652, 1821067.804006115], // 청송군
"44790": [941752.03871163, 1827462.3607307798], // 청양군
"43111": [1009613.9680185751, 1841264.469202615], // 청주시 상당구
"43112": [994258.23710022, 1838908.2251619152], // 청주시 서원구
"43114": [997183.756680205, 1857171.4242312452], // 청주시 청원구
"43113": [989161.30366111, 1849501.26145491], // 청주시 흥덕구
"51110": [1023515.451806125, 1986727.7291947599], // 춘천시
"43130": [1034982.8699803599, 1889790.67989893], // 충주시
"47850": [1086736.697665845, 1779277.075473485], // 칠곡군
"51190": [1131634.14282853, 1912631.8063723398], // 태백시
"44825": [864678.84145598, 1854929.12571281], // 태안군
"48220": [1085316.421521755, 1640596.827168765], // 통영시
"41480": [941812.744809255, 1983528.9263305948], // 파주시
"51760": [1088652.567431635, 1949959.4658569149], // 평창군
"41220": [952557.5035727851, 1891740.1058186102], // 평택시
"41650": [979667.7288193901, 1996457.8400075398], // 포천시
"47111": [1173941.15980316, 1776164.6804896551], // 포항시 남구
"47113": [1155413.511896325, 1798939.39325854], // 포항시 북구
"41450": [974619.56368595, 1947933.69704679], // 하남시
"48850": [1023458.661997725, 1681485.3751938199], // 하동군
"48730": [1084848.02553882, 1699020.07367632], // 함안군
"48870": [1020953.178491215, 1727526.228066345], // 함양군
"46860": [910867.931249965, 1679203.045458965], // 함평군
"48890": [1060435.92013279, 1733941.90683859], // 합천군
"46820": [907157.24936254, 1615346.232287635], // 해남군
"26350": [1151062.0301465848, 1690808.34175552], // 해운대구
"44800": [919404.43702764, 1841255.1935457601], // 홍성군
"51720": [1049442.09422194, 1972233.65191397], // 홍천군
"41590": [941810.22622111, 1906896.59289364], // 화성시
"46790": [955520.512544285, 1669429.020528105], // 화순군
"51790": [1015098.9945956401, 2015706.532260655], // 화천군
"51730": [1046904.40402372, 1943541.6685614302], // 횡성군
};