Python GEE Folium风场绘制:图层合并、陆地掩膜、透明度问题
GEE+Folium 10m海洋风速分布图修复方案
核心问题对应修复逻辑
- 风速合成错误修复:u、v为风速的正交矢量分量,直接做算术加法不符合物理计算规则,合成风速标量值需通过公式 √(u² + v²) 计算,直接调用GEE内置的
hypot()方法即可完成模长计算。 - 海洋区域裁剪修复:加载全球高程数据集生成海洋掩膜,将风速图层的陆地区域像元设为透明,即可保留陆地区域底图正常显示,仅在海洋区域渲染风速图层。
- 半透明效果失效修复:部分版本Folium的TileLayer仅传入
opacity参数无法触发透明度渲染,需同时传入fillOpacity参数并设置相同透明度值即可生效。
修复后完整可运行代码
# -*- coding: utf-8 -*- import ee import folium import webbrowser # 初始化GEE ee.Authenticate() ee.Initialize() # 加载GFS风速数据集 wind_col = ee.ImageCollection('NOAA/GFS0P25') i_date = '2022-06-30' f_date = '2022-07-01' # 重写folium加载GEE图层方法,修复透明度问题 def add_ee_layer(self, ee_image_object, vis_params, name, opacity=0.3): map_id_dict = ee.Image(ee_image_object).getMapId(vis_params) folium.raster_layers.TileLayer( tiles=map_id_dict['tile_fetcher'].url_format, attr='Map Data © Google Earth Engine', name=name, overlay=True, control=True, opacity=opacity, fillOpacity=opacity # 新增该参数解决透明度不生效问题 ).add_to(self) folium.Map.add_ee_layer = add_ee_layer # 提取对应时次的u、v分量 wind_img_u = wind_col.select('u_component_of_wind_10m_above_ground').filterDate(i_date,f_date).first() wind_img_v = wind_col.select('v_component_of_wind_10m_above_ground').filterDate(i_date,f_date).first() # 1. 正确计算合成风速(矢量模长) wind_speed = wind_img_u.hypot(wind_img_v) # 2. 生成海洋掩膜,仅保留海洋区域的风速值 # 高程<=0的区域判定为海洋 ocean_mask = ee.Image('NOAA/NGDC/ETOPO1').select('bedrock').lte(0) wind_speed_ocean = wind_speed.updateMask(ocean_mask) # 风速可视化参数(合成风速为非负值,调整最小值为0) wind_vis_params = { 'min': 0, 'max': 20, 'palette': ['orange', 'yellow', 'green', 'yellow', 'orange'] } # 创建底图 lat, lon = 45.77, 4.855 my_map = folium.Map(location=[lat, lon], zoom_start=5) # 添加海洋风速图层,透明度0.3 my_map.add_ee_layer(wind_speed_ocean, wind_vis_params, '10m合成风速(海洋区域)', opacity=0.3) # 添加图层控制 folium.LayerControl(collapsed=False).add_to(my_map) # 保存并打开结果 save_path = "c:/data/weather.html" my_map.save(save_path) webbrowser.open(save_path)
补充说明
- 合成风速为标量值,不存在负数,因此可视化参数最小值设为0,最大值可根据研究区域实际风速范围调整。
- 如果需要展示风向而非单纯风速大小,可以替换为风羽图渲染逻辑,当前代码实现的是风速大小的填色渲染。
- 海洋掩膜采用ETOPO1地形数据生成,近岸区域如果存在精度问题,可以替换为更高分辨率的岸线数据集做掩膜。
内容的提问来源于stack exchange,提问作者bitterjam
相关产品推荐
相关产品推荐

