Skip to content

ee_tile_layers module

Tile layers that show EE objects.

EEFoliumTileLayer (TileLayer)

A Folium raster TileLayer that shows an EE object.

Source code in geemap/ee_tile_layers.py
class EEFoliumTileLayer(folium.raster_layers.TileLayer):
    """A Folium raster TileLayer that shows an EE object."""

    def __init__(
        self,
        ee_object: Union[
            ee.Geometry, ee.Feature, ee.FeatureCollection, ee.Image, ee.ImageCollection
        ],
        vis_params: Optional[Dict[str, Any]] = None,
        name: str = "Layer untitled",
        shown: bool = True,
        opacity: float = 1.0,
        **kwargs: Any,
    ):
        """Initialize the folium tile layer.

        Args:
            ee_object (Union[ee.Geometry, ee.Feature, ee.FeatureCollection,
                ee.Image, ee.ImageCollection]): The object to add to the map.
            vis_params (Optional[Dict[str, Any]]): The visualization parameters.
                Defaults to None.
            name (str, optional): The name of the layer. Defaults to 'Layer untitled'.
            shown (bool, optional): A flag indicating whether the layer should
                be on by default. Defaults to True.
            opacity (float, optional): The layer's opacity represented as a
                number between 0 and 1. Defaults to 1.
        """
        self.url_format = _get_tile_url_format(
            ee_object, _validate_vis_params(vis_params)
        )
        super().__init__(
            tiles=self.url_format,
            attr="Google Earth Engine",
            name=name,
            overlay=True,
            control=True,
            show=shown,
            opacity=opacity,
            max_zoom=24,
            **kwargs,
        )

__init__(self, ee_object, vis_params=None, name='Layer untitled', shown=True, opacity=1.0, **kwargs) special

Initialize the folium tile layer.

Parameters:

Name Type Description Default
ee_object Union[ee.Geometry, ee.Feature, ee.FeatureCollection, ee.Image, ee.ImageCollection]

The object to add to the map.

required
vis_params Optional[Dict[str, Any]]

The visualization parameters. Defaults to None.

None
name str

The name of the layer. Defaults to 'Layer untitled'.

'Layer untitled'
shown bool

A flag indicating whether the layer should be on by default. Defaults to True.

True
opacity float

The layer's opacity represented as a number between 0 and 1. Defaults to 1.

1.0
Source code in geemap/ee_tile_layers.py
def __init__(
    self,
    ee_object: Union[
        ee.Geometry, ee.Feature, ee.FeatureCollection, ee.Image, ee.ImageCollection
    ],
    vis_params: Optional[Dict[str, Any]] = None,
    name: str = "Layer untitled",
    shown: bool = True,
    opacity: float = 1.0,
    **kwargs: Any,
):
    """Initialize the folium tile layer.

    Args:
        ee_object (Union[ee.Geometry, ee.Feature, ee.FeatureCollection,
            ee.Image, ee.ImageCollection]): The object to add to the map.
        vis_params (Optional[Dict[str, Any]]): The visualization parameters.
            Defaults to None.
        name (str, optional): The name of the layer. Defaults to 'Layer untitled'.
        shown (bool, optional): A flag indicating whether the layer should
            be on by default. Defaults to True.
        opacity (float, optional): The layer's opacity represented as a
            number between 0 and 1. Defaults to 1.
    """
    self.url_format = _get_tile_url_format(
        ee_object, _validate_vis_params(vis_params)
    )
    super().__init__(
        tiles=self.url_format,
        attr="Google Earth Engine",
        name=name,
        overlay=True,
        control=True,
        show=shown,
        opacity=opacity,
        max_zoom=24,
        **kwargs,
    )

EELeafletTileLayer (TileLayer)

An ipyleaflet TileLayer that shows an EE object.

