Skip to content
KINN-CHPublic

About

Finding the Best Direction for Shadows 그림자 최적 길찾기

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

3 Commits

Folders and files

Repository files navigation

CoolWay — 그림자 최적 길찾기

Finding the Best Direction for Shadows

여름날 같은 목적지로 가는 여러 갈래 길 중에서 그늘이 가장 많이 지는 길을 골라 주는 보행 경로 추천 프로그램입니다. 출발지와 도착지를 넣으면 도보 경로 후보 10개를 만들고, 그 시각의 태양 위치로 주변 건물의 그림자를 계산한 뒤, 그림자에 가장 많이 덮이는 경로를 지도에 그려 보여줍니다.

최단 거리가 아니라 햇볕에 덜 노출되는 것을 기준으로 삼는 것이 이 프로젝트의 핵심입니다.

동작 방식

출발지·도착지 입력 (장소명 또는 위경도)
  → 지오코딩            : Nominatim (장소명 → 위경도)
  → 도보 경로 후보 10개 : OSMnx 보행 네트워크 + networkx 최단경로
  → 건물 폴리곤 수집    : OSM (경로 주변 반경만)
  → 태양 위치 계산      : pvlib (현재 시각, Asia/Seoul 기준 고도·방위각)
  → 그림자 폴리곤 투영  : 건물 외곽선을 그림자 방향으로 밀어 쐐기형 폴리곤 생성
  → 경로별 그림자 비율  : 경로 선분과 그림자 영역의 교집합 길이 / 전체 길이
  → 최고 비율 경로 선택 → folium 지도로 시각화

그림자를 계산하는 방법

건물 높이와 태양 고도로 그림자 길이를 구합니다.

그림자 길이 = 건물 높이 / tan(태양 고도)
그림자 방향 = 태양 방위각의 반대쪽

건물 외곽선의 모든 꼭짓점을 이 방향·거리만큼 평행 이동시킨 뒤, 원래 외곽선과 이동한 외곽선을 이어 붙여 건물에서 그림자 끝까지 이어지는 쐐기 모양 폴리곤을 만듭니다. 이 과정은 미터 단위 계산이 필요하므로 위경도(EPSG:4326)를 UTM 52N(EPSG:32652) 으로 변환해 수행하고, 결과를 다시 위경도로 되돌립니다.

태양 고도가 0도 이하(해가 진 뒤)면 그림자를 만들지 않습니다.

경로 후보를 고르는 방법

networkx.shortest_simple_paths로 짧은 순서대로 경로 10개를 뽑습니다. 즉 후보는 모두 현실적으로 걸을 만한 길이고, 그중에서 그림자 비율이 가장 높은 것을 고릅니다. 그늘을 찾아 한없이 돌아가는 경로가 나오지 않도록 하는 장치입니다.

실행

웹으로 실행

pip install flask osmnx networkx geopandas shapely pyproj pvlib folium geopy pandas pytz
python app.py

브라우저에서 http://127.0.0.1:5000 을 열고 출발지·도착지를 입력하면, 분석이 끝난 뒤 결과 지도가 iframe으로 표시됩니다.

터미널로 실행

python -m coolway.main

출발지와 도착지를 차례로 묻고, 경로별 그림자 비율을 출력한 뒤 result_map.html을 만들어 브라우저로 자동으로 엽니다.

=== CoolWay1.3 - 그림자 경로 추천 ===
출발지(예: 부산 하단역 or 35.106217, 128.9667238): 부산 하단역
도착지(예: 동아대학교 승학캠퍼스 or 35.113752, 128.965672): 동아대학교 승학캠퍼스
[CoolWay] 최단경로 후보 10개 생성 중...
[CoolWay] OSM 건물 데이터 다운로드 중...
[CoolWay] 태양 위치 계산 중...
태양 고도: 61.34°, 방위각: 213.27°
[CoolWay] 그림자 영역 계산 중...
경로 1 - 그림자 비율: 24.1%
...

입력은 장소명과 위경도를 모두 받습니다. 35.1062, 128.9667처럼 숫자 두 개로 보이면 좌표로, 아니면 장소명으로 판단해 Nominatim에 지오코딩을 요청합니다.

결과 지도

folium으로 그린 HTML 지도입니다.

색 의미
회색 건물
파란색 그림자 영역
빨간 선 추천 경로
초록 마커 출발지
빨간 마커 도착지

우측 상단 레이어 컨트롤로 건물·그림자 레이어를 켜고 끌 수 있습니다. 샘플 결과가 result_map.html에 들어 있어 실행 없이도 확인할 수 있습니다.

모듈 구성

파일 역할
app.py Flask 웹 서버 (/ 입력 폼, /result 결과 지도)
coolway/runner.py 전체 파이프라인 오케스트레이션 (main, run_from_web)
coolway/input_handler.py 입력이 좌표인지 장소명인지 판별
coolway/utils.py 지오코딩, WGS84 ↔ UTM 변환, 진행 상황 출력
coolway/osmnx_route.py 보행 네트워크 로드 및 최단경로 후보 k개 생성
coolway/osm_buildings.py OSM 건물 폴리곤 수집
coolway/sun_position.py pvlib 기반 태양 고도·방위각 계산
coolway/shadow_calc.py 건물 → 그림자 폴리곤 투영
coolway/shadow_analysis.py 경로와 그림자의 겹침 길이·비율 계산
coolway/visualization.py folium 지도 렌더링
coolway/config.py 전역 설정 (기본 건물 높이 등)
cache/ OSMnx가 받아 둔 OSM 응답 캐시

설정

coolway/config.py

값 기본값 설명
DEFAULT_BUILDING_HEIGHT 20 모든 건물에 적용하는 높이(m)

coolway/runner.py

값 기본값 설명
dist 10000 출발지 기준으로 불러올 보행 네트워크 반경(m)
k 10 생성할 경로 후보 수
buffer_dist 0.001 경로 주변에서 건물을 찾을 버퍼 폭(도 단위, 약 100m)

알려진 한계

  • 건물 높이가 일률적으로 20m입니다. OSM의 building:levels/height 태그가 있어도 쓰지 않고 모두 같은 값으로 둡니다. 저층 상가와 고층 아파트의 그림자가 같게 계산됩니다. 건물별 실제 높이를 반영하는 것이 정확도를 가장 크게 끌어올릴 개선점입니다.
  • 그림자 비율은 위경도(도) 단위 길이로 계산합니다. 비율 자체는 유효하지만 출력되는 길이 값은 미터가 아닙니다. 미터로 보려면 경로도 UTM으로 변환한 뒤 재야 합니다.
  • 가로수, 육교, 지하도, 처마 같은 건물 외 그늘은 반영하지 않습니다.
  • 분석 시각은 실행 시점의 현재 시각으로 고정입니다. 출발 예정 시각을 지정하는 기능은 아직 없습니다.
  • 경로 후보 10개를 shortest_simple_paths로 뽑고 반경 10km 네트워크를 불러오기 때문에, 거리가 먼 구간은 분석에 수십 초 이상 걸릴 수 있습니다.

사용한 데이터·라이브러리

  • OpenStreetMap — 보행 네트워크와 건물 폴리곤 (ODbL)
  • OSMnx / NetworkX — 네트워크 구성 및 경로 탐색
  • pvlib — 태양 위치
  • Shapely / GeoPandas / pyproj — 기하 연산 및 좌표계 변환
  • Nominatim (geopy) — 장소명 지오코딩
  • folium — 지도 시각화

About

Finding the Best Direction for Shadows 그림자 최적 길찾기

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages