몇개월 전에 재미로 해본건데,,
까먹고 있다가 지금 올리는 글
(벨로그 주인이 워낙에 이상한 걸 많이 합니다)
우선 이 프로젝트는 아래 사이트의 발견으로부터 시작되었다. . .
shadowmap : 유저가 입력한 날짜와 시각에 따라 건물 그림자를 지도 위에 실시간으로 보여주는 사이트
2025.12.18. AM 09:30 충남대 정문

2025.12.18. PM 16:20 충남대 정문

2025.12.18. PM 15:00 카이스트
고도 정보 없는 평면 맵 위에다가 건물 오브젝트랑 그림자 렌더링한 것 같긴 한데
(맵은 OSM 기반이라고 함)
GIS 공부도 할겸 한번 구현해 보기로 함.
그림자는 생각보다 단순하게 삼각함수로 구현할 수 있음.

Altitude = 태양의 고도각 (태양의 높이 각도)
Azimuth = 태양의 방위각 (태양의 방향 각도)
((고도각이 90도면 태양이 바로 머리 위에 있다는 것
따라서
그림자 길이 = 건물 높이/tan(태양의 고도각)
((고도가 낮을수록 그림자가 길어지고, 12시가 그림자가 가장 짧은 시간
그림자 방향 = 태양의 방위각 반대방향
OSM 기반 베이스맵에다가 2d 건물 footprint 올리고, 거기에 위 방식으로 계산된 그림자를 투영하면 되지 않을까..? 라는 생각을 기저에다 두고 일단 냅다 실행해본다!
일단 그러면, 2d 건물 footprint와 높이 정보를 구해야 하는데,
이건 브이월드에서 잘하니깐.. 이걸 쓰기로 함.
https://www.vworld.kr/v4po_main.do
근데 보니깐 GIS건물통합WMS조회와 GIS건물통합WFS조회가 있는데,
https://velog.io/@kyeong1750/WMSWFS-%EB%AC%B4%EC%97%87%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C 참고
WMS는 이미지고, WFS는 벡터라고 함.
나는 개별 폴리곤 데이터가 필요하기 때문에 WFS로 함.
*API 도메인 = localhost로 하고 느긋하게 기다리면 됨.

일단 지정 좌표 영역 내 아무 건물 1개 잡아서 edge 추출 해봤는데,
아니 무슨 건물 엣지가 16개나 나오나? 싶었는데,

생각보다 이런 다다다다다각형 건물이 많은 듯
완전히 사각형인 건물 찾기가 더 어려움.
태양 위치 계산에는 Astral 을 사용했다.
위도/경도/날짜/시간 -> 방위각/고도각을 출력하는 로직을 구현했고,

2025.12.19. PM 15:17 대전의 방위각/고도각

2025.12.19. PM 15:17 서울의 방위각/고도각 (Astral에서는 표준시 사용)
결과가 어느정도 일치하게 나오는 걸 확인할 수 있음.

근데 이렇게 나무에 둘러싸여져서 온통 그림자가 되어버린 울 연구소 발견..
이제 보니 shadowmap에서는 건물만 다루는게 아니라 나무도 있었다.
근데 녹지라고 다 나무는 아닌걸 보면,,
녹지 중에서도 DSM에서 일정 고도 이상이면 나무로 간주하고 나무 에셋을 놓는건가??
내가 구현한 로직은 오직 건물만 보기 때문에 나무 영향은 무시하는 걸로 하겠음.
근데 여기서 고도데이터까지 추가 정합하면 경사를 고려한 더 정밀한 그림자 계산이 가능할 듯함.
((추가로 기존 평면 맵에 DEM까지 같이 시각화해도 좋지 않을까?
이제 그림자 면적 계산을 구현해봤는데,

2025.12.19. PM 15:17 대전의 방위각/고도각
왜이렇게 크지..
수치로 나오니깐 상상이 잘안되긴한데 좀 많이 큰 수치인건 분명하다
시각화를 해봅시다.
시각화는 Folium 사용함.

일단 folium의 2d map이랑 vworld WFS footprint가 살짝 안맞는거 보니, 호환성이 좀 떨어지나..

문제 원인은 좌표계 변환을 까먹었따. 해야지해야지 해놓고선..
이게 왜 중요하냐면,
4326에서 사용하는 단위는 degree인데,
그림자 길이는 h/tan(고도각)이 미터 단위로 나오는데
이걸 그대로 더해버려서 그림자가 무한대처럼 생성됨. (1도가 대략 111000m...)
그래서 공간정보 할 땐 미터 단위 계산할 땐 UTM으로 변환이 필요함. (여기선 5179 사용)

이제 됐다!
근데 오른쪽 건물이 살짝 안맞아서 너무 불편함.. folium은 OSM 기반이라 3857이네..
찾아보니까

4326 vs 3857 차이라고 함.
이정도 왜곡은 포기해야겠다 배포할 것도 아니니깐 뭐

좀 더 넓은 영역으로 시각화 해본 결과.
아그리고 그늘길에서 언급했던 그냥 footprint로 했을때랑 footprint의 외곽 면으로 계산할때 차이도 언급해야함.
근데 footprint로 시각화를 하니깐 되게 허접해보여서,,
3d로 바꿔볼까 고민하다가
3d로 바꾼다한들 2d map 위에 올리면 거기서거기 아닌가 싶은 와중에
옛날에 써봤던 cesium이 생각남!
로컬에서 실행했을 때 실패했었던 기억이 있어서
세슘 서버에 내가 만든 폴리곤을 json으로 업로드해두고,
로컬로 시각화 하기로 함.




흠. . .