파이썬 지도 시각화: 후회없는 여행 경로 확인해 보기(feat. folium package)

처음 가보는 곳으로 여행을 계획하다보면 전체적으로 경로를 한번 확인해보고 싶지 않으신가요? 오늘 포스트에서는 파이썬 지도 시각화 기법을 사용해 여행 경로를 시각화하는 방법을 알아보겠습니다. 파이썬의 강력한 folium 라이브러리를 활용하여 이 여정을 단계별로 시각적으로 표시해 보겠습니다.

가정 상황은 다음과 같습니다. JFK 공항에 도착해 택시나 우버를 이용해 Hilton New York Midtown 호텔로 이동한 후, 도보로 Manhattan Center 행사장로 이동합니다. 이번 튜토리얼을 통해, 파이썬 지도 시각화(Python Map Visualization) 기술을 익히고 여행 경로를 지도에 표시하는 방법을 배워보세요.

파이썬 지도 시각화 요약 이해

파이썬 지도 시각화(Python Map Visualization)는 GPS 좌표를 사용해 지도 상에 다양한 데이터를 시각적으로 표현하는 강력한 도구입니다. 특히, folium 라이브러리는 파이썬으로 구글 맵과 같은 지도를 생성할 수 있게 해줍니다.

이번 예시에서는 뉴욕의 세 가지 주요 지점(JFK공항, Hilton New York Midtown 호텔, Manhattan Center 행사장)에 마커를 추가하고, 각 지점을 연결하는 경로를 파란 선으로 표시하며 이동 시간과 거리 정보를 지도에 표시하는 방법을 살펴보겠습니다.

파이썬 코드 단계별 설명

1. 라이브러리 설치 및 불러오기

파이썬에서 지도 시각화를 하기 위해 folium 라이브러리를 설치하고 임포트합니다.

# 필요한 라이브러리 import
import os  # 파일 및 디렉토리 조작을 위한 모듈
import folium  # 지도 생성 및 조작을 위한 라이브러리

# 결과를 저장할 디렉토리 생성
result_dir = 'C:/result/'
# os.makedirs(): 디렉토리 생성. exist_ok=True 옵션으로 이미 존재하는 경우 에러 방지
os.makedirs(result_dir, exist_ok=True)

2. 주요 장소와 거리, 시간 데이터 설정

각 장소의 GPS 좌표를 정의하고, 두 지점 사이의 거리 및 예상 시간을 설정합니다.

# 주요 장소 좌표 설정 (위도, 경도)
simplified_locations = {
    "JFK Airport": [40.6413, -73.7781],
    "Hilton New York Midtown": [40.7625, -73.9780],
    "Event Venue (Manhattan Center)": [40.7527, -73.9932]
}

# 거리(km) 및 시간(분) 정보
simplified_distances_and_times = {
    ("JFK Airport", "Hilton New York Midtown"): (25.0, 35),
    ("Hilton New York Midtown", "Event Venue (Manhattan Center)"): (1.2, 15)
}

# 경로 순서 설정
ordered_locations = [
    ("JFK Airport", "Hilton New York Midtown"),
    ("Hilton New York Midtown", "Event Venue (Manhattan Center)")
]

3. 지도 생성 및 경로 시각화

뉴욕을 중심으로 지도를 생성하고, 각 지점에 번호가 매겨진 마커를 추가하며 경로를 파란 선으로 연결합니다.

# 지도 생성
# folium.Map(): 기본 지도 생성
# location: 지도의 중심점 좌표 [위도, 경도]
# zoom_start: 초기 줌 레벨 (높을수록 더 확대됨)
m = folium.Map(location=[40.7200, -73.9000], zoom_start=11)

# 마커와 경로 추가
# enumerate(): 리스트의 요소와 인덱스를 함께 반환, start=1로 인덱스를 1부터 시작
for idx, location in enumerate(simplified_locations.items(), start=1):
    loc_name, coords = location
    # folium.Marker(): 지도에 마커 추가
    # popup: 마커 클릭 시 표시될 텍스트
    # icon: 마커의 모양 설정
    folium.Marker(
        coords,
        popup=f"{idx}. {loc_name}",
        icon=folium.DivIcon(
            html=f"""
            <div style="text-align: center;">
                <div style="font-size: 12pt; font-weight: bold; color: black; background-color: white; border-radius: 50%; 
                width: 24px; height: 24px; display: flex; align-items: center; justify-content: center;">
                {idx}
                </div>
                <div style="font-size: 10pt; font-weight: bold; color: navy; margin-top: 10px;">
                {loc_name}
                </div>
            </div>"""
        )
    ).add_to(m)

