머신러닝과 직접적 관계는 없지만 데이터 분석 시 지도 정보를 이용하는 경우가 있습니다. 

folium은 Python에서 대화형 지도를 생성하고, 시각화 하기 위한 라이브러리 입니다.

이 라이브러리는 Leatflet.js를 기반으로 동작하고, 지도위에 마커, 원, 폴리곤, 히트뱁등 다양한 데이터를 시각화 할 수 있습니다.

지도 데이터를 EDA할때 folium을 사용하면, 직관적으로 이해하기 좋습니다.

 

1. folium설치

pip install folium

 

2. 지도생성

초기 위치(location)와 확대 정도(zoom_start)를 설정하여 지도를 표시합니다.

import folium

# 기본 지도 생성 (중심 좌표: 위도 37.5665, 경도 126.9780)
m = folium.Map(location=[37.5665, 126.9780], zoom_start=12)

# 지도 출력
m

 

3. 마커

folium.Marker는 지도위에 마커를 추가하는 기능을 수행합니다.

각 마커에 팝업, 툴팁, 아이콘, 색상등을 추가할 수 있습니다.

 

location 마커 위치 (위도, 경도)
popup 클릭 시 팝업(option)

popup="서울특별시"
popup=folium.Popup("서울 시청", max_width=200)
tooltip 마우스 오버 툴팁(option)

tooltip="광화문"
icon 아이콘 (option)

  • folium.Icon()을 사용하여 아이콘 스타일을 변경 가능
  • icon="cloud" → 아이콘 스타일 지정 가능 예) "info-sign", "cloud", "home"
  • icon_color="white" → 아이콘 색상 변경 가능
  • color="blue" → 마커 색상 변경 가능

    예) icon=folium.Icon(icon="cloud", color="blue", icon_color="white")
draggable 마커 이동 가능 여부(defalut: False)
import folium

stations = [
    {"cell": "CellA", "lat": 37.5665, "long": 126.9780, "azimuth": 45, "radius": 500},
    {"cell": "CellB", "lat": 37.5651, "long": 126.9895, "azimuth": 150, "radius": 400},
    {"cell": "CellC", "lat": 37.5700, "long": 126.9768, "azimuth": 270, "radius": 300},
]

# 지도 생성
m = folium.Map(location=[37.5665, 126.9780], zoom_start=14)

# 마커 추가
for station in stations:
    lat, lon = station["lat"], station["long"]
    azimuth, radius = station["azimuth"], station["radius"]
    
    # 팝업 정보
    popup_text = f"Cell: {station['cell']}<br>Azimuth: {azimuth}°<br>Radius: {radius}m"
    
    # 마커 추가
    folium.Marker(
        location=[lat, lon],
        popup=popup_text,
        tooltip="기지국 정보",
        icon=folium.Icon(icon="info-sign", color="red")
    ).add_to(m)

# 지도 출력
m

 

4. 원 그리기

folium.Circle는 지도에 반지름을 가진 원을 추가하는 기능을 수행합니다.

위도(lat)과 경도(long)좌표를 중심으로 반지름(radius)으로 원을 그립니다.

파라미터 설명 예제 값
location 원의 중심 좌표 (위도, 경도) [37.5665, 126.9780]
radius 원의 반경 (m), 반지름 500
color 테두리 색상 "blue"
weight 테두리 두께 (픽셀) 2
opacity 테두리 투명도 (0~1) 0.5
fill 내부 색상 채우기 여부 True
fill_color 내부 색상 "red"
fill_opacity 내부 색상 투명도 (0~1) 0.3
popup 클릭 시 팝업 정보 "서울 시청"
tooltip 마우스 오버 툴팁 '광화문'
folium.Circle(
    location,           # 원의 중심 좌표 (위도, 경도)
    radius=100,         # 반경 (미터 단위)
    color="blue",       # 테두리 색상
    weight=2,           # 테두리 두께
    opacity=1.0,        # 테두리 투명도
    fill=True,          # 내부 색상 채우기 여부
    fill_color="blue",  # 내부 색상
    fill_opacity=0.5,   # 내부 색상 투명도
    popup="정보",        # 클릭 시 표시할 팝업 (선택)
    tooltip="마우스 오버",  # 마우스 오버 시 툴팁 표시 (선택)
)

 

import folium

stations = [
    {"cell": "CellA", "lat": 37.5665, "long": 126.9780, "radius": 500},
    {"cell": "CellB", "lat": 37.5651, "long": 126.9895, "radius": 400},
    {"cell": "CellC", "lat": 37.5700, "long": 126.9768, "radius": 300},
]

# 지도 생성
m = folium.Map(location=[37.5665, 126.9780], zoom_start=14)