Source code in geemap/ee_tile_layers.py
class EELeafletTileLayer(ipyleaflet.TileLayer):
    """An ipyleaflet TileLayer that shows an EE object."""

    EE_TYPES = (
        ee.Geometry,
        ee.Feature,
        ee.FeatureCollection,
        ee.Image,
        ee.ImageCollection,
    )

    def __init__(
        self,
        ee_object: Union[
            ee.Geometry, ee.Feature, ee.FeatureCollection, ee.Image, ee.ImageCollection
        ],
        vis_params: Optional[Dict[str, Any]] = None,
        name: str = "Layer untitled",
        shown: bool = True,
        opacity: float = 1.0,
        **kwargs: Any,
    ):
        """Initialize the ipyleaflet tile layer.

        Args:
            ee_object (Union[ee.Geometry, ee.Feature, ee.FeatureCollection,
                ee.Image, ee.ImageCollection]): The object to add to the map.
            vis_params (Optional[Dict[str, Any]]): The visualization parameters.
                Defaults to None.
            name (str, optional): The name of the layer. Defaults to 'Layer untitled'.
            shown (bool, optional): A flag indicating whether the layer should
                be on by default. Defaults to True.
            opacity (float, optional): The layer's opacity represented as a
                number between 0 and 1. Defaults to 1.
        """
        self._ee_object = ee_object
        self.url_format = _get_tile_url_format(
            ee_object, _validate_vis_params(vis_params)
        )
        super().__init__(
            url=self.url_format,
            attribution="Google Earth Engine",
            name=name,
            opacity=opacity,
            visible=shown,
            max_zoom=24,
            **kwargs,
        )

    @lru_cache()
    def _calculate_vis_stats(
        self,
        *,
        bounds: Union[ee.Geometry, ee.Feature, ee.FeatureCollection],
        bands: Tuple[str, ...],
    ) -> Tuple[float, float, float, float]:
        """Calculate stats used for visualization parameters.

        Stats are calculated consistently with the Code Editor visualization parameters,
        and are cached to avoid recomputing for the same bounds and bands.

        Args:
            bounds (Union[ee.Geometry, ee.Feature, ee.FeatureCollection]): The
                bounds to sample.
            bands (Tuple[str, ...]): The bands to sample.

        Returns:
            Tuple[float, float, float, float]: The minimum, maximum, standard
                deviation, and mean values across the specified bands.
        """
        stat_reducer = (
            ee.Reducer.minMax()
            .combine(ee.Reducer.mean().unweighted(), sharedInputs=True)
            .combine(ee.Reducer.stdDev(), sharedInputs=True)
        )

        stats = (
            self._ee_object.select(bands)
            .reduceRegion(
                reducer=stat_reducer,
                geometry=bounds,
                bestEffort=True,
                maxPixels=10_000,
                crs="SR-ORG:6627",
                scale=1,
            )
            .getInfo()
        )

        mins, maxs, stds, means = [
            {v for k, v in stats.items() if k.endswith(stat) and v is not None}
            for stat in ("_min", "_max", "_stdDev", "_mean")
        ]
        if any(len(vals) == 0 for vals in (mins, maxs, stds, means)):
            raise ValueError("No unmasked pixels were sampled.")

        min_val = min(mins)
        max_val = max(maxs)
        std_dev = sum(stds) / len(stds)
        mean = sum(means) / len(means)

        return (min_val, max_val, std_dev, mean)

    def calculate_vis_minmax(
        self,
        *,
        bounds: Union[ee.Geometry, ee.Feature, ee.FeatureCollection],
        bands: Optional[List[str]] = None,
        percent: Optional[float] = None,
        sigma: Optional[float] = None,
    ) -> Tuple[float, float]:
        """Calculate the min and max clip values for visualization.

        Args:
            bounds (Union[ee.Geometry, ee.Feature, ee.FeatureCollection]): The bounds to sample.
            bands (Optional[List[str]]): The bands to sample. If None, all bands are used.
            percent (Optional[float]): The percent to use when stretching.
            sigma (Optional[float]): The number of standard deviations to use when stretching.

        Returns:
            Tuple[float, float]: The minimum and maximum values to clip to.
        """
        bands = self._ee_object.bandNames() if bands is None else tuple(bands)
        try:
            min_val, max_val, std, mean = self._calculate_vis_stats(
                bounds=bounds, bands=bands
            )
        except ValueError:
            return (0, 0)

        if sigma is not None:
            stretch_min = mean - sigma * std
            stretch_max = mean + sigma * std
        elif percent is not None:
            x = (max_val - min_val) * (1 - percent)
            stretch_min = min_val + x
            stretch_max = max_val - x
        else:
            stretch_min = min_val
            stretch_max = max_val

        return (stretch_min, stretch_max)

