首页 编程与开发 Streamlit入门怎么读?GIS数据可视化项目实战教程(附:交互地图代码)

Streamlit入门怎么读?GIS数据可视化项目实战教程(附:交互地图代码)

作者: GIS研习社 更新时间:2026-02-15 08:30:01 分类:编程与开发

引言:告别静态图表,你的GIS数据需要“活”起来

你是否曾面对一堆地理坐标数据,却只能用Excel生成一张张静态的、无法交互的散点图?对于数据分析师和GIS爱好者来说,这种痛点非常真实。传统的GIS工具往往笨重、学习曲线陡峭,而简单的图表库又难以呈现地理空间数据的深度关系。

Streamlit入门怎么读?GIS数据可视化项目实战教程(附:交互地图代码)

这正是 Streamlit 强势登场的地方。它能让你用纯Python代码快速构建交互式Web应用,尤其适合数据可视化。本文将带你通过一个实战教程,利用Streamlit与Folium库,从零开始构建一个交互式GIS地图项目。无论你是想展示全球疫情分布,还是分析城市房价热力图,这篇教程都能为你提供一套完整的解决方案。

核心内容:Streamlit + Folium 地图可视化实战

1. 环境准备与库的安装

在开始编写代码之前,我们需要搭建一个轻量级的开发环境。Streamlit的优势在于“零前端”开发,因此准备工作非常简单。

请确保你的电脑已安装Python(建议3.8及以上版本),然后在终端运行以下命令:

  1. 安装Streamlit核心库: pip install streamlit
  2. 安装数据处理库Pandas: pip install pandas
  3. 安装地图可视化库Folium: pip install folium
  4. 安装Streamlit-Folium桥接库: pip install streamlit-folium

安装完成后,你可以通过在终端输入 streamlit version 来验证安装是否成功。

2. 构建基础地图应用

Streamlit的运行逻辑是“从上到下”执行脚本。我们将创建一个名为 app.py 的文件,并逐步添加功能。

首先,导入必要的库并设置页面布局:

import streamlit as st
import folium
from streamlit_folium import st_folium
import pandas as pd

接下来,我们需要创建一个模拟的GIS数据集。在实际项目中,你可能会读取CSV或Shapefile文件。这里我们创建一组包含经纬度和属性值的数据:

# 创建示例数据
data = {
    'lat': [39.9042, 31.2304, 22.3193, 40.7128],
    'lon': [116.4074, 121.4737, 114.1694, -74.0060],
    'city': ['北京', '上海', '香港', '纽约'],
    'value': [100, 120, 80, 95]
}
df = pd.DataFrame(data)

3. 添加交互式地图与标记

这是本教程的核心部分。我们将使用Folium生成地图对象,并利用Streamlit的组件将其渲染到网页上。

首先,我们需要一个侧边栏(Sidebar)来增加交互性,让用户可以选择不同的城市进行聚焦:

  1. 创建侧边栏选择器: 使用 st.sidebar.selectbox 让用户选择城市。
  2. 初始化地图: 设定中心点和缩放级别。
  3. 添加标记: 遍历数据,为每个城市添加带有弹窗(Popup)的Marker。

以下是完整的代码逻辑:

# Streamlit 侧边栏
selected_city = st.sidebar.selectbox("选择城市", df['city'])

# 获取选中城市的经纬度
city_data = df[df['city'] == selected_city].iloc[0]
center_lat = city_data['lat']
center_lon = city_data['lon']

# 初始化 Folium 地图
map_center = [center_lat, center_lon]
m = folium.Map(location=map_center, zoom_start=12)

# 添加标记
for idx, row in df.iterrows():
    folium.CircleMarker(
        location=[row['lat'], row['lon']],
        radius=row['value'] / 5,  # 根据数值调整圆点大小
        popup=f"{row['city']}: {row['value']}",
        color="crimson",
        fill=True,
        fill_color="crimson"
    ).add_to(m)

# 在 Streamlit 页面上渲染地图
st.title("全球主要城市数据可视化看板")
st.write(f"当前选中的城市是: **{selected_city}**")
st_folium(m, width=700)

运行 streamlit run app.py,你将看到一个功能完整的Web应用。左侧可以切换城市,右侧地图会自动调整中心点,并显示带有数值的动态圆点。

4. 数据驱动的动态图层

在进阶实战中,我们不应硬编码数据。通常,GIS项目需要读取外部文件(如CSV)。我们可以利用Streamlit的文件上传器来实现动态数据加载。

uploaded_file = st.sidebar.file_uploader("上传CSV数据", type=["csv"])
if uploaded_file is not None:
    df = pd.read_csv(uploaded_file)
    st.success("数据加载成功!")

这样,你的应用就具备了通用性,可以处理任何符合格式(包含lat, lon列)的GIS数据。

扩展技巧:不为人知的高级优化

1. 突破性能瓶颈:使用 st.cache_data

当你的GIS数据包含数万条记录时,每次交互(如拖动滑块、切换标签)都会导致数据重新计算和地图重绘,这会让应用变得非常卡顿。Streamlit 提供了强大的装饰器 @st.cache_data

在你的数据加载函数或地图生成函数上添加此装饰器,可以确保数据只被加载和处理一次,除非输入参数发生变化。这能极大地提升大型GIS项目的响应速度。

@st.cache_data
def load_data(filepath):
    return pd.read_csv(filepath)

2. 地图美观度与图层控制

默认的Folium地图虽然功能强大,但样式较为单一。你可以通过添加不同的瓦片图层(TileLayer)来增强视觉效果,例如使用Esri的卫星影像或Stamen的地形图。

此外,利用 folium.FeatureGroup 可以将不同类别的数据分组,配合 folium.LayerControl,用户就可以在地图右上角自由勾选/隐藏不同的图层,这使得复杂的数据分析变得井井有条。

FAQ 问答:用户最关心的问题

Q1: Streamlit适合构建生产级的GIS系统吗?

Streamlit 非常适合构建数据探索(EDA)工具、内部仪表盘和原型验证。对于高并发、需要严格权限控制和复杂前端交互的生产级商业系统,可能需要结合FastAPI等后端框架,或者使用更成熟的Web框架(如Django + Leaflet)。但对于绝大多数数据团队的内部工具需求,Streamlit 已经足够强大。

Q2: 为什么我的地图在Streamlit中不显示?

这通常是因为 st_folium() 的使用问题。请确保:1. 正确导入了 from streamlit_folium import st_folium;2. 地图对象(m)已正确创建并传递给渲染函数。如果使用了缓存,确保缓存没有返回空对象。此外,检查浏览器控制台是否有网络错误,排除CDN加载失败的可能性。

Q3: Streamlit 能处理大文件(如几百万行的GIS数据)吗?

纯客户端的Streamlit应用在处理超大规模数据时会遇到内存限制。对于这种情况,建议在数据进入Streamlit之前进行预处理:1. 使用GeoPandas或PySpark进行空间聚合(如将点数据聚合为六边形网格);2. 仅加载用户当前视图范围内的数据(通过SQL查询过滤);3. 使用 WebGL 渲染库(如 deck.gl)替代 Folium 进行海量点的渲染。

总结

通过本文的实战教程,你应该已经掌握了如何利用 Streamlit 快速搭建一个交互式的GIS数据可视化项目。从环境安装到代码编写,再到高级优化,这套流程能帮助你将枯燥的地理数据转化为直观、动态的分析工具。

技术的价值在于应用。不要犹豫,现在就打开你的编辑器,运行第一行代码,让你的数据在地图上“动”起来吧!

相关文章