# 각 중심에 원 추가
for station in stations:
    lat, lon = station["lat"], station["long"]
    radius = station["radius"]
    
    # 팝업 정보
    popup_text = f"Cell: {station['cell']}<br>Radius: {radius}m"
    
    # 원 추가
    folium.Circle(
        location=[lat, lon],
        radius=radius,
        color="red",
        weight=2,
        opacity=0.5,
        fill=True,
        fill_color="red",
        fill_opacity=0.3,
        popup=popup_text
    ).add_to(m)

# 지도 출력
m

 

5. 다각형 그리기

folium.Polygon은 다각형(Polygon)객체를 생성하는 함수로 지도위에 다각형 형태의 영역을 표시하는데 사용하는 기능입니다.

파라미터 설명 예제 값
locations 꼭짓점 좌표 리스트 [(37.5, 126.9), (37.6, 127.0)]
color 테두리 색상 "blue"
weight 테두리 두께 (픽셀) 2
opacity 테두리 투명도 (0~1) 0.5
fill 내부 색상 채우기 여부 True
fill_color 내부 색상 "red"
fill_opacity 내부 색상 투명도 (0~1) 0.3
popup 클릭 시 팝업 정보 "서울 시청"
tooltip 마우스 오버 툴팁 "광화"
dash_array 점선 스타일 "5,10"
folium.Polygon(
    locations,            # 꼭짓점 좌표 리스트 (위도, 경도)
    color="blue",         # 테두리 색상
    weight=2,             # 테두리 두께
    opacity=1.0,          # 테두리 투명도
    fill=True,            # 내부 색상 채우기 여부
    fill_color="blue",    # 내부 색상
    fill_opacity=0.5,     # 내부 색상 투명도
    popup="정보",         # 팝업 (선택)
    tooltip="마우스 오버",  # 툴팁 (선택)
    dash_array="5,10",    # 점선 스타일 (선택)
)

 

다원이나 부체꼴등을 지원하지 않는데, 다각형 기능을 이어 붙여서 부체꼴 모양도 만들 수 있습니다.

import folium
import pandas as pd
import math

# 예제 데이터프레임 생성
data = {
    "cell": [123, 124, 125, 126],
    "lat": [37.251244, 37.252500, 37.253700, 37.254800],
    "long": [127.014126, 127.016000, 127.018500, 127.020000],
    "azimuth": [45, 150, 270, 330],  # 다양한 방향 설정
    "radius": [312.8, 400, 500, 450]  # 거리 (m)
}

df = pd.DataFrame(data)

# 지도 생성 (중심 좌표 설정)
m = folium.Map(location=[df["lat"].mean(), df["long"].mean()], zoom_start=15)

# 특정 방위각을 기준으로 120도 부채꼴 좌표 생성 함수
def generate_pie_slice(lat, lon, azimuth, radius, num_points=30):
    azimuth_rad = math.radians(azimuth)  # 중심 방위각 라디안 변환
    sector_angle = math.radians(60)  # 60도씩 좌우 확장 (총 120도)

    points = [(lat, lon)]  # 기지국 중심 추가

    # 시작 각도 (-60도)
    start_angle = azimuth_rad - sector_angle
    end_angle = azimuth_rad + sector_angle

    # 반경 거리만큼 120도 부채꼴 좌표 생성
    for angle in range(int(math.degrees(start_angle)), int(math.degrees(end_angle)) + 1, int(120 / num_points)):
        angle_rad = math.radians(angle)
        delta_lat = (radius / 111320) * math.cos(angle_rad)  # 위도 변화량
        delta_lon = (radius / (111320 * math.cos(math.radians(lat)))) * math.sin(angle_rad)  # 경도 변화량
        points.append((lat + delta_lat, lon + delta_lon))

    # 첫 번째 점으로 닫기
    points.append(points[0])
    return points

# 데이터프레임을 순회하며 folium 요소 추가
for _, row in df.iterrows():
    lat, lon, azimuth, radius, cell = row["lat"], row["long"], row["azimuth"], row["radius"], row["cell"]
    
    # Azimuth 방향 색상 결정
    pie_color = 'blue'

    # 기지국 위치에 마커 추가
    folium.Marker(
        [lat, lon], 
        popup=f"Cell: {cell}<br>Azimuth: {azimuth}°<br>Radius: {radius}m",
        icon=folium.Icon(color="blue", icon="info-sign")
    ).add_to(m)

    # 부채꼴(Pie) 형태의 커버리지 추가
    pie_slice = generate_pie_slice(lat, lon, azimuth, radius)
    
    folium.Polygon(
        locations=pie_slice, # 부채꼴 영역을 이루는 좌표들
        color=pie_color,     # 윤곽선 색상
        weight=1,            # 윤곽선 두께 1
        opacity=0.5,         # 윤곽선 불투명도 0.5 (50% 투명)
        fill=True,          
        fill_color=pie_color, # 채우기 색상
        fill_opacity=0.3      # 채우기 불투명도 0.3 (30% 불투명)
    ).add_to(m)