__init__(self, ee_object, vis_params=None, name='Layer untitled', shown=True, opacity=1.0, **kwargs) special

Initialize the ipyleaflet tile layer.

Parameters:

Name Type Description Default
ee_object Union[ee.Geometry, ee.Feature, ee.FeatureCollection, ee.Image, ee.ImageCollection]

The object to add to the map.

required
vis_params Optional[Dict[str, Any]]

The visualization parameters. Defaults to None.

None
name str

The name of the layer. Defaults to 'Layer untitled'.

'Layer untitled'
shown bool

A flag indicating whether the layer should be on by default. Defaults to True.

True
opacity float

The layer's opacity represented as a number between 0 and 1. Defaults to 1.

1.0
Source code in geemap/ee_tile_layers.py
def __init__(
    self,
    ee_object: Union[
        ee.Geometry, ee.Feature, ee.FeatureCollection, ee.Image, ee.ImageCollection
    ],
    vis_params: Optional[Dict[str, Any]] = None,
    name: str = "Layer untitled",
    shown: bool = True,
    opacity: float = 1.0,
    **kwargs: Any,
):
    """Initialize the ipyleaflet tile layer.

    Args:
        ee_object (Union[ee.Geometry, ee.Feature, ee.FeatureCollection,
            ee.Image, ee.ImageCollection]): The object to add to the map.
        vis_params (Optional[Dict[str, Any]]): The visualization parameters.
            Defaults to None.
        name (str, optional): The name of the layer. Defaults to 'Layer untitled'.
        shown (bool, optional): A flag indicating whether the layer should
            be on by default. Defaults to True.
        opacity (float, optional): The layer's opacity represented as a
            number between 0 and 1. Defaults to 1.
    """
    self._ee_object = ee_object
    self.url_format = _get_tile_url_format(
        ee_object, _validate_vis_params(vis_params)
    )
    super().__init__(
        url=self.url_format,
        attribution="Google Earth Engine",
        name=name,
        opacity=opacity,
        visible=shown,
        max_zoom=24,
        **kwargs,
    )

calculate_vis_minmax(self, *, bounds, bands=None, percent=None, sigma=None)

Calculate the min and max clip values for visualization.

Parameters:

Name Type Description Default
bounds Union[ee.Geometry, ee.Feature, ee.FeatureCollection]

The bounds to sample.

required
bands Optional[List[str]]

The bands to sample. If None, all bands are used.

None
percent Optional[float]

The percent to use when stretching.

None
sigma Optional[float]

The number of standard deviations to use when stretching.

None

Returns:

Type Description
Tuple[float, float]

The minimum and maximum values to clip to.

Source code in geemap/ee_tile_layers.py
def calculate_vis_minmax(
    self,
    *,
    bounds: Union[ee.Geometry, ee.Feature, ee.FeatureCollection],
    bands: Optional[List[str]] = None,
    percent: Optional[float] = None,
    sigma: Optional[float] = None,
) -> Tuple[float, float]:
    """Calculate the min and max clip values for visualization.

    Args:
        bounds (Union[ee.Geometry, ee.Feature, ee.FeatureCollection]): The bounds to sample.
        bands (Optional[List[str]]): The bands to sample. If None, all bands are used.
        percent (Optional[float]): The percent to use when stretching.
        sigma (Optional[float]): The number of standard deviations to use when stretching.

    Returns:
        Tuple[float, float]: The minimum and maximum values to clip to.
    """
    bands = self._ee_object.bandNames() if bands is None else tuple(bands)
    try:
        min_val, max_val, std, mean = self._calculate_vis_stats(
            bounds=bounds, bands=bands
        )
    except ValueError:
        return (0, 0)

    if sigma is not None:
        stretch_min = mean - sigma * std
        stretch_max = mean + sigma * std
    elif percent is not None:
        x = (max_val - min_val) * (1 - percent)
        stretch_min = min_val + x
        stretch_max = max_val - x
    else:
        stretch_min = min_val
        stretch_max = max_val

    return (stretch_min, stretch_max)