Search code examples
pythonfoliumgoogle-earth-engine

Python Earth Engine Folium Map - Merge layers, mask land from layer, make tile translucent


I am trying to plot wind speed in v direction and wind speed in u direction on the oceans. The code below shows what i've done so far.

Is it possible to do the following?

  • overlay wind speed u and wind speed v so that we can see the sum of both wind directions at once? I tried wind_img_u+wind_img_v, but it doesn't work.
  • how can I show the wind speeds only on the oceans (so that I can still see the map of the lands).
  • make the layer/tile translucent. I tried setting the tile opacity=0.3, but it doesn't seem to work.

Thank you!

# -*- coding: utf-8 -*-
"""
Created on Fri Jul  1 10:04:39 2022

@author: xxx
"""

import ee

# Trigger the authentication flow.
ee.Authenticate()

# Initialize the library.
ee.Initialize()


wind = ee.ImageCollection('NOAA/GFS0P25')
i_date = '2022-06-30'
f_date = '2022-07-01'
# wind= ee.ImageCollection('ECMWF/ERA5/DAILY')

import folium


def add_ee_layer(self, ee_image_object, vis_params, name):
    """Adds a method for displaying Earth Engine image tiles to folium map."""
    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 &copy; <a href="https://earthengine.google.com/">Google Earth Engine</a>',
        name=name,
        overlay=True,
        control=True,
        opacity=0.3 ####THIS DOESN'T WORK
    ).add_to(self)

# Add Earth Engine drawing method to folium.
folium.Map.add_ee_layer = add_ee_layer

wind_img_u=wind.select('u_component_of_wind_10m_above_ground').filterDate(i_date,f_date).first()
wind_img_v=wind.select('v_component_of_wind_10m_above_ground').filterDate(i_date,f_date).first()
wind_img_u=wind_img_u+wind_img_v ####THIS DOESN'T WORK

# Set visualization parameters for land surface temperature.
wind_vis_params = {
    'min': -14, 'max': 14,
    'palette': ['orange', 'yellow', 'green', 'yellow', 'orange']}

ee_tiles_names = ['Wind Speed']

# Create a new map.
lat, lon = 45.77, 4.855
my_map = folium.Map(location=[lat, lon], zoom_start=5)

# Add layers to the map using a loop.
my_map.add_ee_layer(wind_img_u, wind_vis_params, 'Wind Speed U')
my_map.add_ee_layer(wind_img_v, wind_vis_params, 'Wind Speed V')

my_map.add_child(folium.LayerControl())
folium.LayerControl(collapsed = False).add_to(my_map)

my_map.save("c:/data/weather.html")
import webbrowser
webbrowser.open("c:/data/weather.html")

Solution

  • Different topics, here:

    • 1. Mathematical operations on a ee.Image

    There are different options to apply mathematical operations on images. In your case, you can just replace your sum by:

    wind_img_uv=wind_img_u.add(wind_img_v)
    

    by the way, you may find here an earth engine community tutorial involving many techniques to apply mathematical operations on images.

    • 2. Applying a mask over a region

    Masking around oceans can be tricky because many land cover datasets are masked in the middle of oceans or sea so the technique I propose is mayby not optimal but works. It consits in importing a dataset focusing on ocean/surface water properties and masking around it. See below:

    # Import a dataset focusing on oceans/surface water properties.
    # Surface water temperature for exampel:
    sst = ee.ImageCollection('NASA/OCEANDATA/MODIS-Aqua/L3SMI')\
        .select(['sst']).filterDate('2017-01-01', '2018-01-01')
    
    # Define the mask
    mask = sst.mean().gte(-10)
    
    #Apply the mask
    wind_img_uv = wind_img_uv.updateMask(mask)
    

    Then, don't forget to add the layer to your folium map with:

    # Add the updated layer.
    my_map.add_ee_layer(wind_img_uv, wind_vis_params, 'Wind Speed U+V')
    
    • 3. Modifying tiles opacity on a folium map

    For me passing the opacity in the add_ee_layer works well. So please check your install.