# 지도 출력
m

 

6. 기타함수

이외에 heatmap, line, circle marker 함수가 지원됩니다.

함수명 설명 주요 파라미터
folium.Map 기본 지도 생성 location, zoom_start, tiles

tiles 옵션 (타일 스타일 변경)
  • "OpenStreetMap" (기본값)
  • "CartoDB positron"
  • "CartoDB dark_matter"
folium.Marker 지도에 마커 추가 location, popup, tooltip, icon
folium.Circle 반경을 가진 원 추가 location, radius, color, fill
folium.CircleMarker 작은 마커 형태의 원 추가 location, radius, color, fill
folium.Polygon 다각형(Polygon) 추가 locations, color, fill_color
folium.PolyLine 여러 지점을 연결하는 선(Line) 추가 locations, color, weight
folium.Rectangle 직사각형(Rectangle) 추가 bounds, color, fill_color
folium.GeoJson GeoJSON 데이터를 지도에 표시 data, style_function
folium.Choropleth 지도에 컬러링(Choropleth) 적용 geo_data, data, columns, key_on
folium.TileLayer 지도 타일 스타일 변경 tiles, attr
folium.LayerControl 지도 레이어 선택 UI 추가  
# 지도 생성
m = folium.Map(location=[37.5665, 126.9780], zoom_start=14)

# 두 개의 좌표를 연결하는 선 추가
folium.PolyLine(
    locations=[
        [37.5665, 126.9780],  # 서울 중심
        [37.5700, 126.9820],  # 북쪽 방향
        [37.5725, 126.9750]   # 서쪽 방향
    ],
    color="red",
    weight=3,
    opacity=0.8
).add_to(m)

# 지도 출력
m

 

# 지도 생성
m = folium.Map(location=[37.5665, 126.9780], zoom_start=14)

# 직사각형 추가
folium.Rectangle(
    bounds=[  # 좌하단, 우상단 좌표
        [37.564, 126.974],  # 좌하단
        [37.568, 126.982]   # 우상단
    ],
    color="green",
    weight=2,
    fill=True,
    fill_color="green",
    fill_opacity=0.3
).add_to(m)

# 지도 출력
m

import json
import folium

# 지도 생성
m = folium.Map(location=[37.5665, 126.9780], zoom_start=11)

# 예제 GeoJSON 데이터
geojson_data = {
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "properties": {"name": "서울"},
            "geometry": {
                "type": "Polygon",
                "coordinates": [[[126.9, 37.55], [127.0, 37.55], [127.0, 37.65], [126.9, 37.65], [126.9, 37.55]]]
            }
        }
    ]
}

# GeoJSON 레이어 추가
folium.GeoJson(
    geojson_data,
    style_function=lambda x: {"fillColor": "blue", "color": "black", "weight": 1, "fillOpacity": 0.3}
).add_to(m)

# 지도 출력
m

import pandas as pd

# 지도 생성
m = folium.Map(location=[37.5665, 126.9780], zoom_start=11)

# 데이터 생성
data = pd.DataFrame({
    "region": ["서울", "경기", "인천"],
    "value": [300, 500, 200]  # 예제 데이터
})

# 예제 GeoJSON 데이터 (서울, 경기, 인천)
geojson_data = {
    "type": "FeatureCollection",
    "features": [
        {"type": "Feature", "properties": {"name": "서울"}, "geometry": {"type": "Polygon", "coordinates": [[[126.9, 37.55], [127.0, 37.55], [127.0, 37.65], [126.9, 37.65], [126.9, 37.55]]]}},
        {"type": "Feature", "properties": {"name": "경기"}, "geometry": {"type": "Polygon", "coordinates": [[[126.8, 37.45], [127.1, 37.45], [127.1, 37.75], [126.8, 37.75], [126.8, 37.45]]]}},
        {"type": "Feature", "properties": {"name": "인천"}, "geometry": {"type": "Polygon", "coordinates": [[[126.5, 37.4], [126.8, 37.4], [126.8, 37.7], [126.5, 37.7], [126.5, 37.4]]]}},
    ]
}

# Choropleth 추가
folium.Choropleth(
    geo_data=geojson_data,
    data=data,
    columns=["region", "value"],  # 데이터 컬럼
    key_on="feature.properties.name",
    fill_color="YlOrRd",
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name="데이터 값"
).add_to(m)

# 지도 출력
m

 

7. 지도 저장

지도객체를 html로 저장 할 수 있습니다.

import folium

# 지도 생성
m = folium.Map(location=[37.5665, 126.9780], zoom_start=12)

# 지도 저장 (HTML 파일)
m.save("my_map.html")

'기타' 카테고리의 다른 글

리눅스에서 주피터 노트북 실행  (0) 2025.04.14

+ Recent posts