如何实现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
相关产品推荐
相关产品推荐

