Merge remote-tracking branch 'origin/feat/b03-route-shapefile' into feat/b07-cover-template

# Conflicts:
#	B03_FileInput/B03_FileInput_Service_Chain.py
This commit is contained in:
2026-09-01 15:34:07 +09:00
25 changed files with 841 additions and 109 deletions
+5 -5
View File
@@ -28,9 +28,9 @@ logger = logging.getLogger(__name__)
def _planned_route_points_in_project_crs(
project_root: Path, surface: dict[str, Any] | None = None
) -> list[dict[str, float]] | None:
"""계획노선 CSV를 읽어 프로젝트 좌표계(m) 점 목록으로 돌려준다. 없으면 None.
"""계획노선 파일(CSV·shapefile)을 읽어 프로젝트 좌표계(m) 점 목록으로 돌려준다.
B04 `/planned-route` 조회와 같은 규칙 — CSV가 제 좌표계(crs_epsg)를 적어 두었
B04 `/planned-route` 조회와 같은 규칙 — 파일이 제 좌표계를 싣고 있
프로젝트 좌표계와 다르면 한 번 옮긴다.
`surface`(확정 필터·방식·스무딩)를 받으면 지표면이 덮지 못하는 구간을 잘라 낸다.
@@ -41,7 +41,7 @@ def _planned_route_points_in_project_crs(
from common_util.common_util_route_geometry import (
densify_route,
find_planned_route_file,
read_planned_route_csv,
read_planned_route,
trim_route_to_surface,
)
from config.config_system import (
@@ -51,12 +51,12 @@ def _planned_route_points_in_project_crs(
)
route_file = find_planned_route_file(project_root / "B03_FileInput" / "input")
planned = read_planned_route_csv(route_file) if route_file else None
planned = read_planned_route(route_file) if route_file else None
if planned is None or len(planned.vertices) < 2:
return None
target_epsg = project_epsg_from_prj(project_root)
points = [(float(vertex.x), float(vertex.y)) for vertex in planned.vertices]
source_epsg = f"EPSG:{planned.epsg}" if planned.epsg else target_epsg
source_epsg = planned.crs_input or target_epsg
if source_epsg.upper() != target_epsg.upper():
from pyproj import Transformer