You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用folium.PolyLine填充闭合多边形的外部区域?

实现多边形外部区域填充的解决方案

仅用folium.PolyLine无法直接实现外部填充——它的填充逻辑默认是闭合线段的内部区域,没有内置的反转填充参数。要达成你要的外部填充效果,可以通过构造带洞的多边形来实现,具体步骤如下:

核心思路

创建一个覆盖整个地图可视范围的大多边形,将你现有的目标多边形作为这个大多边形的"洞"。这样填充大多边形时,洞的区域(即原目标多边形内部)会被保留,外部区域则被填充。

代码实现

import folium
import leafmap.foliumap as leafmap

# 假设你的目标多边形坐标是 coords(格式为 [(lat1, lon1), (lat2, lon2), ...])
# 转换坐标为 GeoJSON 要求的 [lon, lat] 格式
target_coords_geojson = [[lon, lat] for lat, lon in coords]

# 定义覆盖全球范围的大多边形坐标(可视范围可根据你的地图中心和缩放调整)
world_bounds = [
    [-180, 90], [180, 90], [180, -90], [-180, -90], [-180, 90]
]

# 初始化地图
m = leafmap.Map(
    layers_control=True,
    draw_control=False,
    measure_control=False,
    fullscreen_control=False,
    center=(map_center_x, map_center_y),
    zoom=z_start
)
m.add_basemap('OpenTopoMap')

# 添加带洞的填充多边形
folium.GeoJson(
    data={
        "type": "Feature",
        "geometry": {
            "type": "Polygon",
            "coordinates": [world_bounds, target_coords_geojson]
        }
    },
    style_function=lambda x: {
        "fillColor": "#D3D3D3",
        "color": "#00B0F0",
        "weight": line_weight,
        "fillOpacity": fill_opacity
    }
).add_to(m)

# 如需保留原目标多边形的边界线,可再添加一次 PolyLine
folium.PolyLine(
    locations=coords,
    color="#00B0F0",
    weight=line_weight
).add_to(m)

关键说明

  1. 坐标格式转换:folium 的 locations 参数是 (lat, lon),但 GeoJSON 要求的是 (lon, lat),所以需要做一次顺序转换。
  2. 多边形层级:GeoJSON 中,Polygon 的 coordinates 数组里,第一个元素是外环(大区域),后续元素是内环(洞),渲染时会自动排除洞的区域。
  3. 边界范围调整:如果你的地图只聚焦某个小区域,可以缩小 world_bounds 的范围,比如用地图当前的可视边界,避免不必要的大范围填充。

内容的提问来源于stack exchange,提问作者Stefø

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:29:58