数据可视化数据分析GIS【免费下载链接】foliumPython Data. Leaflet.js Maps.项目地址https://gitcode.com/gh_mirrors/fo/folium点击查看免费下载导读folium.GeoJson是 folium 项目Python Data, Leaflet.js Maps中最核心的地图数据图层类之一它把标准 GeoJSON 数据文件、URL、字典或任意实现__geo_interface__的对象直接绑定到 Leaflet 地图上并支持按要素feature级别的样式函数、鼠标悬停高亮、点击缩放、弹窗与工具提示等交互能力。本文以仓库文档 docs/user_guide/geojson/geojson.md 为骨架结合 folium/features.py 中的GeoJson源码实现与 tests/test_features.py 测试用例完整讲解数据加载的四种方式、style_function的样式机制、highlight_function与popup_keep_highlighted交互配置并手把手带你用branca.colormap构建美国各州失业率 choropleth 专题图。读完本文你将能直接用folium.GeoJson产出从简单矢量图层到带图例的统计专题图在内的完整地图应用。一、GeoJson 是什么类签名与核心参数在 folium 源码中GeoJson定义于 folium/features.py#L464-L543继承自Layer其构造函数参数如下参数默认值说明data必填GeoJSON 数据文件路径、URL、字典、JSON 字符串或带__geo_interface__的对象如 GeoPandas GeoDataFramestyle_functionNone接收单个 feature 并返回样式字典的函数用于设置每个要素的视觉样式highlight_functionNone接收单个 feature 并返回样式字典的函数仅在鼠标事件悬停时应用popup_keep_highlightedFalse布尔值弹窗打开时是否保持高亮样式需同时提供popup与highlight_functionnameNone图层名显示在 LayerControl 中overlayTrueTrue作为覆盖图层overlayFalse作为底图图层controlTrue是否纳入 LayerControlshowTrue打开地图时图层是否可见smooth_factorNone每个缩放级别对折线的简化程度数值越大性能越好但精度越低Leaflet 默认 1.0tooltipNone悬停提示支持GeoJsonTooltip、Tooltip或字符串popupNone每个要素的弹窗传GeoJsonPopup对象embedTrue是否把数据内嵌进 HTML仅在提供文件链接或 URL 时可设为False改为 ajax 异步加载zoom_on_clickFalse点击几何体时是否自动缩放True启用on_each_featureNoneJsCode形式的 JavaScript 代码对应 Leaflet GeoJSON 的onEachFeature回调markerNone若数据含 Point 几何可传Circle、CircleMarker或Marker对象定制点要素样式**kwargs—其余关键字参数作为额外选项传给L.geoJson值得注意的两个约束见 folium/features.py#L713-L717popup_keep_highlightedTrue时若未提供popup会抛出ValueError(A popup is needed to use the popup_keep_highlighted feature)marker只接受Circle、CircleMarker、Marker三种类型否则抛出TypeErrorfolium/features.py#L707-L711。二、四种数据加载方式与底层处理逻辑2.1 经典 FeatureCollection 的结构文档以美国各州边界为例说明这是一个标准 GeoJSONFeatureCollection。仓库 tests/us-states.json 中的真实数据与之完全一致{ type: FeatureCollection, features: [ { type: Feature, id: AL, properties: {name: Alabama}, geometry: { type: Polygon, coordinates: [[[-87.359296, 35.00118], ...]] } }, { type: Feature, id: AK, properties: {name: Alaska}, geometry: { type: MultiPolygon, coordinates: [[[[-131.602021, 55.117982], ...]]] } } ] }每个 feature 的id如AL、AK与properties是后续样式函数与 choropleth 数据关联的关键。关于坐标顺序GeoJSON 为[经度, 纬度]Leaflet 为[纬度, 经度]的差异说明可进一步参考仓库文档 docs/user_guide/geojson/coordinate_ordering.md。2.2 方式一直接传入 dictimport folium import requests geo_json_data requests.get( https://raw.githubusercontent.com/python-visualization/folium-example-data/main/us_states.json ).json() m folium.Map([43, -100], zoom_start4) folium.GeoJson(geo_json_data).add_to(m) m2.3 方式二传入本地文件路径或 URL文档特别提示无需自己先加载文件直接把本地文件路径或 URL 字符串交给folium.GeoJson即可m folium.Map([43, -100], zoom_start4) url https://raw.githubusercontent.com/python-visualization/folium-example-data/main/us_states.json folium.GeoJson(url).add_to(m) m底层由process_data分发folium/features.py#L744-L770http:/https:/ftp:开头 → 通过requests.get(url).json()拉取并解析字符串以[或{开头 → 视为内联 GeoJSON 字符串json.loads解析其余 → 视为文件路径open读取后json.loads。注意字符串方式默认embedTrue会把数据完整内嵌进生成的 HTML若想改为运行时异步加载需同时传embedFalse此时源码会使用$.ajax从embed_link拉取数据见模板 folium/features.py#L664-L669。2.4 方式三传入 GeoPandas 对象import geopandas gdf geopandas.read_file(url) m folium.Map([43, -100], zoom_start4) folium.GeoJson(gdf).add_to(m) m源码通过hasattr(data, __geo_interface__)分支识别这类对象并序列化__geo_interface__字典若对象还提供to_crsGeoPandas 的投影转换方法会先强制data.to_crs(EPSG:4326)保证坐标系与 Web 墨卡托底图一致folium/features.py#L762-L766。这就是为什么 GeoPandas 数据不需要手动转换经纬度。2.5 方式四非 FeatureCollection 的自动包装若传入的是单个 Feature 或裸 geometry如单个 Polygon在启用样式/高亮时convert_to_feature_collection会自动把它包装成FeatureCollectionfolium/features.py#L775-L790self.data {type: Feature, geometry: self.data} self.data {type: FeatureCollection, features: [self.data]}但如果embedFalse则无法就地改写数据源码会抛出ValueError提示改用embedTrue或先自行整理为 FeatureCollection。这一点对用embedFalse做大数据的读者尤其重要。三、Style用 style_function 定制每个要素3.1 统一样式style_function接收一个 feature 并返回样式字典最简单的用法是所有要素统一配色m folium.Map([43, -100], zoom_start4) folium.GeoJson( geo_json_data, style_functionlambda feature: { fillColor: #ffff00, color: black, weight: 2, dashArray: 5, 5, }, ).add_to(m) m其中color/weight/dashArray作用于路径描边对应 Leaflet Path 选项fillColor作用于填充。更完整的选项可参考Point/MultiPointLeaflet Marker 选项其他几何类型Leaflet Path 与 Polyline 选项如fillOpacity、opacity、lineCap、lineJoin等。3.2 按属性条件样式由于style_function是逐要素调用的你可以根据feature[properties]中的任意属性做条件判断。例如把所有州名包含字母e的州填成绿色folium.GeoJson( geo_json_data, style_functionlambda feature: { fillColor: green if e in feature[properties][name].lower() else #ffff00, color: black, weight: 2, dashArray: 5, 5, }, ).add_to(m)3.3 样式函数的校验与性能优化源码会在初始化阶段对样式函数做严格校验_validate_function取data[features][0]作为测试样本要求函数可调用且返回值为dict否则抛出ValueErrorfolium/features.py#L792-L807。渲染时GeoJsonStyleMapperfolium/features.py#L867会把所有 feature 的样式结果预计算成style_mapstyle → feature id 列表的映射再在模板里生成一个基于switch(feature_identifier)的_styler函数folium/features.py#L546-L558即每个要素的样式在 Python 侧算好、前端仅做一次查表而非在浏览器里逐要素执行 Python 风格的回调。因此即使要素数量较多style_function的调用开销也集中发生在构建阶段。find_identifier会按以下优先级挑选唯一的 feature 标识folium/features.py#L809-L842所有 feature 都有唯一id→ 使用feature.id否则寻找 properties 中取值唯一的字符串/整型键 → 使用feature.properties.key再不行且embedTrue时自动为每个 feature 补一个feature[id] str(i)若embedFalse则抛出异常提示补id字段或改用embedTrue。3.4 用 style_function 快速做出准 choropleth文档指出条件填色看起来几乎就是一张 choropleth——只要为每个州计算一个颜色值就完成了向专题图的升级完整版见第四节。四、完整实战美国失业率 choropleth 图例4.1 加载统计数据import pandas unemployment pandas.read_csv( https://raw.githubusercontent.com/python-visualization/folium-example-data/main/us_unemployment_oct_2012.csv ) unemployment.head(5)仓库中对应的本地示例数据为 examples/data/US_Unemployment_Oct2012.csv格式为两列State,Unemployment如AL,7.1、AK,6.8可作为离线替代。更多官方示例还可参考 examples/GeoJSON_and_choropleth.ipynb。4.2 用 branca.colormap 构建色带folium.GeoJson本身不负责把数值映射成颜色这一步交给 branca 的linear序列色带。把失业率最小值到最大值线性映射到YlGn_09色带黄→绿共 9 级from branca.colormap import linear colormap linear.YlGn_09.scale( unemployment.Unemployment.min(), unemployment.Unemployment.max() ) print(colormap(5.0)) # 例如输出 #a6d96a 之类的十六进制颜色 colormapcolormap(x)接受一个数值返回#RRGGBB形式的十六进制颜色字符串在 Notebook 中直接输出colormap对象还会渲染出色带可视化。4.3 把数据表转成字典为了在样式函数里按 feature 快速取值把 DataFrame 转成以州代码为键、失业率为值的 Series其__getitem__行为类似字典unemployment_dict unemployment.set_index(State)[Unemployment] unemployment_dict[AL] # 7.14.4 组装 GeoJson LayerControlm folium.Map([43, -100], zoom_start4) folium.GeoJson( geo_json_data, nameunemployment, style_functionlambda feature: { fillColor: colormap(unemployment_dict[feature[id]]), color: black, weight: 1, dashArray: 5, 5, fillOpacity: 0.9, }, ).add_to(m) folium.LayerControl().add_to(m) m这里feature[id]即 GeoJSON 中的AL、AK等键正好与unemployment_dict的索引对齐nameunemployment让该图层出现在右上角 LayerControl 中可开关。4.5 提速预先生成颜色字典如果觉得在每次渲染时反复调用colormap(...)开销大可以一次性把字典算好样式函数只做查表color_dict {key: colormap(unemployment_dict[key]) for key in unemployment_dict.keys()} m folium.Map([43, -100], zoom_start4) folium.GeoJson( geo_json_data, style_functionlambda feature: { fillColor: color_dict[feature[id]], color: black, weight: 1, dashArray: 5, 5, fillOpacity: 0.9, }, ).add_to(m)这与源码中GeoJsonStyleMapper的预计算样式映射思路完全一致值→颜色的一次性计算放在 Python 侧前端只拿最终颜色。4.6 添加颜色图例branca的 colormap 对象本身是一个可挂到地图上的元素设置caption后add_to(m)即可显示带标题的图例条colormap.caption Unemployment color scale colormap.add_to(m) m4.7 循环中使用 style_function 的陷阱Late Binding Closure文档特别给出 Caveat在循环里直接使用style_function会命中 Python 的延迟绑定闭包late binding closure陷阱——循环变量在回调真正执行时才取值导致所有要素拿到同一个最后一个样式。常见的规避方法包括改用 GeoPandas 对象驱动用默认参数强制提前绑定实现提前闭包for geom, my_style in zip(geoms, my_styles): style my_style style_function lambda x, stylestyle: style folium.GeoJson( datageom, style_functionstyle_function, ).add_to(m)关于该陷阱的通用解释可参考 Python 官方风格指南中的 Late Binding Closures 一节。提示如果你想要更高阶、声明式的 choropleth 封装内置数据绑定、分箱、图例仓库还提供folium.Choropleth类folium/features.py#L1393它支持datacolumnskey_on的数据绑定与fill_color色带对应教程见 docs/user_guide/geojson/choropleth.md。本文聚焦的folium.GeoJson方案更自由适合样式逻辑复杂的场景。五、交互点击缩放与高亮5.1 zoom_on_click点击要素自动缩放m folium.Map([43, -100], zoom_start4) folium.GeoJson(geo_json_data, zoom_on_clickTrue).add_to(m) m开启后点击多边形会调用map.fitBounds(e.target.getBounds())缩放至该要素的包围盒对于点要素则用map.flyTo(e.target.getLatLng(), zoom)平滑飞至该点并至少放大一级folium/features.py#L632-L643。源码中的事件绑定位于_onEachFeature模板folium/features.py#L588-L645。5.2 highlight_function悬停高亮highlight_function与style_function签名相同但只在鼠标事件时生效m folium.Map([43, -100], zoom_start4) folium.GeoJson( geo_json_data, highlight_functionlambda feature: { fillColor: ( green if e in feature[properties][name].lower() else #ffff00 ), }, ).add_to(m) m模板中对应的实现为mouseover时调用_highlighter取高亮样式并setStylemouseout时resetStyle还原folium/features.py#L600-L615。文档还提到高亮样式会叠加在style_function之上——如果你没有定义style_functionLeaflet 会退回使用feature.properties.stylefolium/features.py#L671-L673。5.3 popup_keep_highlighted弹窗打开时保持高亮当图层同时带有弹窗与高亮函数时默认鼠标移出弹窗区域就会还原样式把popup_keep_highlighted设为True弹窗打开期间要素保持高亮m folium.Map([43, -100], zoom_start4) popup folium.GeoJsonPopup(fields[name]) folium.GeoJson( geo_json_data, highlight_functionlambda feature: { fillColor: ( green if e in feature[properties][name].lower() else #ffff00 ), }, popuppopup, popup_keep_highlightedTrue, ).add_to(m) m源码细节启用该选项后模板会额外注册popupopen重新应用高亮样式与popupclose还原样式并解绑弹窗两个事件folium/features.py#L616-L630mouseout时也先检查!e.target.isPopupOpen()再决定是否还原folium/features.py#L604-L607。六、弹窗与工具提示GeoJsonPopup 与 GeoJsonTooltip上面的例子使用了folium.GeoJsonPopup(fields[name])它能把每个要素的指定properties字段渲染成表格弹窗。相关类定义于 folium/features.py#L1247-L1390均继承自GeoJsonDetail基类常用参数参数默认值说明fields必填list/tuple要展示的 GeoJSONproperties键或 GeoDataFrame 列名aliasesNone与fields等长的显示别名不传则显示原始键名labelsTruePopup 同为True是否显示字段名/别名列localizeTooltip: False/Popup: True用 JStoLocaleString()格式化数字千分位等style各异内联 HTML 样式字符串作用于内容 divsticky仅 TooltipTrue工具提示是否跟随鼠标class_namefoliumtooltip/foliumpopup自定义 CSS 类名**kwargs—直接透传为 Leaflet Tooltip/Popup 选项GeoJsonDetail.render会校验字段是否真实存在于数据中否则抛断言错误并在渲染前对GeometryCollection几何类型给出警告建议改为 MultiPolygonfolium/features.py#L1185-L1200。一个带别名、样式与数字本地化的完整 Tooltip 示例folium.GeoJsonTooltip( fields[CNTY_NM, census-pop-2015, census-md-income-2015], aliases[County, 2015 Census Population, 2015 Median Income], localizeTrue, style( background-color: grey; color: white; font-family: courier new; font-size: 24px; padding: 10px; ), )Tooltip 需要add_toGeoJson 图层或作为tooltip参数传入Popup 同理二者都有对应的独立示例文档docs/user_guide/geojson/geojson_popup_and_tooltip.md 与 Notebook 示例 examples/GeoJsonPopupAndTooltip.ipynb。七、进一步阅读与仓库验证仓库源码主实现folium/features.pyGeoJson、GeoJsonStyleMapper、GeoJsonDetail、GeoJsonTooltip、GeoJsonPopup、TopoJson、Choropleth单元测试tests/test_features.py覆盖 GeoJson 数据识别、样式校验、bounds 计算等路径示例数据本地 GeoJSON tests/us-states.json、失业率 CSV examples/data/US_Unemployment_Oct2012.csv相关 Notebookexamples/GeoJSON_and_choropleth.ipynb、examples/GeoJsonPopupAndTooltip.ipynb、examples/Highlight_Function.ipynb配套文档docs/user_guide/geojson/geojson_advanced_on_each_feature.mdon_each_feature进阶用法、docs/user_guide/geojson/geojson_marker.mdPoint 要素 marker 定制、docs/user_guide/geojson/coordinate_ordering.md坐标顺序结语folium.GeoJson的价值在于把数据加载 → 样式映射 → 交互事件 → 专题可视化整条链路收敛在一个类中字符串/文件/URL/GeoPandas 四种数据入口有统一的process_data分发逐要素样式有style_function 预计算 style_map 的性能设计交互层则通过模板注入onEachFeature事件缩放、高亮、弹窗保持完成。以本文的失业率示例为模板替换数据与色带即可快速产出你自己的 choropleth 专题地图。赞分享数据可视化数据分析GIS【免费下载链接】foliumPython Data. Leaflet.js Maps.项目地址https://gitcode.com/gh_mirrors/fo/folium点击查看免费下载相关推荐Leaflet 使用 GeoJSON 图层渲染、样式定制与交互实战指南Leaflet 使用 GeoJSON 图层渲染、样式定制与交互实战指南 GeoJSON 是 GIS 领域最流行的矢量数据交换格式之一Leaflet 对其提供前端数据可视化GISclaude-plugins-community 的 eli5 技能拆解一个 SKILL.md 如何教 AI 做科普claude plugins community 的 eli5 技能拆解一个 SKILL.md 如何教 AI 做科普 在 claude plugins com数据可视化数据分析GISLeaflet 交互式 Choropleth 地图实战用 GeoJSON 打造美国各州人口密度可视化Leaflet 交互式 Choropleth 地图实战用 GeoJSON 打造美国各州人口密度可视化 本文以 Leaflet 官方教程《Interactive前端数据可视化GIS上一篇BokuLoader深度解析Cobalt Strike反射型加载器的终极免杀实践指南下一篇5个惊艳的react-anime动画示例让你的UI瞬间活起来创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考