fix(B03/B04): PRJ 좌표계 판별을 문자열 매칭에서 WKT 정본+EPSG 라벨로 바꾼다
get_epsg_from_prj()가 WKT에 항상 있는 false_easting 때문에 EAST 분기가 무조건 걸려 모든 PRJ를 EPSG:5187로 판정했다(표준 WKT 6종 실측). 새 원청 자료의 5176(비표준 TOWGS84)·5179(AUTHORITY 없는 ESRI WKT)가 이 경로로 들어오면 최대 100km 어긋난다. - common_util/common_util_crs.py 신설: 판별 사다리(pyproj DB 대조 → AUTHORITY 태그 → 투영 파라미터 지문)와 변환 입력 정규화. 수평 성분에 TOWGS84가 박힌 PRJ는 EPSG로 갈아타지 않고 원문 WKT로 변환해 지역 보정을 보존한다. 수직 성분의 bound(KNGeoid)는 2D 변환에 무관하므로 무시. - B04 get_epsg_from_prj: 죽은 문자열 분기 제거, 유틸 위임. 시그니처 불변 — 기존 COMPD_CS 프로젝트는 예전과 같은 EPSG:5187 문자열이 나온다. - B03 _component_metadata: to_epsg 실패 시 사다리 라벨 보강, normalize_crs_metadata: BoundCRS 벗김(TOWGS84 PRJ 수평 탐색 실패 수정). 검증: tmp/tests/test_common_util_crs.py 13건 포함 스위트 29 passed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import logging
|
||||
import math
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
@@ -12,6 +13,8 @@ from pathlib import Path
|
||||
from PIL import Image
|
||||
from pyproj import Transformer
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# 설정 불러오기
|
||||
try:
|
||||
from config import config_system
|
||||
@@ -30,26 +33,22 @@ except ImportError:
|
||||
|
||||
|
||||
def get_epsg_from_prj(prj_content: str) -> str:
|
||||
"""PRJ 파일 텍스트 내용을 해석하여 적합한 EPSG 좌표계 코드를 추정합니다.
|
||||
"""PRJ 텍스트를 좌표 변환 입력 문자열로 정규화합니다.
|
||||
|
||||
기본 한반도 주요 좌표계 매핑:
|
||||
- Korea Central Belt (중부원점 20만, 60만) -> EPSG:5186 (Korea 2000 Central)
|
||||
- Korea East Belt (동부원점) -> EPSG:5187
|
||||
- Korea West Belt (서부원점) -> EPSG:5185
|
||||
- WGS84 UTM 52N -> EPSG:32652
|
||||
pyproj가 EPSG DB 정의와 일치를 확정하면 `"EPSG:n"`, 아니면 파일 WKT 그대로
|
||||
반환합니다(TOWGS84 지역 보정 보존) — 둘 다 `Transformer.from_crs` 입력으로
|
||||
동작합니다. WKT가 불량·공백일 때만 기존 기본값 중부원점을 유지합니다.
|
||||
|
||||
(2026-08-31 수리: 예전 문자열 매칭은 WKT에 항상 있는 `false_easting` 때문에
|
||||
"EAST" 분기가 무조건 걸려 모든 PRJ를 EPSG:5187로 판정했다.)
|
||||
"""
|
||||
prj_upper = prj_content.upper()
|
||||
if "EAST" in prj_upper:
|
||||
return "EPSG:5187"
|
||||
elif "WEST" in prj_upper:
|
||||
return "EPSG:5185"
|
||||
elif "CENTRAL" in prj_upper:
|
||||
return "EPSG:5186"
|
||||
elif "UTM" in prj_upper and "52N" in prj_upper:
|
||||
return "EPSG:32652"
|
||||
from common_util.common_util_crs import crs_input_from_prj
|
||||
|
||||
# 디폴트는 한국 중부 2000 좌표계 적용
|
||||
return "EPSG:5186"
|
||||
crs_input = crs_input_from_prj(prj_content)
|
||||
if crs_input is None:
|
||||
logger.warning("PRJ 좌표계 해석 실패 — 기본값 EPSG:5186 사용")
|
||||
return "EPSG:5186"
|
||||
return crs_input
|
||||
|
||||
|
||||
def latlon_to_tile(lat: float, lon: float, zoom: int) -> tuple[int, int]:
|
||||
|
||||
Reference in New Issue
Block a user