상세 컨텐츠

본문 제목

[파이썬 업무자동화] 여섯번째. 지도 불러오기, 데이터를 이용한 지도 시각화, 지도를 이미지로 변환

파이썬

by 무딩 2025. 6. 2. 18:09

본문

728x90
반응형
SMALL

파이썬으로 지도 시각화 하기

folium라이브러리
import folium

지도를 시각화하는 기능을 제공하는 라이브러리로 매출 데이터, 고객 분포, 물류 경로 등 지리적 데이터 분석을 할때 유용하다.

※ 모듈이 설치되지 않았다면 아래 코드를 입력 후 사용

pip install folium

Map( ) 클래스
Map(location, zoom_start)

지도를 생성하는 클래스로 마커, 경로, 히트 맵 등 시각화 요소를 추가할 수 있다.

location : 지도의 위도, 경도를 리스트 또는 튜플 형태로 전달 받음

zoom_start : 위치 확대 수준을 전달 받음 / 값이 클수로 구체적으로 표현(1~18, 기본갑 : 10)

지도 부르기

Gyeongbokgung_map = folium.Map(location = [37.579702, 126.977442], zoom_start = 16)
display(Gyeongbokgung_map)


Marker()클래스
Marker(location, popup, tooltip, icon)

지도 위에 특정 위치의 마커를 나타내는 클래스로 좌표에 핀을 꽂는 등의 시각적 요소로 위치를 강조할 때 유용 하다.

Marker 객체를 add_to()메서드로 Map에 추가해야 마커가 지도에 표시된다.

location : 위치의 좌표를 리스트 또는 튜플 형태로 전달 받는다.

popup : 마커를 클릭했을 때 표시 할 팝업 창의 내용을 전달 받는다.

tooltip : 마커 위 마우스를 올렸을 때 표시할 문자열을 전달 받는다.

icon : 마커에 사용할 아이콘을 전달 받는다.

지도 위 마커하기

Gyeongbokgung_map = folium.Map(location = [37.579702, 126.977442], zoom_start = 16)

folium.Marker([37.579702, 126.977442], tooltip = "경복궁").add_to(Gyeongbokgung_map)
display(Gyeongbokgung_map)

지도 위 마커 아이콘 변경하기


Gyeongbokgung_map = folium.Map(location = [37.579702, 126.977442], zoom_start = 16)

folium.Marker([37.579702, 126.977442], tooltip = "경복궁", icon = folium.Icon(color="red", icon = "star")).add_to(Gyeongbokgung_map)

display(Gyeongbokgung_map)


CircleMarker( )클래스
CircleMarker(location, radius, fill, fill_color, fill_opacity, weight)

지도 위 특정 위치를 원형 마커를 나타내는 클래스이다.

location : 원형마커가 위치할 좌표를 리스트 또는 튜플로 전달 받는다.

radius : 원형마커의 반지름

fill :  원형마커 내부 채우기 여부를 불리언으로 전달 받는다.

fill_color : 원형마커 내부 색상

fill_opacity : 원형 마커 내부 투명도 0(투명) ~ 1(불투명) 으로 실수로 전달 받는다.

weight : 원형마커 테두리 두께를 픽셀 단위로 전달 받는다.

Gyeongbokgung_map = folium.Map(location = [37.579702, 126.977442], zoom_start = 16)

folium.CircleMarker([37.579702,126.977442],radius=20).add_to(Gyeongbokgung_map)
display(Gyeongbokgung_map)

원형마커 색상 변경 밑 투명도 변경

Gyeongbokgung_map = folium.Map(location = [37.579702, 126.977442], zoom_start = 16)

folium.CircleMarker([37.579702, 126.977442],radius=20,fill=True, fill_color = "red", fill_opacity = 0.5, weight = 0).add_to(Gyeongbokgung_map)

display(Gyeongbokgung_map)


Circle()클래스

지도 위 특정 위치의 원형을 나타내는 클래스로 CircleMarker와 비슷하지만 반경 설정에서 차이가 있다.

Circle()은 지도를 확대,축소 시 원형이 지도에 비례해서 변경된다.


