2066 字
10 分钟
一个交互式地理空间数据可视化python工具包

****

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.9
conda activate geo

安装Leafmap及依赖

conda install -c conda-forge mamba
mamba install -c conda-forge leafmap geopandas localtileserver

核心功能#

1. 一键创建交互式地图

import leafmap
m = leafmap.Map()
m  # 在 Jupyter 中显示地图`

2. 多后端支持 (以kepler.gl为例)

import leafmap
import 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.gl
m.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 leafmap
import 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) #指定最小值和最大值.
m

6. 分屏和联动地图

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() #添加绘制工具, 允许用户在地图上进行交互式绘制
m

9. 地理空间数据搜索 (以 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 leafmap
import 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 leafmap
import 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")
m

13. 时间序列动画 (以Raster为例):

import leafmap
import glob
import 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 leafmap
import 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 leafmap
from 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 st
import leafmap.foliumap as leafmap #使用folium
# 创建一个简单的 Streamlit 应用
st.title("Leafmap in Streamlit")
m = leafmap.Map()
m.add_basemap("OpenStreetMap")
# 将 Leafmap 地图添加到 Streamlit
m.to_streamlit(height=700)`

 

应用案例#

  • • 基于Leafmap的粒子动态可视化

  • • 三维可视化海底地形数据
  • • 加载数万个自定义样式的点数据
  • • 加载全球建筑物轮廓数据
  • • 三维可视化展示全球建筑物数据
  • • 使用MapLibre和Leafmap实现三维数据可视化
  • • 基于MapBox实现全球土地覆盖数据可视化
  • • 可视化农田边界数据

 

• 可视化云平台优化的Geotiff格式数据

 

References#

 

本公众号相关内容推荐#

一个交互式地理空间数据可视化python工具包
https://blog.scidatalab.net/posts/一个交互式地理空间数据可视化python工具包/
作者
Echo
发布于
2025-03-08
许可协议
CC BY-NC-SA 4.0