Folium 是一個基于 Python 的庫,用于創建交互式地圖。它建立在 Leaflet.js 之上,Leaflet.js 是一個流行的 JavaScript 庫,用于創建移動友好的交互式地圖。Folium 使得在 Python 中創建和操作地圖變得非常簡單,尤其適合數據科學家和地理信息系統(GIS)開發者。
Folium 的主要特點包括:
要使用 Folium,首先需要安裝它??梢酝ㄟ^ pip 來安裝:
pip install folium
安裝完成后,可以直接在 Python 腳本中導入 Folium:
import folium
創建一個簡單的地圖非常簡單。以下代碼創建了一個以北京為中心的地圖:
import folium
# 創建地圖對象,設置中心位置和縮放級別
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 顯示地圖
m
Folium 支持多種地圖底圖,可以通過 tiles
參數來設置:
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10, tiles='Stamen Terrain')
m
常用的底圖選項包括:
OpenStreetMap
Stamen Terrain
Stamen Toner
Mapbox Bright
Mapbox Control Room
可以通過 min_zoom
和 max_zoom
參數來設置地圖的縮放范圍:
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10, min_zoom=5, max_zoom=15)
m
可以使用 folium.Marker
來添加標記:
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 添加標記
folium.Marker([39.9042, 116.4074], popup='北京').add_to(m)
m
可以通過 icon
參數來自定義標記圖標:
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 自定義圖標
folium.Marker(
[39.9042, 116.4074],
popup='北京',
icon=folium.Icon(color='red', icon='info-sign')
).add_to(m)
m
可以在地圖上添加多個標記:
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 添加多個標記
folium.Marker([39.9042, 116.4074], popup='北京').add_to(m)
folium.Marker([31.2304, 121.4737], popup='上海').add_to(m)
folium.Marker([23.1291, 113.2644], popup='廣州').add_to(m)
m
Folium 支持添加多個圖層,并且可以通過圖層控制來切換不同的圖層:
m = folium.Map(location=[39.9042, 116.4074], zoom_start=5)
# 添加多個圖層
folium.TileLayer('OpenStreetMap').add_to(m)
folium.TileLayer('Stamen Terrain').add_to(m)
folium.TileLayer('Stamen Toner').add_to(m)
# 添加圖層控制
folium.LayerControl().add_to(m)
m
可以創建自定義的圖層,并將其添加到地圖中:
m = folium.Map(location=[39.9042, 116.4074], zoom_start=5)
# 創建自定義圖層
custom_tile = folium.TileLayer(
tiles='https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png',
attr='Custom Tile',
name='Custom Tile'
)
# 添加自定義圖層
custom_tile.add_to(m)
# 添加圖層控制
folium.LayerControl().add_to(m)
m
地理編碼是將地址轉換為地理坐標的過程。Folium 本身不提供地理編碼功能,但可以結合其他庫(如 geopy
)來實現:
from geopy.geocoders import Nominatim
# 創建地理編碼器
geolocator = Nominatim(user_agent="my_app")
# 地理編碼
location = geolocator.geocode("北京")
print(location.latitude, location.longitude)
逆地理編碼是將地理坐標轉換為地址的過程。同樣可以使用 geopy
來實現:
from geopy.geocoders import Nominatim
# 創建地理編碼器
geolocator = Nominatim(user_agent="my_app")
# 逆地理編碼
location = geolocator.reverse("39.9042, 116.4074")
print(location.address)
Folium 支持創建熱力圖,可以通過 folium.plugins.HeatMap
來實現:
import folium
from folium.plugins import HeatMap
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 創建熱力圖數據
data = [
[39.9042, 116.4074, 1],
[31.2304, 121.4737, 0.8],
[23.1291, 113.2644, 0.6]
]
# 添加熱力圖
HeatMap(data).add_to(m)
m
可以通過 radius
和 blur
參數來自定義熱力圖的外觀:
import folium
from folium.plugins import HeatMap
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 創建熱力圖數據
data = [
[39.9042, 116.4074, 1],
[31.2304, 121.4737, 0.8],
[23.1291, 113.2644, 0.6]
]
# 添加自定義熱力圖
HeatMap(data, radius=20, blur=15).add_to(m)
m
當有大量標記時,可以使用聚類標記來優化顯示效果。Folium 提供了 folium.plugins.MarkerCluster
來實現這一功能:
import folium
from folium.plugins import MarkerCluster
m = folium.Map(location=[39.9042, 116.4074], zoom_start=5)
# 創建聚類標記
marker_cluster = MarkerCluster().add_to(m)
# 添加多個標記
folium.Marker([39.9042, 116.4074], popup='北京').add_to(marker_cluster)
folium.Marker([31.2304, 121.4737], popup='上海').add_to(marker_cluster)
folium.Marker([23.1291, 113.2644], popup='廣州').add_to(marker_cluster)
m
可以通過 icon_create_function
參數來自定義聚類標記的圖標:
import folium
from folium.plugins import MarkerCluster
m = folium.Map(location=[39.9042, 116.4074], zoom_start=5)
# 自定義聚類標記圖標
icon_create_function = """
function(cluster) {
return L.divIcon({
html: '<b>' + cluster.getChildCount() + '</b>',
className: 'marker-cluster-custom',
iconSize: L.point(40, 40)
});
}
"""
# 創建聚類標記
marker_cluster = MarkerCluster(icon_create_function=icon_create_function).add_to(m)
# 添加多個標記
folium.Marker([39.9042, 116.4074], popup='北京').add_to(marker_cluster)
folium.Marker([31.2304, 121.4737], popup='上海').add_to(marker_cluster)
folium.Marker([23.1291, 113.2644], popup='廣州').add_to(marker_cluster)
m
可以使用 folium.Polygon
來繪制多邊形:
import folium
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 繪制多邊形
folium.Polygon(
locations=[[39.9042, 116.4074], [31.2304, 121.4737], [23.1291, 113.2644]],
color='blue',
fill=True,
fill_color='red'
).add_to(m)
m
可以使用 folium.PolyLine
來繪制線條:
import folium
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 繪制線條
folium.PolyLine(
locations=[[39.9042, 116.4074], [31.2304, 121.4737], [23.1291, 113.2644]],
color='blue',
weight=5
).add_to(m)
m
可以使用 folium.Circle
來繪制圓形:
import folium
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 繪制圓形
folium.Circle(
location=[39.9042, 116.4074],
radius=50000,
color='blue',
fill=True,
fill_color='red'
).add_to(m)
m
可以使用 folium.features.CustomIcon
來使用自定義圖標:
import folium
from folium.features import CustomIcon
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 使用自定義圖標
icon_image = 'https://leafletjs.com/examples/custom-icons/leaf-green.png'
icon = CustomIcon(
icon_image,
icon_size=(38, 95),
icon_anchor=(22, 94),
popup_anchor=(-3, -76)
)
folium.Marker([39.9042, 116.4074], icon=icon, popup='北京').add_to(m)
m
可以使用 folium.Icon
的 icon
參數來使用 Font Awesome 圖標:
import folium
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 使用 Font Awesome 圖標
folium.Marker(
[39.9042, 116.4074],
popup='北京',
icon=folium.Icon(color='green', icon='info-sign', prefix='fa')
).add_to(m)
m
可以通過 tiles
參數來設置地圖的背景顏色:
import folium
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10, tiles='CartoDB dark_matter')
m
可以通過 folium.TileLayer
的 attr
參數來自定義地圖樣式:
import folium
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 自定義地圖樣式
folium.TileLayer(
tiles='https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png',
attr='Custom Tile',
name='Custom Tile'
).add_to(m)
m
可以通過 folium.ClickForMarker
插件來添加點擊事件:
import folium
from folium.plugins import ClickForMarker
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 添加點擊事件
ClickForMarker().add_to(m)
m
可以通過 folium.LatLngPopup
插件來添加鼠標懸停事件:
import folium
from folium.plugins import LatLngPopup
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 添加鼠標懸停事件
LatLngPopup().add_to(m)
m
可以將地圖導出為 HTML 文件:
import folium
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 導出為 HTML 文件
m.save('map.html')
Folium 本身不支持直接導出為圖片,但可以通過結合其他工具(如 selenium
)來實現:
from selenium import webdriver
import time
# 創建地圖
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
m.save('map.html')
# 使用 selenium 打開 HTML 文件并截圖
driver = webdriver.Chrome()
driver.get('file:///path/to/map.html')
time.sleep(5) # 等待地圖加載
driver.save_screenshot('map.png')
driver.quit()
可以使用 folium.GeoJson
來加載和顯示 GeoJSON 數據:
import folium
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 加載 GeoJSON 數據
geojson_data = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "Point",
"coordinates": [116.4074, 39.9042]
}
}
]
}
folium.GeoJson(geojson_data).add_to(m)
m
可以使用 folium.TopoJson
來加載和顯示 TopoJSON 數據:
import folium
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 加載 TopoJSON 數據
topojson_data = {
"type": "Topology",
"objects": {
"example": {
"type": "GeometryCollection",
"geometries": [
{
"type": "Point",
"coordinates": [116.4074, 39.9042]
}
]
}
},
"arcs": []
}
folium.TopoJson(topojson_data, 'objects.example').add_to(m)
m
可以使用 folium.Choropleth
來創建 Choropleth 地圖:
import folium
import pandas as pd
m = folium.Map(location=[39.9042, 116.4074], zoom_start=10)
# 創建數據
data = pd.DataFrame({
'region': ['北京', '上海', '廣州'],
'value': [10, 20, 30]
})
# 創建 Choropleth 地圖
folium.Choropleth(
geo_data='path/to/geojson/file',
name='choropleth',
data=data,
columns=['region', 'value'],
key_on='feature.properties.name',
fill_color='YlGn',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='Value'
).add_to(m)
m
如果地圖無法顯示,可能是由于網絡問題或底圖服務不可用??梢試L試更換底圖或檢查網絡連接。
如果標記無法顯示,可能是由于坐標錯誤或圖標路徑錯誤??梢詸z查坐標和圖標路徑是否正確。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。