您好,登录后才能下订单哦!
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
如果地图无法显示,可能是由于网络问题或底图服务不可用。可以尝试更换底图或检查网络连接。
如果标记无法显示,可能是由于坐标错误或图标路径错误。可以检查坐标和图标路径是否正确。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。