# 경로와 거리/시간 정보 추가
for (loc1, loc2) in ordered_locations:
    # folium.PolyLine(): 두 지점 사이에 선 그리기
    # color: 선의 색상, weight: 선의 두께, opacity: 선의 투명도
    folium.PolyLine([simplified_locations[loc1], simplified_locations[loc2]], color="blue", weight=2.5, opacity=1).add_to(m)

    # 거리와 시간 정보 가져오기
    distance_km, time_min = simplified_distances_and_times[(loc1, loc2)]
    # 두 지점의 중간 좌표 계산
    mid_point = [(simplified_locations[loc1][0] + simplified_locations[loc2][0]) / 2, 
                 (simplified_locations[loc1][1] + simplified_locations[loc2][1]) / 2]
    # 중간 지점에 거리와 시간 정보를 담은 마커 추가
    folium.Marker(
        mid_point,
        icon=folium.DivIcon(
            html=f'<div style="font-size: 10pt; font-weight: bold; color: red;">{distance_km}km, {time_min}분</div>',
        )
    ).add_to(m)

4. 지도 저장

완성된 지도를 로컬 컴퓨터의 C:\result 폴더에 저장하고, 성공적으로 완료가 되면 저장된 지도 html파일이 저장된 경로를 아래와 같이 출력합니다.

# 지도 HTML로 저장
# os.path.join(): 운영 체제에 맞는 경로 구분자를 사용하여 파일 경로 생성
final_corrected_map_path = os.path.join(result_dir, 'ny_business_trip_final_corrected_map_with_distances.html')
m.save(final_corrected_map_path)  # 생성된 지도를 HTML 파일로 저장

print(f"Map saved to: {final_corrected_map_path}")  # 저장된 파일의 경로 출력
파이썬 지도 시각화 코드 실행 결과 표시
( 소스코드 실행결과 터미널 상 메시지 )

이렇게 완성된 지도를 브라우저에서 확인하려면 아래와 같이 해당폴더에서 HTML 파일을 클릭하기만 하면 됩니다. 그러면 아래 그림과 같이 우리가 요구한 것을 확인할 수 있습니다.

파이썬 지도 시각화 소스코드 실행결과물 폴더 사진
( 소스코드 실행결과 폴더에 저장된 html 파일 )
파이썬 지도 시각화 소스코드 실행결과 생성된 지도 사진
( 소스코드 실행결과 생성된 지도 )

4. 자주 묻는 질문 (FAQ)

Q1. Python 지도 시각화에서 folium은 무엇을 하나요?
A1. folium은 파이썬을 이용해 지도 데이터를 시각화할 수 있도록 도와주는 라이브러리입니다. 구글 지도와 같은 방식으로 데이터를 시각적으로 표현할 수 있습니다.

Q2. 좌표는 어떻게 찾을 수 있나요?
A2. 구글 지도를 사용하여 원하는 장소를 검색한 후, 해당장소 표시아이콘 위에서 오른쪽 마우스를 클릭해서 좌표(40.648275456129724, -73.78004682462297)를 선택하면 복사할 수 있습니다.

Q3. 더 복잡한 경로 시각화가 가능한가요?
A3. 네, 가능합니다. 더 많은 장소를 추가하거나 실시간 교통 정보 등을 표시하는 방식으로 확장할 수 있습니다. 이번 포스트의 소스코드를 이용해서 원하는 주문을 AI에게 알려주고 코딩을 해달라고 하면 편리합니다.

Q4. 파이썬 지도 시각화 결과를 이미지로 저장할 수 있나요?
A4. folium은 기본적으로 HTML 파일로 저장되지만, selenium과 같은 도구를 이용해 지도를 이미지로 캡처할 수 있습니다.(이 부분은 별도의 포스트로 다루어 보겠습니다.) 프로그램적이 아닌 단축키(win+shift+s)를 이용해서 HTML로 보여주는 지도를 캡쳐하시면 됩니다.

정리하기

이번 포스트에서는 Python 지도 시각화를 이용해 뉴욕에서의 여행 경로를 시각적으로 표현하는 방법을 배웠습니다. 이 과정을 통해 데이터를 직관적으로 이해할 수 있으며, 복잡한 여행 경로나 물류 이동 경로도 쉽게 시각화할 수 있습니다. 이 포스트를 인공지능 활용 프롬프팅의 내용으로 해서 다른 여행 경로를 시각화하거나, 더 많은 데이터를 추가해 확장된 프로젝트에 도전해보세요!

파이썬 지도 시각화를 포함해서 예산, 일정표 등 전체적인 여행계획을 준비 중이신 분은 이 포스트(2024년 추석을 대비한 ChatGPT 여행계획 쌉가능?(feat. 지도 경로))를 확인하시면 또 다른 인사이트를 얻을 수 있을겁니다.