Gyeongbokgung_map = folium.Map(location = [37.579702, 126.977442], zoom_start = 16)

folium.Circle(location=[37.579702, 126.977442], radius=200, color="red", fill = True, fill_color = "cyan").add_to(Gyeongbokgung_map)

display(Gyeongbokgung_map)


folium 모듈 플러그인 HeatMap 모듈
import folium from folium.plugins import heatmap

히트맵을 그릴 수 있게 해주는 모듈

HeatMap(data, radius)

표시할 점의 위치를 중첩리스트 형태로 전달 받음

radius : 각 데이터가 영향을 미치는 반경을 지정하는 매개변수로 기본값은 25, 픽셀단위로 원형영역의 반지름을 나타낸다.

from folium.plugins import HeatMap

map_us = folium.Map(location=[39.5902, -95.7129],zoom_start=5)
HeatMap(sales_df[["Latitude", "Longitude"]],radius=25).add_to(map_us)

display(map_us)


folium모듈 플러그인 MarkerCluster 모듈
import folium from folium.plugins import MarkerCluster

가까운 마커들을 군집으로 묶어 시각화 할 수 있게 해주는 모듈

from folium.plugins import MarkerCluster

map_us = folium.Map(location=[39.5902, -95.7129], zoom_start=5)   # 미국 지도 생성


marker_cluster = MarkerCluster().add_to(map_us)   # 미국 지도에 마커 추가

for idx, row in sales_df.iterrows():   # 마커 클러스터 객체에 마커 추가하기
    folium.Marker(location=[row["Latitude"], row["Longitude"]], tooltip=row["Address"], add_to(marker_cluster)

display(map_us)


Selenium라이브러리

설치가 안되어있을 경우 아래 코드를 입력하여 설치

pip install selenium

브라우저를 자동으로 조작하여 크롤링할때 유용한 라이브러리로 반복적 웹 작업을 자동화 할 때 사용된다.

  • chrome 웹 드라이버를 사용하기 위해 모듈 불러오기
  • wedbrive : 웹 브라우저를 제어하는 패키지
  • options : 웹 브라우저의 옵션을 제공하는 모듈
selenium라이브러리 실행

from selenium.webdriver.chrome.options import Options
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

resolution_tup = (1000,616)    #해상도 설정
chrome_options = Options()

#add.argument : Options 객체 옵션 리스트에 옵션을 추가하는 메서드
# "--"는 명령줄에서 플래그 또는 옵션 설정을 나타내는 표기법
#headless : 화면에 브라우저를 띄우지 않고 백그라운드에서 실행하는 옵션
#window-size : 브라우저 창 크기(해상도)를 설정하는 옵션
chrome_options.add_argument("--headless")
chrome_options.add_argument(f"--window-size={resolution_tup[0]},{resolution_tup[1]}")

driver = webdriver.Chrome(chrome_options)

 

지도를 이미지로 변환

#이미지로 변환 할 지도 생성
import pandas as pd
import folium

sales_df = pd.read_csv("./data/slaes_Compound_details.csv", encoding="utf-8-sig")
map_usa = folium.Map(location=[39.5902, -95.7129], zoom_start=5)

for idx, row in sales_df.iterrows():
    folium.CircleMarker(location=[row["Latitude"], row["Longitude"]], radius=5, fill=True, fill_color="red",        fill_opacity=0.5, weight=0, tooltip=row["Address"]).add_to(map_usa)

#해당 지도를 이미지로 변환 작업
from PIL import Image
import io
import os

#_to_png()는 Map객체를 PNG형식으로 변환해주는 메서드
img_data = map_usa._to_png(driver=driver)

#io모듈의 BytesIO클래스는 전달받은 바이트 데이터를 파일 객체로 변환해주는 클래스
#open()을 이용해 이미지로 변환해 반환
img = Image.open(io.BytesIO(img_data))

result_dir = "./data/folium"  # 이미지를 저장할 폴더 경로
img.save(os.path.join(result_dir, f"scatter_plot.png"))
img

이 글은 제가 공부하면서 개념정리 겸 작성하는 글입니다.

틀린점이 있을 수도 있습니다.

728x90
반응형
LIST

관련글 더보기