머신러닝과 직접적 관계는 없지만 데이터 분석 시 지도 정보를 이용하는 경우가 있습니다.
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)
|
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 옵션 (타일 스타일 변경)
|
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 |
---|