#전체 통합코드

아래의 코드를 복사해서 VS code와 같은 통합개발환경에 붙혀넣고 실행합니다. 그런데 만약 folium 패키지가 설치되어 있지 않으면 다음과 같은 경고가 발생합니다. 터미널에서 모듈 설치 명령어(pip install folium)로 해당 패키지 설치 후에 아래 통합코드를 실행하시면 됩니다.

파이썬 지도 시각화 패키지 설치시 알람
( folium 패키지 미설치시 발생하는 알람 )
# 필요한 라이브러리 import
import os  # 파일 시스템 조작을 위한 모듈 (디렉토리 생성, 파일 경로 조작 등)
import folium  # 인터랙티브 지도 생성을 위한 라이브러리

# 결과를 저장할 디렉토리 생성
result_dir = 'C:/result/'
# os.makedirs(): 디렉토리 생성. exist_ok=True 옵션으로 이미 존재하는 경우 에러 방지
os.makedirs(result_dir, exist_ok=True)

# 주요 장소 좌표 설정 (위도, 경도)
simplified_locations = {
    "JFK Airport": [40.6413, -73.7781],
    "Hilton New York Midtown": [40.7625, -73.9780],
    "Event Venue (Manhattan Center)": [40.7527, -73.9932]
}

# 거리(km) 및 시간(분) 정보
simplified_distances_and_times = {
    ("JFK Airport", "Hilton New York Midtown"): (25.0, 35),
    ("Hilton New York Midtown", "Event Venue (Manhattan Center)"): (1.2, 15)
}

# 경로 순서 설정
ordered_locations = [
    ("JFK Airport", "Hilton New York Midtown"),
    ("Hilton New York Midtown", "Event Venue (Manhattan Center)")
]

# 지도 생성
# folium.Map(): 기본 지도 생성
# location: 지도의 중심점 좌표 [위도, 경도]
# zoom_start: 초기 줌 레벨 (높을수록 더 확대됨)
m = folium.Map(location=[40.7200, -73.9000], zoom_start=11)

# 마커와 경로 추가
# enumerate(): 리스트의 요소와 인덱스를 함께 반환, start=1로 인덱스를 1부터 시작
for idx, location in enumerate(simplified_locations.items(), start=1):
    loc_name, coords = location
    # folium.Marker(): 지도에 마커 추가
    # popup: 마커 클릭 시 표시될 텍스트
    # icon: 마커의 모양 설정
    folium.Marker(
        coords,
        popup=f"{idx}. {loc_name}",
        icon=folium.DivIcon(
            html=f"""
            <div style="text-align: center;">
                <div style="font-size: 12pt; font-weight: bold; color: black; background-color: white; border-radius: 50%; 
                width: 24px; height: 24px; display: flex; align-items: center; justify-content: center;">
                {idx}
                </div>
                <div style="font-size: 10pt; font-weight: bold; color: navy; margin-top: 10px;">
                {loc_name}
                </div>
            </div>"""
        )
    ).add_to(m)

# 경로와 거리/시간 정보 추가
for (loc1, loc2) in ordered_locations:
    # folium.PolyLine(): 두 지점 사이에 선 그리기
    # color: 선의 색상, weight: 선의 두께, opacity: 선의 투명도
    folium.PolyLine([simplified_locations[loc1], simplified_locations[loc2]], color="blue", weight=2.5, opacity=1).add_to(m)

    # 거리와 시간 정보 가져오기
    distance_km, time_min = simplified_distances_and_times[(loc1, loc2)]
    # 두 지점의 중간 좌표 계산
    mid_point = [(simplified_locations[loc1][0] + simplified_locations[loc2][0]) / 2, 
                 (simplified_locations[loc1][1] + simplified_locations[loc2][1]) / 2]
    # 중간 지점에 거리와 시간 정보를 담은 마커 추가
    folium.Marker(
        mid_point,
        icon=folium.DivIcon(
            html=f'<div style="font-size: 10pt; font-weight: bold; color: red;">{distance_km}km, {time_min}분</div>',
        )
    ).add_to(m)

# 지도 HTML로 저장
# os.path.join(): 운영 체제에 맞는 경로 구분자를 사용하여 파일 경로 생성
final_corrected_map_path = os.path.join(result_dir, 'ny_business_trip_final_corrected_map_with_distances.html')
m.save(final_corrected_map_path)  # 생성된 지도를 HTML 파일로 저장

print(f"Map saved to: {final_corrected_map_path}")  # 저장된 파일의 경로 출력

Similar Posts