How to Visualize Cherry Blossom Paths in Tableau
( 🌸 서울 벚꽃길 Tableau 지도 시각화 가이드)
오늘은 앞에서 살펴본 지도에 선 그리는 방법에 대해서 정리해 보려고 합니다.
약간에 coding이 있어야 해서 그 부분도 간략하게 설명 드리겠습니다.
Prepare Cherry Blossom Spot Data (데이터 수집)
서울의 주요 벚꽃 명소 10곳의 좌표 데이터를 수집합니다.
알고있는 명소명을 작성하고 GPT를 이용해 대략적인 위도, 경도를 뽑아내도록 합니다.
번호 | 명소명 | 위도 (Latitude) | 경도 (Longitude) |
1 | 여의도 윤중로 | 37.5281 | 126.9185 |
2 | 석촌호수 | 37.5117 | 127.1006 |
3 | 서울숲 | 37.5443 | 127.0377 |
4 | 남산공원 | 37.5512 | 126.9882 |
5 | 경의선 숲길 | 37.5561 | 126.9236 |
6 | 창경궁 | 37.5786 | 126.995 |
7 | 어린이대공원 | 37.548 | 127.0745 |
8 | 낙산공원 | 37.5793 | 127.007 |
9 | 도산공원 | 37.5215 | 127.023 |
10 | 뚝섬 한강공원 | 37.531 | 127.0664 |
저는 10개 정도만 해봤습니다. 사실 전국에 너무 많은 지역이 있죠. 서울 만해도 너무 많은 곳이 있어서 sample로 정리해 보았습니다.
Draw Blossom Trail on My Maps (산책로 데이터 수집)
Google My Maps에서 산책로 경로를 그리고 KMZ로 내보냅니다.
산책로 경로를 그리기 위해서는 google mymaps (https://www.google.com/mymaps)를 활용했습니다.

제목없는 레이어가 하나 있게 됩니다. 레이어 이름은 우선 넣어주세요.

위 순서와 같이 line을 선택하면 아래와 같은 모양이 나오게 됩니다.

지도에서 원하는 위치에 선을 그립니다.
선을 끝내고 싶을 때는 마지막 누른 위치에 동일한 위치를 한 번 더 누르면 됩니다.
그러면 종료되면서 아래 그림과 같이 레이어에 선 13과 같이 선 이름이 생기고 지도에는 선에 풍선이 생기게 됩니다. (이름을 넣으시면 됩니다.)

이렇게 모든 산택로에 경로를 입력하게 됩니다.
Extract Coordinates (KMZ 파일에서 위도/경도 추출)
Python을 사용해 위도/경도 좌표를 추출하고 정제합니다.
모든 산책로를 다 그렸다면 레이어에서 3개의 점으로 표시된 option을 누르고 데이터 내보내기를 합니다.
KML/KMZ 파일과 CSV 파일이 있는데요. CSV 파일은 계속 한글이 깨는 문제가 있습니다.
저는 KMZ 파일로 다운 받았습니다.

다운 받은 파일을 아래와 같이 위도, 경도 추출을 위한 code를 작성합니다. (GPT 이용하셔도 쉽게 변환해 줍니다.)
GPT에 넣고 변환해 달라고 하시면 됩니다.
import zipfile
import os
import pandas as pd
from xml.etree import ElementTree as ET
# ---------- 1. KMZ → KML 추출 ----------
kmz_path = "벚꽃길.kmz" # 업로드된 KMZ 파일 경로
extract_dir = "kmz_extracted"
os.makedirs(extract_dir, exist_ok=True)
with zipfile.ZipFile(kmz_path, 'r') as zip_ref:
zip_ref.extractall(extract_dir)
# KML 파일 찾기
kml_files = [f for f in os.listdir(extract_dir) if f.endswith('.kml')]
kml_path = os.path.join(extract_dir, kml_files[0])
# ---------- 2. KML → 좌표 추출 ----------
tree = ET.parse(kml_path)
root = tree.getroot()
ns = {"kml": "http://www.opengis.net/kml/2.2"}
placemarks = root.findall(".//kml:Placemark", ns)
extracted_data = []
for pm in placemarks:
name_elem = pm.find("kml:name", ns)
coords_elem = pm.find(".//kml:coordinates", ns)
if coords_elem is not None:
coords_text = coords_elem.text.strip()
for line in coords_text.strip().split():
lon, lat, *_ = line.split(",")
extracted_data.append({
"이름": name_elem.text if name_elem is not None else "",
"위도": float(lat),
"경도": float(lon)
})
df_kmz = pd.DataFrame(extracted_data)
# ---------- 3. 좌표 → 벚꽃길 라인 데이터 가공 ----------
df_kmz["명소명"] = df_kmz["이름"].str.replace("벚꽃길", "", regex=False).str.strip()
df_kmz["타입"] = df_kmz["명소명"] + " 산책로"
df_kmz["도로명"] = df_kmz["이름"]
df_kmz["번호"] = None
df_kmz["지점명"] = df_kmz["이름"]
df_kmz["Path Order"] = range(1, len(df_kmz) + 1)
df_path = df_kmz[[
"번호", "명소명", "위도", "경도", "타입", "도로명", "지점명", "Path Order"
]].rename(columns={
"위도": "위도 (Latitude)",
"경도": "경도 (Longitude)"
})
기존 명소와 경로를 합쳐서 하나의 data 파일로 만들었습니다.
번호 | 명소명 | 위도 | 경도 | 타입 | 도로명 | 지점명 | Path Order |
1 | 여의도 윤중로 | 37.5281 | 126.9185 | 명소 | |||
2 | 석촌호수 | 37.5117 | 127.1006 | 명소 | |||
3 | 서울숲 | 37.5443 | 127.0377 | 명소 | |||
4 | 남산공원 | 37.5512 | 126.9882 | 명소 | |||
5 | 경의선 숲길 | 37.5561 | 126.9236 | 명소 | |||
6 | 창경궁 | 37.5786 | 126.995 | 명소 | |||
7 | 어린이대공원 | 37.548 | 127.0745 | 명소 | |||
8 | 낙산공원 | 37.5793 | 127.007 | 명소 | |||
9 | 도산공원 | 37.5215 | 127.023 | 명소 | |||
10 | 뚝섬 한강공원 | 37.531 | 127.0664 | 명소 | |||
서울숲 | 37.5443466 | 127.033943 | 서울숲 산책로 | 서울숲 벚꽃길 | 서울숲 벚꽃길 | 1 | |
서울숲 | 37.5422284 | 127.0355953 | 서울숲 산책로 | 서울숲 벚꽃길 | 서울숲 벚꽃길 | 2 | |
서울숲 | 37.5412246 | 127.0380736 | 서울숲 산책로 | 서울숲 벚꽃길 | 서울숲 벚꽃길 | 3 | |
서울숲 | 37.541216 | 127.0404662 | 서울숲 산책로 | 서울숲 벚꽃길 | 서울숲 벚꽃길 | 4 | |
창경궁 | 37.5788627 | 126.9960884 | 창경궁 산책로 | 창경궁 벚꽃길 | 창경궁 벚꽃길 | 5 | |
창경궁 | 37.5788542 | 126.9959382 | 창경궁 산책로 | 창경궁 벚꽃길 | 창경궁 벚꽃길 | 6 | |
창경궁 | 37.5791858 | 126.9956271 | 창경궁 산책로 | 창경궁 벚꽃길 | 창경궁 벚꽃길 | 7 | |
창경궁 | 37.5793984 | 126.9940821 | 창경궁 산책로 | 창경궁 벚꽃길 | 창경궁 벚꽃길 | 8 | |
창경궁 | 37.5795599 | 126.9928268 | 창경궁 산책로 | 창경궁 벚꽃길 | 창경궁 벚꽃길 | 9 | |
창경궁 | 37.5800106 | 126.9941036 | 창경궁 산책로 | 창경궁 벚꽃길 | 창경궁 벚꽃길 | 10 | |
창경궁 | 37.5817791 | 126.9954983 | 창경궁 산책로 | 창경궁 벚꽃길 | 창경궁 벚꽃길 | 11 |
위와 같이 전처리하게 됩니다.
Visualize in Tableau
벚꽃 명소는 포인트로, 산책로는 선(Line)으로 시각화하기
1. 위도, 경도를 열과 행에 배치.
2. 마크에서 라인을 선택.
3. 도로명을 세부정보에 연결.
4. paht order를 경로에 추가.
5. Text에 도로명을 연결.

이렇게 하면 간단한 위치 표시를 통한 지도에 이동경로를 표시할 수 있습니다.
🌸 서울 벚꽃길 찾아보기
🌸 서울 벚꽃길 찾아보기 Tableau public을 활용해서 벚꽃길 대시보드를 만들어봤는데요.Tableau에서 지도를 한번 확대하거나 움직이게 되면 다음 filter나 parameter 동작을 수행했을 때 지도가 다시
infogalaxy.co.kr
'Tableau' 카테고리의 다른 글
🌸 서울 벚꽃길 찾아보기 (0) | 2025.03.31 |
---|---|
Iron Viz 2025 - The Bears of Brooks River (2) | 2025.03.24 |
Iron Viz 2025 : Jimmy Buffett's Margaritaville 분석 (1) | 2025.03.15 |
Iron Viz 2025: "Hit Machines" 분석 (0) | 2025.02.28 |
Iron Viz "Boom of Latin Music" 대시보드 분석 (1) | 2025.02.26 |
Boston Marathon Entry 분석 및 스토리라인 해석 (0) | 2025.02.16 |
From Screen to Scene 분석 및 스토리라인 해석 (0) | 2025.02.12 |
Shark Tank Tableau Dashboard - 스토리라인 분석 (0) | 2025.02.12 |