****
Leafmap是一个专为交互式地图和地理空间分析设计的Python包,旨在让用户能够在Jupyter环境中以最少的代码进行地理空间数据的分析和可视化。

Leafmap构建于多个开源包之上,包括:
- •Folium:基于Leaflet.js的交互式地图库
- •ipyleaflet:用于Jupyter环境的交互式地图小部件
- •WhiteboxTools和whiteboxgui:用于分析地理空间数据
- •ipywidgets:用于设计交互式图形用户界面(GUI)
- •GeoPandas:用于矢量数据操作
- •Rasterio:用于栅格数据处理

Leafmap允许用户无需编码即可将矢量和栅格数据加载到地图上。此外,用户可以利用强大的分析后端(即WhiteboxTools)直接在Leafmap用户界面中执行地理空间分析,而无需编写任何代码。WhiteboxTools库目前包含500多个用于高级地理空间分析的工具,如GIS分析、地貌分析、水文分析、LiDAR数据分析、数学和统计分析以及流网络分析。
安装方法
Leafmap的安装过程简单,建议使用干净的环境以避免依赖冲突。
前提条件:
- • Python 3.7或更高版本
- • Jupyter 环境(如Jupyter Notebook或Google Colab)
- • Conda包管理器
安装步骤:
创建新Conda环境
conda create -n geo python=3.9conda activate geo安装Leafmap及依赖
conda install -c conda-forge mambamamba install -c conda-forge leafmap geopandas localtileserver核心功能
1. 一键创建交互式地图
import leafmap
m = leafmap.Map()m # 在 Jupyter 中显示地图`
2. 多后端支持 (以kepler.gl为例)
import leafmapimport geopandas as gpd
# 创建一个 GeoDataFrame (示例数据)data = { 'City': ['New York', 'London', 'Tokyo'], 'Latitude': [40.7128, 51.5074, 35.6895], 'Longitude': [-74.0060, -0.1278, 139.6917]}gdf = gpd.GeoDataFrame(data, geometry=gpd.points_from_xy(data['Longitude'], data['Latitude']))
m = leafmap.Map(center=[0, 0], zoom=2, backend='kepler') # 指定使用 kepler.glm.add_gdf(gdf, layer_name="Cities")m
3. 交互式底图切换
import leafmap
m = leafmap.Map()m.add_basemap("Stamen.Terrain") #添加Stamen.Terrain底图m
4. 矢量和栅格数据支持 (以Shapefile和GeoTIFF为例)
import leafmap
m = leafmap.Map()
# 添加 Shapefile (你需要替换成你的 Shapefile 路径)shapefile_path = "path/to/your/shapefile.shp"m.add_shp(shapefile_path, layer_name="My Shapefile")
# 添加 GeoTIFF (你需要替换成你的 GeoTIFF 路径)geotiff_path = "path/to/your/geotiff.tif"m.add_raster(geotiff_path, layer_name="My Raster", colormap='terrain')m
5. 自定义图例和颜色条
import leafmapimport matplotlib.pyplot as plt
m = leafmap.Map()# 添加栅格数据 (使用示例数据, 或替换成你的栅格文件路径)url = 'https://github.com/giswqs/data/raw/main/raster/srtm90.tif'm.add_raster(url, layer_name='srtm', colormap='terrain')
# 添加自定义颜色条, 自定义范围和标签colors = ['#006633', '#E5FFCC', '#662A00', '#D8D8D8', '#F5F5F5'] # 颜色列表labels = ['Low', 'Medium', 'High', 'Very High', 'Extremely High']m.add_colorbar(colors=colors, labels=labels, vmin=0, vmax=4000) #指定最小值和最大值.
m6. 分屏和联动地图
import leafmap
# 创建两个地图m1 = leafmap.Map(center=[40, -100], zoom=4, height="450px") #美国中心m2 = leafmap.Map(center=[40, -100], zoom=4, height="450px")
# 添加不同的底图m1.add_basemap("OpenStreetMap")m2.add_basemap("Esri.WorldImagery")
#创建分割面板leafmap.linked_maps([m1, m2]) #进行地图联动`
7. OpenStreetMap数据集成
import leafmap
m = leafmap.Map(center=[40.7128, -74.0060], zoom=14) # New York City#通过城市名称下载, 并添加到地图m.add_osm_from_geocode("Manhattan, New York", layer_name="Manhattan")m
8. 交互式矢量数据编辑
此功能需要在Jupyter中与地图进行交互操作, 以下代码仅为启动编辑功能的示例
import leafmap
m = leafmap.Map()m.add_draw_control() #添加绘制工具, 允许用户在地图上进行交互式绘制m9. 地理空间数据搜索 (以 STAC 为例)
(此功能需要在Jupyter中使用搜索工具与地图进行交互操作)
import leafmap
m = leafmap.Map()m.add_stac_layer( url="https://raw.githubusercontent.com/SpatialTemporalAssetCatalogs/stac-browser/main/examples/stac-load/catalog.json")m
10. 栅格像素值交互式检查
import leafmap
m = leafmap.Map()# 添加栅格数据 (使用示例数据, 或替换成你的栅格文件路径)url = 'https://github.com/giswqs/data/raw/main/raster/srtm90.tif'm.add_raster(url, layer_name="Elevation")m
11. 专题地图和热力图 (以Choropleth map为例):
import leafmapimport geopandas as gpd
m = leafmap.Map()url = "https://raw.githubusercontent.com/giswqs/leafmap/master/examples/data/us_states.json"gdf = gpd.read_file(url)m.add_gdf(gdf, "pop_est", layer_name="US States Population")m
12. PostGIS 数据库集成:
假设已经有一个PostGIS数据库并配置好连接
import leafmapimport psycopg2
m = leafmap.Map()
# 数据库连接参数 (替换成你的实际参数)db_params = { 'host': 'your_host', 'database': 'your_database', 'user': 'your_user', 'password': 'your_password', 'port': 'your_port'}
# SQL 查询 (替换成你的查询)sql = "SELECT * FROM your_table"
m.add_postgis_layer(db_params, sql, layer_name="PostGIS Layer")m13. 时间序列动画 (以Raster为例):
import leafmapimport globimport os
m = leafmap.Map(center=[40, -100], zoom=4)
# 假设你有一系列按时间顺序命名的 GeoTIFF 文件 (例如: image_2020.tif, image_2021.tif, ...)# 你需要将这些文件放在一个文件夹中image_folder = "path/to/your/image/folder" #文件路径
# 使用 glob 获取文件列表images = glob.glob(os.path.join(image_folder, "*.tif"))images.sort() # 确保按时间顺序排列
# 创建时间序列m.add_time_slider(images, time_interval=1) #每一张图片之间的时间间隔为1, 单位是秒.m
14. 地理空间分析 (以WhiteboxTools为例, 计算坡度):
import leafmapimport whitebox
wbt = whitebox.WhiteboxTools() #实例化
# 设置 WhiteboxTools 工作目录 (可选, 如果已在环境变量中设置)wbt.set_whitebox_dir("path/to/your/whitebox/directory") # 替换成你的 WhiteboxTools 安装目录
# 输入和输出文件路径 (你需要替换成你的文件路径)input_dem = "path/to/your/dem.tif"output_slope = "path/to/output/slope.tif"
# 计算坡度wbt.slope(input_dem, output_slope)
# 将结果添加到地图m = leafmap.Map()m.add_raster(output_slope, layer_name="Slope", colormap="gist_earth")m
15. 遥感影像分割和分类 (需要segment-geospatial 包):
由于涉及到深度学习模型, 示例代码会比较长, 且需要预训练模型, 这里给出一个简化版的流程示意。
import leafmapfrom samgeo import SamGeo, tms_to_geotiff #需要另外安装samgeo
# 下载示例图像image = "satellite_image.tif" # 替换成你的遥感影像文件tms_to_geotiff(output=image, bbox=[-71.2255, 42.3425, -71.1996, 42.3592], zoom=17)
# 创建 SamGeo 对象sam = SamGeo( model_type="vit_h", checkpoint="sam_vit_h_4b8939.pth", device=torch.device("cuda" if torch.cuda.is_available() else "cpu"),)
# 设置影像sam.set_image(image)
# 进行分割 (需要交互式指定种子点, 或使用自动生成的网格)# 例如, 自动生成网格:sam.generate_masks(foreground=True, erosion_kernel=(3, 3), mask_multiplier=255)
# 将结果转换为矢量sam.masks_to_polygons(output="segmented_polygons.shp")
# 在 Leafmap 中显示m = leafmap.Map()m.add_raster(image, layer_name="Satellite Image")m.add_vector("segmented_polygons.shp", layer_name="Segments")m
16. 构建交互式Web应用 (以 Streamlit 为例):
import streamlit as stimport leafmap.foliumap as leafmap #使用folium
# 创建一个简单的 Streamlit 应用st.title("Leafmap in Streamlit")
m = leafmap.Map()m.add_basemap("OpenStreetMap")
# 将 Leafmap 地图添加到 Streamlitm.to_streamlit(height=700)`
应用案例
- • 基于Leafmap的粒子动态可视化


