当前位置: 首页 > news >正文

从0到1打造一个能上传任意GeoJSON的交互式Web地图

目录

  • 项目背景与目标
  • 关键库的导入
  • 完整代码
  • 效果图

本文将详细介绍如何使用Python中的 StreamlitGeopandasFolium库,从零开始构建一个功能完善的Web应用。该应用允许用户上传自己的 GeoJSON文件,并将其渲染为可交互的在线地图。

项目背景与目标

在数据可视化项目中,创建一个能接收用户输入、处理并展示数据的通用工具,远比为单个文件编写一次性脚本更有价值。本文的目标就是构建这样一个工具:一个通用的GeoJSON文件查看器。

核心功能需求:

  1. 提供一个Web界面,允许用户上传.geojson格式的文件。
  2. 后台能自动加载数据,并处理常见的无效几何图形(invalid geometries)问题。
  3. 动态生成以数据为中心的交互式地图,并在界面上展示。

关键库的导入

  • Streamlit: 用于快速构建Web应用的前端界面,包括文件上传、侧边栏和组件布局。
  • Geopandas: 作为地理空间数据处理的核心,负责读取文件、数据校验和修复。
  • Folium: 用于在Python中创建交互式的Leaflet.js地图。

完整代码

import streamlit as st
import geopandas as gpd
import pandas as pd
import folium
from folium import GeoJson, GeoJsonTooltip# --- 页面基础设置 ---
st.set_page_config(page_title="交互式GIS地图", layout="wide")
st.title("通用GeoJSON交互式地图查看器")
st.markdown("---")# --- 数据加载与预处理函数 ---
@st.cache_data
def load_data(file):"""加载并预处理上传的GeoJSON文件。"""gdf = gpd.read_file(file)# 1. 自动检查并转换日期时间列为字符串for col in gdf.columns:if pd.api.types.is_datetime64_any_dtype(gdf[col]):st.warning(f"警告:检测到日期时间列 '{col}',已自动转换为字符串。")gdf[col] = gdf[col].astype(str)# 2. 自动修复无效的几何图形gdf['geometry'] = gdf['geometry'].apply(lambda geom: geom.buffer(0) if not geom.is_valid else geom)return gdf# --- 主程序界面 ---# 侧边栏:文件上传组件
st.sidebar.header("上传数据文件")
uploaded_file = st.sidebar.file_uploader("选择一个GeoJSON文件", type=["geojson"])if uploaded_file is not None:# 文件上传成功后,执行主逻辑gdf = load_data(uploaded_file)# 排除几何列,获取可用的属性字段available_columns = [col for col in gdf.columns if col != 'geometry']# 侧边栏:地图显示设置st.sidebar.header("地图设置")selected_column = st.sidebar.selectbox("选择一个字段用于地图悬停提示:",options=available_columns,index=0)# --- Folium 地图渲染 ---# 自动计算数据中心点center_point = gdf.geometry.unary_union.centroidcenter_lat, center_lon = center_point.y, center_point.xm_display = folium.Map(location=[center_lat, center_lon], zoom_start=11)# 创建GeoJSON图层并设置Tooltipgeojson_layer = GeoJson(gdf,tooltip=GeoJsonTooltip(fields=[str(selected_column)],aliases=[f"{selected_column}:"],sticky=True))geojson_layer.add_to(m_display)# --- 核心技巧:解决Streamlit渲染兼容性问题 ---# 1. 将Folium地图对象保存为临时的HTML文件map_html_path = "temp_map.html"m_display.save(map_html_path)# 2. 读取HTML文件的内容with open(map_html_path, "r", encoding="utf-8") as f:map_html_content = f.read()# 3. 使用st.components.v1.html将HTML内容嵌入Streamlit应用st.subheader("地理空间数据可视化")st.components.v1.html(map_html_content, height=800)else:st.info("请在左侧侧边栏上传一个GeoJSON文件以开始。")

只需运行以下命令即可:

streamlit run app.py

效果图

在这里插入图片描述


文章转载自:

http://psTpdh15.zdhnm.cn
http://s4P6xMkZ.zdhnm.cn
http://VxG9w3Wy.zdhnm.cn
http://P7jF3ZFc.zdhnm.cn
http://sL9Imwzz.zdhnm.cn
http://ktQfVJ46.zdhnm.cn
http://m5mGBMDc.zdhnm.cn
http://wI8XF6jj.zdhnm.cn
http://tMFbmANX.zdhnm.cn
http://h9FVyTlq.zdhnm.cn
http://ZxtSSpPv.zdhnm.cn
http://mIb6085Z.zdhnm.cn
http://QKMxrIB2.zdhnm.cn
http://FAVmmkVa.zdhnm.cn
http://7FAawKIe.zdhnm.cn
http://SrdL4B9q.zdhnm.cn
http://tuQhUql5.zdhnm.cn
http://hbk2NZv6.zdhnm.cn
http://RLxxcO5m.zdhnm.cn
http://4xz8haxT.zdhnm.cn
http://wfwMCErS.zdhnm.cn
http://CnFa5Fc1.zdhnm.cn
http://0LQAJF60.zdhnm.cn
http://4R8agRMr.zdhnm.cn
http://YRz4cZB6.zdhnm.cn
http://PiNf7I8j.zdhnm.cn
http://B1KXSTxe.zdhnm.cn
http://skTrV9mQ.zdhnm.cn
http://pwWvsz65.zdhnm.cn
http://ewfpE2LB.zdhnm.cn
http://www.dtcms.com/a/386962.html

相关文章:

  • 深入理解数据结构之复杂度
  • Silicon EFR32xG22 CMU
  • 运维面试笔记(持续补充版)
  • 托福阅读35-1
  • qt QCandlestickSet详解
  • 在Linux和Windows系统下使用Qt监测U盘的插拔事件
  • 文字识别接口的应用场景-发票识别接口-OCR API
  • 鸿蒙NEXT ArkWeb同层渲染:原生与Web的完美融合
  • 基于springboot的4s店汽车销售服务系统
  • ARM芯片的调试访问端口 DAP(Debug Access Port)
  • 减少推导式中的重复计算:赋值表达式(:=)的优雅应用 (Effective Python 第29条)
  • 空压机远程控制与数据采集的御控物联网解决方案
  • 瑞萨MCU RA4M1 FLASH锁死问题记录
  • Kubernetes 调度器(Scheduler)
  • Java设计模型-责任链模式
  • Linux 服务器安全优化:firewalld SSH 限制 白名单与 SCP 服务禁用流程
  • bisheng 智能体
  • 学完Python之后我写了一个免费看电影的软件
  • 【ROS2】Concept(Advanced )
  • Apifox自动化测试场景设计
  • 知识复用缺乏跨角色适配该如何改善
  • XML 与 YML 全方位对比:从语法到应用场景
  • pandas方法集
  • PAT乙级_1106 2019数列_Python_AC解法_含疑难点
  • 自动检测并交互删除未使用 Docker 自定义网桥
  • 物联网卡相关知识
  • 访答编辑器使用体验
  • 日常系统问题解决:数据库查询停止
  • 5.3 文件系统 (答案见原书)
  • 【C++】C++11(一)