티스토리 뷰

728x90
반응형

 

지도 모델링 위에 , 위도경도 맴핑할거. 

1. geo - python

import hou
import csv
import os

# =========================================================================
# [설정 1] CSV 파일 경로 (방금 만든 파일 경로로 꼭 확인해주세요!)
file_path = "/Users/l.smin/Downloads/test.csv"

# [설정 2] 제주도 기준값
CENTER_LON = 126.53
CENTER_LAT = 33.50
LON_SCALE = 92700.0   # 경도 1도당 미터
LAT_SCALE = 110900.0  # 위도 1도당 미터

# [설정 3] 유니티 스케일 팩터
UNITY_SCALE = 0.199
# =========================================================================

node = hou.pwd()
geo = node.geometry()
geo.clear() 

# -------------------------------------------------------------------------
# 1. 속성 생성 (새로운 컬럼 place_of_death 추가됨)
# -------------------------------------------------------------------------
geo.addAttrib(hou.attribType.Point, "pscale", 0.0)       # 점 크기(불확실성)
geo.addAttrib(hou.attribType.Point, "curve_u", 0.0)      # 진행률 (0~1)
geo.addAttrib(hou.attribType.Prim, "ID", "")             # 문자열 ID
geo.addAttrib(hou.attribType.Prim, "Name", "")           # 이름
geo.addAttrib(hou.attribType.Prim, "place_of_death", "") # 사망장소 (새로 추가)
geo.addAttrib(hou.attribType.Prim, "Date_of_death", 0)   # 사망날짜 (정수)

# -------------------------------------------------------------------------
# 2. 파일 읽기 및 생성
# -------------------------------------------------------------------------
if not os.path.exists(file_path):
    print("❌ 파일 경로 에러: 파일을 찾을 수 없습니다 -> " + file_path)
else:
    with open(file_path, 'r', encoding='utf-8-sig') as f:
        reader = csv.reader(f)
        header = next(reader, None) # 헤더 건너뛰기

        # [인덱스 매핑] 총 10개 컬럼
        # 0:ID, 1:Name, 2:Start_Lat, 3:Start_Lon, 4:End_Lat, 5:End_Lon
        # 6:Uncertainty_Origin, 7:Uncertainty_Death, 8:place_of_death, 9:Date_of_death
        
        count = 0
        for row in reader:
            # 빈 줄이거나 데이터가 10개 미만이면 건너뜀
            if not row or len(row) < 10: 
                continue

            try:
                # 좌표 파싱
                s_lat = float(row[2])
                s_lon = float(row[3]) 
                e_lat = float(row[4])
                e_lon = float(row[5])
                
                # 끝점이 0,0이면 데이터 없는 것으로 간주하고 패스
                if e_lat == 0.0 and e_lon == 0.0: continue
                
                # 불확실성 데이터 파싱
                uncert_origin = float(row[6]) # 시작점 불확실성
                uncert_death = float(row[7])  # 끝점 불확실성 (pscale로 사용)
                
                # 추가 정보 파싱
                place_val = str(row[8])       # 장소
                date_val = int(row[9])        # 날짜

                # -------------------------------------------------
                # [좌표 변환] 미터 변환 -> 유니티 스케일 적용
                # -------------------------------------------------
                x1 = (s_lon - CENTER_LON) * LON_SCALE * UNITY_SCALE
                z1 = (s_lat - CENTER_LAT) * LAT_SCALE * -1 * UNITY_SCALE 
                
                x2 = (e_lon - CENTER_LON) * LON_SCALE * UNITY_SCALE
                z2 = (e_lat - CENTER_LAT) * LAT_SCALE * -1 * UNITY_SCALE

                # -------------------------------------------------
                # [지오메트리 생성] 선 긋기
                # -------------------------------------------------
                poly = geo.createPolygon()
                poly.setIsClosed(False)

                # 시작점
                pt1 = geo.createPoint()
                pt1.setPosition((x1, 2000 * UNITY_SCALE, z1))      
                pt1.setAttribValue("curve_u", 0.0)   
                pt1.setAttribValue("pscale", uncert_origin * UNITY_SCALE) # 시작점 불확실성 적용
                poly.addVertex(pt1)

                # 도착점
                pt2 = geo.createPoint()
                pt2.setPosition((x2, 2000 * UNITY_SCALE, z2))      
                pt2.setAttribValue("curve_u", 1.0)   
                pt2.setAttribValue("pscale", uncert_death * UNITY_SCALE)  # 끝점 불확실성 적용
                poly.addVertex(pt2)

                # -------------------------------------------------
                # [정보 입력] Primitive Attribute
                # -------------------------------------------------
                poly.setAttribValue("ID", row[0])
                poly.setAttribValue("Name", row[1])
                poly.setAttribValue("place_of_death", place_val)
                poly.setAttribValue("Date_of_death", date_val)
                
                count += 1
                
            except ValueError as e:
                print(f"데이터 변환 오류 발생: {row} / 사유: {e}")
                continue
        
        print(f"✅ 성공: 총 {count}개의 경로를 생성했습니다.")

비율과 모델링. 매칭이 억지스럽다.

 

match size 중심맞추기

ray 모델링에 쏘기. 이게다임

 

샘플csv 파일

P01	동쪽이동	33.5300	126.9000	33.4000	126.8500	10	50	구좌읍	19481115
P02	서쪽피난	33.2000	126.2000	33.3000	126.3000	20	100	대정읍	19481201
728x90
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함
반응형