- • 三维可视化海底地形数据
- • 加载数万个自定义样式的点数据
- • 加载全球建筑物轮廓数据
- • 三维可视化展示全球建筑物数据
- • 使用MapLibre和Leafmap实现三维数据可视化
- • 基于MapBox实现全球土地覆盖数据可视化
- • 可视化农田边界数据
• 可视化云平台优化的Geotiff格式数据
References
- • Leafmap官方文档:https://leafmap.org
- • GitHub仓库:https://github.com/giswqs/leafmap
- • 教程和示例:https://leafmap.org/tutorials
- • Youtube:https://www.youtube.com/@giswqs
- • Twitter:https://x.com/giswqs
本公众号相关内容推荐
- ECMWF发布首个业务化运行人工智能天气预报模型
- 一个提供超过50PB地理空间数据的云平台
- 4个用于分析卫星遥感影像的开源应用软件
- 迄今最大规模基于Sentinel的AI-Ready数据集:Major TOM
- 20个用于卫星观测数据可视化的Python库
- Google发布AI天气预报系统实时与历史预报数据
- OceanSpy:一个提供海洋数值模式数据分析和可视化的Python包
- Segment-geospatial: 地理空间图像分割开源Python工具包
- DeepSeek AI创新:颠覆传统,重新定义大模型开发范式
- 大语言模型在科学研究中的应用
- 6个用于清洗地理空间数据的Python工具库
- AllClear:用于卫星影像云去除的综合数据集
- 深度学习技术在地理空间人工智能(GeoAI)中的应用
- xgcm-通用环流模式后处理Python工具包
- GeoAI:地理信息与人工智能的交叉融合
- 深度学习提升全球海洋涡旋动力学卫星观测能力
- 基于xarray扩展的开源地图可视化Python库
- NOAA 发布世界磁场模型 WMM2025
- 推荐10个用于处理GIS和遥感数据的Python库
- ECMWF的AI天气预报系统AIFS开放模型权重参数
- The Well:可用于机器学习研究的15TB 物理模拟数据集
- 推荐6个美化Matplotlib可视化样式的python库
- AI天气模型的现状与未来
- 流式传输和渲染可视化三维地理空间数据
- GIS领域常用的24种数据格式
- 一种基于图神经网络的三维建筑模型重建方法
- WebGIS技术栈推荐
- 使用Python工具可视化大型图网络
- 使用NetworkX提取图网络特征
- Argo海洋观测数据处理分析python库:ArgoPy
- 在Jupyter环境中创建交互式可视化地图
- 处理和可视化地理空间数据的Python库:EarthPy