# 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