Streamlit入门怎么读?GIS数据可视化项目实战教程(附:交互地图代码)
引言:告别静态图表,你的GIS数据需要“活”起来
你是否曾面对一堆地理坐标数据,却只能用Excel生成一张张静态的、无法交互的散点图?对于数据分析师和GIS爱好者来说,这种痛点非常真实。传统的GIS工具往往笨重、学习曲线陡峭,而简单的图表库又难以呈现地理空间数据的深度关系。

这正是 Streamlit 强势登场的地方。它能让你用纯Python代码快速构建交互式Web应用,尤其适合数据可视化。本文将带你通过一个实战教程,利用Streamlit与Folium库,从零开始构建一个交互式GIS地图项目。无论你是想展示全球疫情分布,还是分析城市房价热力图,这篇教程都能为你提供一套完整的解决方案。
核心内容:Streamlit + Folium 地图可视化实战
1. 环境准备与库的安装
在开始编写代码之前,我们需要搭建一个轻量级的开发环境。Streamlit的优势在于“零前端”开发,因此准备工作非常简单。
请确保你的电脑已安装Python(建议3.8及以上版本),然后在终端运行以下命令:
- 安装Streamlit核心库:
pip install streamlit - 安装数据处理库Pandas:
pip install pandas - 安装地图可视化库Folium:
pip install folium - 安装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)来增加交互性,让用户可以选择不同的城市进行聚焦:
- 创建侧边栏选择器: 使用
st.sidebar.selectbox让用户选择城市。 - 初始化地图: 设定中心点和缩放级别。
- 添加标记: 遍历数据,为每个城市添加带有弹窗(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数据可视化项目。从环境安装到代码编写,再到高级优化,这套流程能帮助你将枯燥的地理数据转化为直观、动态的分析工具。
技术的价值在于应用。不要犹豫,现在就打开你的编辑器,运行第一行代码,让你的数据在地图上“动”起来吧!
-
Streamlit入门怎么读?GIS数据可视化项目实战教程(附:交互地图代码) 2026-02-15 08:30:02
-
GISer还在为地理数据可视化发愁?Streamlit读音读对了吗,一文教你搭建交互式地图应用(附:GeoJSON加载源码) 2026-02-15 08:30:02
-
石家庄GIS数据怎么转GeoJSON?Shapely与Fiona实战技巧(附:代码示例) 2026-02-15 08:30:01
-
GeoJSON用什么软件打开?三款GIS主流工具推荐(附:VSCode插件方案) 2026-02-15 08:30:01
-
GeoJSON用什么软件打开?三款GIS主流工具推荐(附:VSCode插件方案) 2026-02-15 08:30:01
-
地理空间分析Web应用开发难题?Streamlit快速搭建实战攻略(含:GIS数据可视化技巧) 2026-02-15 08:30:01
-
GIS小白如何快速搭建在线地图平台?Streamlit菜鸟教程,附WebGIS开发实战案例! 2026-02-15 08:30:01
-
地理空间分析Web应用开发难题?Streamlit快速搭建实战攻略(含:GIS数据可视化技巧) 2026-02-15 08:30:01
-
石家庄GIS数据怎么转GeoJSON?Shapely与Fiona实战技巧(附:代码示例) 2026-02-15 08:30:01
-
GeoJSON到底是什么格式?一文搞懂GIS数据转换与应用(附:WebGIS开发实战源码) 2026-02-14 08:30:02
-
GeoJSON可以用GIS打开吗?QGIS打开与导出全攻略(含:坐标转换技巧) 2026-02-14 08:30:02
-
GEE代码总报错连环追问?城乡规划GIS数据处理实战教程(含:完整代码集) 2026-02-14 08:30:01
-
GEE代码总报错连环追问?城乡规划GIS数据处理实战教程(含:完整代码集) 2026-02-14 08:30:01
-
Google Earth Engine图片如何批量下载?GIS数据处理实战技巧(含:Python脚本) 2026-02-14 08:30:01
-
Google Earth Engine图片如何批量下载?GIS数据处理实战技巧(含:Python脚本) 2026-02-14 08:30:01
-
GEE影像处理太慢?Google Earth Engine API加速实操指南(附:Python调用脚本) 2026-02-14 08:30:01
-
GEE影像处理太慢?Google Earth Engine API加速实操指南(附:Python调用脚本) 2026-02-14 08:30:01
-
GEE数据处理代码不会写?手把手教你GIS数据云端分析(含:完整脚本) 2026-02-13 08:30:02
-
GEE账号申请屡次失败?GIS研习社分享个人开发者认证全套教程(附:申请模板) 2026-02-13 08:30:02
-
GEE账号申请屡次失败?GIS研习社分享个人开发者认证全套教程(附:申请模板) 2026-02-13 08:30:02