folium 矢量图层完全指南:PolyLine、Polygon、Rectangle、Circle/CircleMarker 与 ColorLine 实战详解

📅 发布时间:2026/9/29 2:26:55
folium 矢量图层完全指南:PolyLine、Polygon、Rectangle、Circle/CircleMarker 与 ColorLine 实战详解
数据可视化数据分析GIS【免费下载链接】foliumPython Data. Leaflet.js Maps.项目地址https://gitcode.com/gh_mirrors/fo/folium点击查看免费下载本篇指南以 folium 官方用户手册 docs/user_guide/vector_layers.rst 为骨架系统讲解其矢量图层模块的全部五种核心对象PolyLine折线、Polygon多边形、Rectangle矩形、Circle/CircleMarker圆形以及基于 FeatureGroup 的 ColorLine分段着色线。你将学会每种对象的坐标组织方式、全部可用的路径样式参数Path Options、平滑因子与日期变更线处理等高级技巧并能对照 folium/vector_layers.py 与 folium/features.py 中的源码实现理解参数背后的底层逻辑直接产出可运行的地图代码。概览五种矢量图层对象与对应源码folium 将 Leaflet 的矢量图层封装在folium.vector_layers与folium.features两个模块中。从 folium/vector_layers.py 的类定义可以看到清晰的对应关系folium 对象Leaflet 对应源码类位置坐标语义PolyLineL.polylinefolium/vector_layers.py一串[lat, lon]点或嵌套多组点形成多段线PolygonL.polygonfolium/vector_layers.py一串点自动闭合或嵌套多组点形成多多边形RectangleL.rectanglefolium/vector_layers.py仅两个对角坐标[lat1, lon1], [lat2, lon2]CircleL.circlefolium/vector_layers.py中心点 以米为单位的半径CircleMarkerL.circleMarkerfolium/vector_layers.py中心点 以像素为单位的半径ColorLine多个L.polyline的组合folium/features.py点位序列 每段的颜色值从源码的_template模板可见每个类在渲染时都会生成对应的 Leaflet JavaScript 调用例如PolyLine生成L.polyline(locations, options)Polygon生成L.polygon(...)Rectangle生成L.rectangle(...)等然后addTo(parent)挂载到地图上。这意味着 folium 文档中所有样式参数最终都会原样传递给 Leaflet 的 Path 选项掌握下面这份参数表就等于掌握了矢量图层的全部表现力。公共基础Path Options 路径样式参数所有矢量图层Polygon、Polyline、Circle、CircleMarker、Rectangle共享同一套路径样式选项由 folium/vector_layers.py 中的path_options()函数统一解析。该函数同时接受 snake_case 与 lowerCamelCase 两种写法内部通过camelize转换并有以下要点fill_color会覆盖fillFalse源码中当fill_color存在时强制fill True当fill_color缺省时才回落到fill参数默认False且此时fill_color默认取color的值。官方文档 Circle 示例中fillFalse被fill_colorgreen覆盖正是这个逻辑。smoothFactor与noClip仅对线状对象生效lineTrue分支PolyLine/Polygon/Rectangle 走此分支。其余未识别的参数会原样透传给 Leaflet从源码看interactive、pane、renderer、className、tags、gradient等选项都会被透传测试 tests/test_vector_layers.py 对此有专门验证如test_circle_marker_forwards_interactive。参数默认值说明strokeTrue是否沿路径绘制描边设为False可去掉多边形/圆形边框color#3388ff描边颜色weight3描边宽度像素opacity1.0描边透明度0–1line_capround线端形状butt、round、square对应 SVGstroke-linecapline_joinround转角连接形状mitter、round、bevel对应 SVGstroke-linejoindash_arrayNone虚线模式如5, 5、15, 10, 5, 10, 15dash_offsetNone虚线的起始偏移量fillFalse是否填充路径内部fill_color默认取color填充颜色fill_opacity0.2填充透明度fill_ruleevenodd内部区域判定规则bubbling_mouse_eventsTrue鼠标事件是否冒泡到地图smooth_factor1.0折线平滑因子仅线状对象no_clipFalse是否禁用折线裁剪仅线状对象Circle 与 CircleMarker像素半径与米制半径的取舍circle_and_circle_marker.md 的核心结论一句话可概括CircleMarker的半径以像素为单位Circle的半径以米为单位。因此CircleMarker在缩放时屏幕上大小不变而Circle始终贴合真实地理范围。结合源码看Circle的默认半径为50米CircleMarker的默认半径为10像素。官方示例circle_and_circle_marker.md演示了三者的差异import folium m folium.Map(location[-27.5717, -48.6256], zoom_start9) radius 50 folium.CircleMarker( location[-27.55, -48.8], radiusradius, colorcornflowerblue, strokeFalse, # 不绘制描边 fillTrue, # 开启填充 fill_opacity0.6, opacity1, popup{} pixels.format(radius), tooltipI am in pixels, ).add_to(m) radius 25 folium.CircleMarker( location[-27.35, -48.8], radiusradius, colorblack, weight3, # 3 像素宽的黑色描边 fillFalse, fill_opacity0.6, opacity1, ).add_to(m) radius 10000 folium.Circle( location[-27.551667, -48.478889], radiusradius, # 10000 米 colorblack, weight1, fill_opacity0.6, opacity1, fill_colorgreen, fillFalse, # 注意会被 fill_color 覆盖为 True popup{} meters.format(radius), tooltipI am in meters, ).add_to(m) m使用要点需要地图缩放时保持标记大小稳定如点状标注选CircleMarker需要表达真实地理范围如 10 公里缓冲区选Circle源码注释指出Circle是真实圆的近似越靠近两极投影变形导致的偏差越大Circle与CircleMarker都继承自folium.map.Marker见 folium/vector_layers.py因此也支持popup、tooltip以及 Marker 相关能力。PolyLine 折线坐标组织、样式与平滑PolyLine 文档 是矢量图层章节篇幅最大的部分覆盖了从入门到进阶的四个主题。基础用法大圆航线示例官方示例使用波士顿到旧金山的大圆航线上 15 个坐标点import folium # Coordinates are 15 points on the great circle from Boston to San Francisco. coordinates [ [42.3581, -71.0636], [42.82995815, -74.78991444], [43.17929819, -78.56603306], [43.40320216, -82.37774519], [43.49975489, -86.20965845], [43.46811941, -90.04569087], [43.30857071, -93.86961818], [43.02248456, -97.66563267], [42.61228259, -101.41886832], [42.08133868, -105.11585198], [41.4338549, -108.74485069], [40.67471747, -112.29609954], [39.8093434, -115.76190821], [38.84352776, -119.13665678], [37.7833, -122.4167], ] # Create the map and add the line m folium.Map(location[41.9, -97.3], zoom_start4) folium.PolyLine( locationscoordinates, color#FF0000, weight5, tooltipFrom Boston to San Francisco, ).add_to(m) mlocations接受形如[[lat, lon], ...]或[(lat, lon), ...]的点序列。源码中PolyLine通过validate_multi_locations校验坐标因此既支持扁平的二维点表也支持嵌套的三维点表多段线。平滑因子smoothing / smooth_factorLeaflet 中的 PolyLine 默认开启平滑简化移除部分点以减轻浏览器绘制负担平滑程度由smooth_factor控制。官方示例将smooth_factor设为 50形成夸张的平滑效果m folium.Map(location[41.9, -97.3], zoom_start4) folium.PolyLine( smooth_factor50, locationscoordinates, colorgrey, tooltipToo much smoothing?, weight5, ).add_to(m) m源码层面path_options(lineTrue, **kwargs)会取出smoothFactor默认1.0与noClip默认False放入extra_optionsfolium/vector_layers.py。文档对smooth_factor的语义描述是每个缩放级别上对折线的简化程度——值越大性能越好、外观越平滑值越小表示越精确。相关主题还可参考 docs/user_guide/geojson/smoothing.md其中说明该参数同样适用于 GeoJson、TopoJson 和 ChoroplethLeaflet 默认值为 1且没有上下界限制。跨越日期变更线Crossing the date line这是 PolyLine 最容易踩坑的场景。官方文档用四条线对比了正确与错误的经度写法lon lat 0 zoom_start 1 m folium.Map(location[lat, lon], zoom_startzoom_start) kw {opacity: 1.0, weight: 6} # 错误179 → -179Leaflet 会沿 0° 经线方向“绕远路”绘制 folium.PolyLine( locations[(2, 179), (2, -179)], tooltipWrong, colorred, line_capround, **kw, ).add_to(m) # 正确用 179 → 181 表达跨越 180° 经线 folium.PolyLine( locations[(-2, 179), (-2, 181)], tooltipCorrect, line_capbutt, colorblue, **kw, ).add_to(m) # 正确用 -179 → 179 表达跨越 -180° 经线 folium.PolyLine( locations[(-6, -179), (-6, 179)], line_capsquare, colorgreen, tooltipCorrect, **kw, ).add_to(m) # 边界情况超出 180 太多190°会产生意外结果 folium.PolyLine( locations[(12, -179), (12, 190)], colororange, tooltipArtifact?, **kw, ).add_to(m) m核心规则当一条线需要跨越国际日期变更线时不应使用 −179 → 179 这样的“反向”坐标对而应使用 179 → 181 或 −179 → −181 这样单调递增/递减的经度让 Leaflet 沿最短路径绘制。此示例还展示了line_cap三种取值round、butt、square的视觉差异。多段线Multi-PolyLine通过向单个PolyLine传入多组坐标三维列表可以一次创建多条独立的线lat 38.89399 lon -77.03659 zoom_start 17 m folium.Map(location[lat, lon], zoom_startzoom_start) kw {color: red, fill: True, radius: 20} folium.CircleMarker([38.89415, -77.03738], **kw).add_to(m) folium.CircleMarker([38.89415, -77.03578], **kw).add_to(m) locations [ [ (38.893596444352134, -77.03814983367920), (38.893379333722040, -77.03792452812195), ], [ (38.893379333722040, -77.03792452812195), (38.893162222428310, -77.03761339187622), ], [ (38.893162222428310, -77.03761339187622), (38.893028615148424, -77.03731298446655), ], [ (38.893028615148424, -77.03731298446655), (38.892920059048464, -77.03691601753235), ], [ (38.892920059048464, -77.03691601753235), (38.892903358095296, -77.03637957572937), ], [ (38.892903358095296, -77.03637957572937), (38.893011914220770, -77.03592896461487), ], [ (38.893011914220770, -77.03592896461487), (38.893162222428310, -77.03549981117249), ], [ (38.893162222428310, -77.03549981117249), (38.893404384982480, -77.03514575958252), ], [ (38.893404384982480, -77.03514575958252), (38.893596444352134, -77.03496336936950), ], ] folium.PolyLine( locationslocations, colororange, weight8, opacity1, smooth_factor0, # 关闭平滑保留全部顶点 ).add_to(m) m此例同时展示了smooth_factor0的用法——完全关闭简化保证高精度细节常用于要求顶点无丢失的路径展示。测试 tests/test_vector_layers.py 中的test_mulyipolyline对多段线渲染进行了验证。Polygon 多边形单多边形与多多边形Polygon 文档 包含两种用法普通多边形与带洞的多个多边形。普通多边形官方示例在东京绘制一个五边形区域并展示了填充参数的组合import folium m folium.Map(location[35.67, 139.78], zoom_start13) locations [ [35.6762, 139.7795], [35.6718, 139.7831], [35.6767, 139.7868], [35.6795, 139.7824], [35.6787, 139.7791], ] folium.Polygon( locationslocations, colorblue, weight6, fill_colorred, fill_opacity0.5, fillTrue, popupTokyo, Japan, tooltipClick me!, ).add_to(m) m注意Polygon 的坐标无需重复首尾点Leaflet 会自动闭合文档与源码 docstring 都明确说明了这一点folium/vector_layers.py。多多边形Multi-Polygon传入三维坐标列表即可一次绘制多个多边形每个子列表代表一个独立环locations [ [ [7.577794326946673, 8.998503901433935], [7.577851434795945, 8.998572430673164], [7.577988491475764, 8.998652380403087], [7.578105560723088, 8.998426807051544], [7.577891409660878, 8.998289750371725], [7.577794326946673, 8.998503901433935], ], [ [7.578139824893071, 8.999291979141560], [7.578359687549607, 8.999414759083890], [7.578456769364435, 8.999266281014116], [7.578471046101925, 8.999197181604700], [7.578247331649095, 8.999094883721964], [7.578139824893071, 8.99929197914156], ], [ [7.577851730672876, 8.997811268775080], [7.578012579816743, 8.997460464828633], [7.577798113991832, 8.997311104523930], [7.577667902951418, 8.997663440915119], [7.577851730672876, 8.997811268775080], ], [ [7.578562417221803, 8.999551816663029], [7.578688052511666, 8.999654609172921], [7.578813688700849, 8.999443313458185], [7.578670920426703, 8.999369073523950], [7.578562417221803, 8.999551816663029], ], [ [7.577865711533433, 8.998252059784761], [7.577989601239152, 8.998002756022402], [7.577648754586391, 8.997784460884190], [7.577545911714481, 8.998069316645683], [7.577865711533433, 8.998252059784761], ], ] m folium.Map(location[7.577798113991832, 8.997311104523930], zoom_start16) folium.Polygon( locationslocations, smooth_factor2, colorcrimson, no_clipTrue, tooltipHi there!, ).add_to(m) m此例同时演示了no_clipTrue源码中noClip属于线状对象专属选项folium/vector_layers.py设为True可禁用 Leaflet 对超出视口区域的裁剪行为。Rectangle 矩形bounds、线帽与虚线样式Rectangle 文档 展示了矩形图层的核心特征——只用两个对角坐标bounds定义范围并横向对比了三种line_join与三种虚线模式import folium m folium.Map(location[35.685, 139.76], zoom_start15) kw { color: blue, line_cap: round, fill: True, fill_color: red, weight: 5, popup: Tokyo, Japan, tooltip: strongClick me!/strong, } folium.Rectangle( bounds[[35.681, 139.766], [35.691, 139.776]], line_joinround, dash_array5, 5, **kw, ).add_to(m) dx 0.012 folium.Rectangle( bounds[[35.681, 139.766 - dx], [35.691, 139.776 - dx]], line_joinmitter, dash_array5, 10, **kw, ).add_to(m) folium.Rectangle( bounds[[35.681, 139.766 - 2 * dx], [35.691, 139.7762 - 2 * dx]], line_joinbevel, dash_array15, 10, 5, 10, 15, **kw, ).add_to(m) m要点bounds必须恰好包含两个[lat, lon]点源码中Rectangle.__init__通过assert len(self.locations) 2强制校验传入数量错误会直接抛异常folium/vector_layers.pyline_join的可选值为mitter、round、bevel示例中分别展示对应 SVGstroke-linejoindash_array可设置复杂的多段虚线模式如15, 10, 5, 10, 15表示 15 长线、10 空、5 短线、10 空、15 长线的循环tooltip支持 HTML 字符串示例中使用了strongClick me!/strongtooltip 与 popup 的具体机制可参考 docs/user_guide/ui_elements/popups.md。ColorLine按数值分段着色的折线ColorLine 文档 介绍了一个矢量图层中非常实用的扩展对象——根据每个线段的数值给整条折线着色。官方示例用 NumPy 生成圆形轨迹并附上随角度变化的颜色值import numpy as np import folium x np.linspace(0, 2 * np.pi, 300) lats 20 * np.cos(x) lons 20 * np.sin(x) colors np.sin(5 * x) m folium.Map([0, 0], zoom_start3) color_line folium.ColorLine( positionslist(zip(lats, lons)), colorscolors, colormap[y, orange, r], weight10, ).add_to(m) m从源码实现看ColorLine继承自folium.map.FeatureGroupfolium/features.py其工作原理是positions中的相邻点对组成一条条线段colors的取值与线段一一对应长度必须等于len(positions) - 1根据colormap把每个颜色值映射为具体颜色不传时默认使用[green, yellow, red]的 LinearColormap若传入 list/tuple 则由 branca 自动构造LinearColormap也可直接传入现成的LinearColormap或StepColormap对象映射的色阶由nb_steps默认 12离散化最终把相同颜色的相邻线段合并为每种颜色生成一个PolyLine子对象挂载到 FeatureGroup 上。因此ColorLine实际上是“多个着色 PolyLine 的组合”适合表达海拔、温度、流量等沿路径连续变化的数值字段。weight线宽默认 2与opacity透明度默认 1控制所有子线段的外观。实战小结与测试佐证选型屏幕恒定大小用CircleMarker地理真实范围用Circle单条路径用PolyLine闭合区域用Polygon规则区域框选用Rectangle数值渐变路径用ColorLine。公共参数所有对象共享 path_options 的样式体系支持 snake_case 与 lowerCamelCase 两种写法fill_color会强制开启填充。坐标校验folium 在folium/utilities.py中通过validate_locations/validate_multi_locations对坐标做规范化校验非法输入会在 Python 侧直接报错而非生成坏地图。测试验证仓库测试 tests/test_vector_layers.py 覆盖了 Circle、CircleMarker、Rectangle、Polygon、PolyLine 与多段线的渲染以及 Path 选项 camelCase 转换与额外 Leaflet 选项透传行为可作为参数行为的第一手参考。将上述示例在 Jupyter Notebook 中运行m直接输出交互地图即可逐一验证每种图层在缩放、悬停与点击时的真实表现。若需将矢量图层与 GeoJSON 数据结合使用如 Choropleth 分级着色可继续阅读 docs/user_guide/geojson/geojson.md 与 docs/user_guide/geojson/choropleth.md。赞分享数据可视化数据分析GIS【免费下载链接】foliumPython Data. Leaflet.js Maps.项目地址https://gitcode.com/gh_mirrors/fo/folium点击查看免费下载相关推荐如何使用react-google-maps覆盖层组件Circle、Polygon、Rectangle和Polyline完全指南如何使用react google maps覆盖层组件Circle、Polygon、Rectangle和Polyline完全指南 react google ma前端INV-XXX-N: Short titleINV XXX N: Short title Status: proposed | locked Statement: One sentence. MUST N数据可视化数据分析GISfolium PolyLine 完全指南在 Leaflet 地图上绘制与优化折线的实战教程folium PolyLine 完全指南在 Leaflet 地图上绘制与优化折线的实战教程 本文以 folium 的 PolyLine 向量图层为核心系统讲数据可视化数据分析GIS上一篇simplebank数据库迁移从零构建版本化Schema变更流程下一篇Openaibot性能优化技巧10个提升机器人响应速度的方法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考