182 lines
8.2 KiB
Python
182 lines
8.2 KiB
Python
# VWorld API 및 프로젝트 전역 설정 파일
|
|
import os
|
|
|
|
# 개발환경(IS_DEV = True) 또는 배포환경(IS_DEV = False) 정의
|
|
IS_DEV = True
|
|
|
|
# VWorld API Key (국토교통부 브이월드 오픈 API 인증키)
|
|
VWORLD_API_KEY = os.environ.get("VWORLD_API_KEY", "3DBD7306-7DBD-38BB-B292-267C5ED7AC6B")
|
|
|
|
# 최대 3D 뷰어 렌더링 포인트 수
|
|
MAX_RENDER_POINTS = 10_000_000
|
|
|
|
# 3D 포인트클라우드 뷰어 초기 표시 설정
|
|
# 밀도는 현재 UI 눈금에 맞춰 10~100 범위의 10 단위 값을 사용합니다.
|
|
POINT_CLOUD_INITIAL_DENSITY_PERCENT = 50
|
|
POINT_CLOUD_INITIAL_POINT_SIZE = 0.30
|
|
|
|
# 최초 렌더링에 사용할 지면 필터
|
|
# 허용값: "grid_min_z", "csf", "pmf", "ransac"
|
|
POINT_CLOUD_INITIAL_FILTER = "csf"
|
|
|
|
# 지표면 모델 개발/검증 설정
|
|
# 아래 값은 초기 권장값이며 샘플 결과를 확인하면서 자유롭게 조정할 수 있습니다.
|
|
TERRAIN_MODEL_SOURCE_FILTERS = ("grid_min_z", "csf", "pmf")
|
|
TERRAIN_MODEL_INITIAL_SOURCE_FILTER = "csf"
|
|
TERRAIN_MODEL_INITIAL_METHOD = "tin"
|
|
TERRAIN_MODEL_PRECOMPUTE = ("tin", "dtm", "nurbs", "implicit", "meshfree")
|
|
|
|
# 공통 계산 및 브라우저 미리보기 제한
|
|
TERRAIN_MODEL_PREVIEW_FORMAT = "glb"
|
|
TERRAIN_MODEL_MAX_PREVIEW_VERTICES = 500_000
|
|
TERRAIN_MODEL_TILE_SIZE_METERS = 50.0
|
|
TERRAIN_MODEL_SYNC_TIMEOUT_SECONDS = 3_600
|
|
|
|
# 실제 지면 포인트 외곽선과 안쪽 메쉬 기준선
|
|
TERRAIN_MODEL_FOOTPRINT_RESOLUTION_METERS = 1.0
|
|
TERRAIN_MODEL_FOOTPRINT_GAP_CLOSE_METERS = 1.0
|
|
TERRAIN_MODEL_BOUNDARY_INSET_METERS = 1.0
|
|
TERRAIN_MODEL_KEEP_LARGEST_FOOTPRINT = True
|
|
|
|
# 방식별 초기 파라미터
|
|
TIN_MAX_INPUT_POINTS = 500_000
|
|
DTM_GRID_RESOLUTION_METERS = 0.05
|
|
NURBS_DEGREE = 3
|
|
NURBS_PATCH_SIZE_METERS = 50.0
|
|
NURBS_CONTROL_POINTS_PER_AXIS = 16
|
|
IMPLICIT_TILE_SIZE_METERS = 50.0
|
|
IMPLICIT_MAX_POINTS_PER_TILE = 10_000
|
|
IMPLICIT_SMOOTHING = 0.1
|
|
MESHFREE_MAX_MODEL_POINTS = 500_000
|
|
MESHFREE_POINT_RADIUS_METERS = 0.15
|
|
|
|
# 등고선(Contour) 추출 설정
|
|
CONTOUR_INTERVAL_METERS = 1.0 # 기본 등고선 간격(높이), 사용자 입력으로 override 가능
|
|
CONTOUR_GRID_RESOLUTION_METERS = 1.0 # 표고 격자 환원 해상도
|
|
CONTOUR_MIN_INTERVAL_METERS = 0.5 # 사용자 입력 허용 최소 간격 (과도한 레벨 폭주 방지)
|
|
|
|
# 표면 스무딩(Surface Smoothing) 설정
|
|
SMOOTHING_METHODS = ("dtm", "tin")
|
|
SMOOTHING_ENABLED_DEFAULT = True
|
|
|
|
# DTM 스무딩 강도 및 보간 옵션
|
|
SMOOTHING_DTM_SIGMA_METERS = 0.5
|
|
SMOOTHING_DTM_SPLINE_SMOOTH = 0.0
|
|
SMOOTHING_DTM_PREVIEW_RESOLUTION_METERS = 0.5
|
|
|
|
# TIN 스무딩 강도 및 Taubin 필터 옵션
|
|
SMOOTHING_TIN_TAUBIN_ITERATIONS = 10
|
|
SMOOTHING_TIN_TAUBIN_LAMBDA = 0.5
|
|
SMOOTHING_TIN_TAUBIN_MU = -0.53
|
|
|
|
# API와 향후 변환 오케스트레이터가 함께 사용하는 설정 묶음
|
|
TERRAIN_MODEL_CONFIG = {
|
|
"source_filters": TERRAIN_MODEL_SOURCE_FILTERS,
|
|
"initial_source_filter": TERRAIN_MODEL_INITIAL_SOURCE_FILTER,
|
|
"initial_method": TERRAIN_MODEL_INITIAL_METHOD,
|
|
"precompute": TERRAIN_MODEL_PRECOMPUTE,
|
|
"preview_format": TERRAIN_MODEL_PREVIEW_FORMAT,
|
|
"max_preview_vertices": TERRAIN_MODEL_MAX_PREVIEW_VERTICES,
|
|
"tile_size_meters": TERRAIN_MODEL_TILE_SIZE_METERS,
|
|
"sync_timeout_seconds": TERRAIN_MODEL_SYNC_TIMEOUT_SECONDS,
|
|
"footprint_resolution_meters": TERRAIN_MODEL_FOOTPRINT_RESOLUTION_METERS,
|
|
"footprint_gap_close_meters": TERRAIN_MODEL_FOOTPRINT_GAP_CLOSE_METERS,
|
|
"boundary_inset_meters": TERRAIN_MODEL_BOUNDARY_INSET_METERS,
|
|
"keep_largest_footprint": TERRAIN_MODEL_KEEP_LARGEST_FOOTPRINT,
|
|
"tin_max_input_points": TIN_MAX_INPUT_POINTS,
|
|
"dtm_grid_resolution_meters": DTM_GRID_RESOLUTION_METERS,
|
|
"nurbs_degree": NURBS_DEGREE,
|
|
"nurbs_patch_size_meters": NURBS_PATCH_SIZE_METERS,
|
|
"nurbs_control_points_per_axis": NURBS_CONTROL_POINTS_PER_AXIS,
|
|
"implicit_tile_size_meters": IMPLICIT_TILE_SIZE_METERS,
|
|
"implicit_max_points_per_tile": IMPLICIT_MAX_POINTS_PER_TILE,
|
|
"implicit_smoothing": IMPLICIT_SMOOTHING,
|
|
"meshfree_max_model_points": MESHFREE_MAX_MODEL_POINTS,
|
|
"meshfree_point_radius_meters": MESHFREE_POINT_RADIUS_METERS,
|
|
"contour_interval_meters": CONTOUR_INTERVAL_METERS,
|
|
"contour_grid_resolution_meters": CONTOUR_GRID_RESOLUTION_METERS,
|
|
"contour_min_interval_meters": CONTOUR_MIN_INTERVAL_METERS,
|
|
|
|
# 스무딩 관련 파라미터 등록
|
|
"smoothing_methods": SMOOTHING_METHODS,
|
|
"smoothing_enabled_default": SMOOTHING_ENABLED_DEFAULT,
|
|
"smoothing_dtm_sigma_meters": SMOOTHING_DTM_SIGMA_METERS,
|
|
"smoothing_dtm_spline_smooth": SMOOTHING_DTM_SPLINE_SMOOTH,
|
|
"smoothing_dtm_preview_resolution_meters": SMOOTHING_DTM_PREVIEW_RESOLUTION_METERS,
|
|
"smoothing_tin_taubin_iterations": SMOOTHING_TIN_TAUBIN_ITERATIONS,
|
|
"smoothing_tin_taubin_lambda": SMOOTHING_TIN_TAUBIN_LAMBDA,
|
|
"smoothing_tin_taubin_mu": SMOOTHING_TIN_TAUBIN_MU,
|
|
}
|
|
|
|
# --- 2단계 경로 설계용 최적경로 (Least-Cost Path) 파라미터 ---
|
|
ROUTE_W_DIST = 1.0
|
|
ROUTE_W_GRADE = 2.0
|
|
ROUTE_W_SIDE = 1.5
|
|
ROUTE_W_CURVE = 0.5
|
|
ROUTE_W_AVOID = 10.0
|
|
ROUTE_MAX_GRADE = 0.14
|
|
ROUTE_GRID_RES_M = 2.0
|
|
ROUTE_AVOID_DEFAULT_RADIUS_M = 25.0
|
|
ROUTE_DEFAULT_GRADE_CLASS = "trunk"
|
|
|
|
# 경로 비용면(2m 격자)의 최대 셀 수 한도. 이 값을 넘으면 탐색 전에 오류를 반환한다.
|
|
# (계획서 I-102: 예상 배열 크기가 한도를 넘으면 계산 전 차단)
|
|
ROUTE_MAX_COST_CELLS = 4_000_000
|
|
|
|
# 필수 통과점(BP/CP/EP)에서 최종 경로까지 허용하는 최대 수평거리(m).
|
|
# 격자 스냅·평활 후 이 값을 초과하면 결과에 경고로 표시한다. (계획서 I-103/8장)
|
|
ROUTE_REQUIRED_POINT_TOLERANCE_M = 1.0
|
|
|
|
# API 입력 검증 범위 (계획서 I-104/7.2)
|
|
ROUTE_GRADE_CLASSES = ("trunk", "branch", "work") # 허용 임도 등급
|
|
ROUTE_MIN_CURVE_RADIUS_RANGE_M = (1.0, 1000.0) # 최소 곡선반지름 허용 범위
|
|
ROUTE_AVOID_RADIUS_RANGE_M = (1.0, 1000.0) # AP/FP 반경 허용 범위
|
|
ROUTE_GRADE_LIMIT_RANGE = (0.0, 0.30) # 오르막/내리막 기울기 한계(비율) 허용 범위(0 초과 30% 이하)
|
|
ROUTE_WEIGHT_MAX = 1000.0 # 가중치 상한(0 이상, 유한)
|
|
|
|
# 종단경사 한계는 하드 제약(통행불가)으로 적용한다.
|
|
# 등급별 기본 한계(비포장 기준). 포장 시 ROUTE_MAX_GRADE_PAVED 로 상향.
|
|
# 임도설치 및 관리 등에 관한 규정은 지선 13%, 간선14%, 작업20% 를기준으로 2배 지정
|
|
FOREST_ROAD_MAX_GRADE = {
|
|
"trunk": 0.26, # 간선임도 (부득이 시 별도 검토)
|
|
"branch": 0.28, # 지선임도
|
|
"work": 0.40, # 작업임도
|
|
}
|
|
ROUTE_MAX_GRADE_PAVED = 0.18 # 포장 시 종단경사 한계 상향
|
|
|
|
FOREST_ROAD_MIN_CURVE_R_M = {
|
|
"trunk": 12.0,
|
|
"branch": 10.0,
|
|
"work": 6.0
|
|
}
|
|
|
|
# --- 2단계 경로 설계: 신규 능선-계곡 정속경사 알고리즘 (ridge_valley) ---
|
|
# 경로 탐색 알고리즘 선택지. "dijkstra"=기존 비용면 Dijkstra, "ridge_valley"=능선-계곡 정속경사.
|
|
ROUTE_ALGORITHMS = ("dijkstra", "ridge_valley")
|
|
|
|
# 임도 종단경사 허용 범위(비율). 지능선-지계곡 사이 세그먼트는 이 범위의 정속경사여야 한다.
|
|
ROUTE_ALT_MIN_GRADE = 0.08
|
|
ROUTE_ALT_MAX_GRADE = 0.14
|
|
# 정속경사 허용오차(비율, ±). 세그먼트 내 각 스텝 경사가 평균경사에서 이 값 이상 벗어나면 탈락.
|
|
ROUTE_ALT_GRADE_TOLERANCE = 0.005
|
|
|
|
# 지형 스켈레톤(능선/계곡) 분류 임계값 — D8 흐름누적 셀 수 기준.
|
|
# "물이 모이는 곳(흐름누적이 큰 곳) = 계곡, 나머지 = 능선" 정의를 따른다.
|
|
# 값은 2m 격자 기준 초기 추정치이며 실제 DTM으로 시각 검증 후 튜닝한다.
|
|
SKELETON_VALLEY_ACC_THRESHOLD_CELLS = 500 # 지계곡 판정 최소 유입 셀수 (500셀 ≈ 0.2ha)
|
|
SKELETON_MAIN_VALLEY_ACC_THRESHOLD_CELLS = 5_000 # 주계곡 판정 (≈ 2ha)
|
|
SKELETON_RIDGE_ACC_THRESHOLD_CELLS = 500 # 지능선 판정 (반전 DEM 누적 기준)
|
|
SKELETON_MAIN_RIDGE_ACC_THRESHOLD_CELLS = 5_000 # 주능선 판정
|
|
|
|
# 스켈레톤 polyline 정점 다운샘플 간격(m). 그래프 노드 수 제어용.
|
|
SKELETON_NODE_SPACING_M = 10.0
|
|
|
|
# --- 3단계 종단·횡단 생성 기본값 ---
|
|
SECTION_STATION_INTERVAL_M = 20.0
|
|
SECTION_CROSS_HALF_WIDTH_M = 15.0
|
|
SECTION_CROSS_SAMPLE_INTERVAL_M = 0.5
|
|
SECTION_LONG_SAMPLE_INTERVAL_M = 1.0
|
|
SECTION_VERTICAL_EXAGGERATION = 1.0
|
|
SECTION_INCLUDE_ENDPOINT = True
|
|
SECTION_MAX_STATION_COUNT = 10_000
|