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

如何实现Folium地图中GeoJSON边界外区域的遮罩效果

Folium实现GeoJSON边界外区域遮罩的方案

该功能可以实现,核心逻辑是创建带镂空的全局遮罩层,覆盖目标边界外的所有地图区域。

实现步骤

  • 构造覆盖全球范围的面要素
  • 用你的目标GeoJSON边界对全球面做差集运算,得到边界外的所有区域
  • 将差集结果作为遮罩层添加到Folium地图,设置对应的遮罩样式即可突出边界内的元素

修改后完整代码示例

import folium
import geopandas as gpd
from shapely.geometry import Polygon

# 读入目标边界GeoJSON
boundary = gpd.read_file("Myfile.geojson")
# 构造全球范围基础面
world_poly = Polygon([[-180, 90], [180, 90], [180, -90], [-180, -90], [-180, 90]])
# 求差集得到边界外的遮罩区域
mask_area = gpd.GeoDataFrame(
    {'geometry': [world_poly.difference(boundary.unary_union)]}, 
    crs=boundary.crs
)

# 原边界样式
style1 = {
    'fillColor': '#228B22', 
    'color': '#FFFFFF',
    'fillOpacity': '.6',
    'opacity':'0', 
    'stroke':'False'
}
# 遮罩层样式,可按需调整颜色、透明度
mask_style = {
    'fillColor': '#000000', 
    'color': 'none',
    'fillOpacity': 0.7,
    'stroke': False
}

m = folium.Map(
    location=[34.02571149, -118.366837957],
    tiles="Stamen Toner",
    zoom_start=11
)
# 先添加原边界层
folium.GeoJson("Myfile.geojson", name="geojson", style_function=lambda x:style1).add_to(m)
# 再添加遮罩层
folium.GeoJson(mask_area, style_function=lambda x: mask_style).add_to(m)
folium.LayerControl().add_to(m)

m.save("index.html")
m

无额外依赖的简化方案

如果你不想安装geopandas、shapely依赖,且目标GeoJSON是单个多边形结构,可以手动构造带洞的GeoJSON对象,将全球面坐标作为外环、目标边界坐标作为内环传入即可,无需额外运算。

内容的提问来源于stack exchange,提问作者J. Alexander

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:39:04