Source code for pysepal.mapping.geojson_utils
"""Utility functions for creating GeoJSON layers."""
import json
from typing import Optional
import geopandas as gpd
from ipyleaflet import GeoJSON
from pysepal import color
from pysepal.frontend import styles as ss
__all__ = ["get_ipygeojson"]
[docs]
def get_ipygeojson(
gdf: gpd.GeoDataFrame,
name: str = "aoi",
style: Optional[dict] = None,
) -> GeoJSON:
"""Convert a GeoDataFrame into an ipyleaflet GeoJSON layer.
This is a standalone utility function that creates a GeoJSON layer from a
GeoDataFrame, suitable for display on an ipyleaflet Map.
Args:
gdf: The GeoDataFrame to convert to a GeoJSON layer.
name: The name to assign to the layer and as a property to features.
style: Optional style dictionary for the GeoJSON layer. If None, uses
the default AOI style with primary color. See ipyleaflet GeoJSON
documentation for style options.
Returns:
An ipyleaflet GeoJSON layer ready to be added to a Map.
Raises:
ValueError: If the GeoDataFrame is None or empty.
Example:
.. code-block:: python
import geopandas as gpd
from pysepal.mapping import get_ipygeojson, SepalMap
# Create a simple GeoDataFrame
gdf = gpd.read_file("my_shapefile.shp")
# Create the GeoJSON layer
geojson_layer = get_ipygeojson(gdf, name="my_layer")
# Add to map
m = SepalMap()
m.add_layer(geojson_layer)
"""
if gdf is None or gdf.empty:
raise ValueError("GeoDataFrame cannot be None or empty")
# Convert to regular GeoDataFrame to avoid issues with pygadm subclasses
# This is necessary because pygadm 0.5.3 has a bug with pandas 2.3+ where
# the __init__ method contains a DataFrame comparison that fails during
# geopandas' internal to_json() process.
gdf_plain = gpd.GeoDataFrame(gdf)
data = json.loads(gdf_plain.to_json())
# Add name as a property to each feature
for f in data["features"]:
f["properties"]["name"] = name
# Apply default style if not provided
if style is None:
style = json.loads((ss.JSON_DIR / "aoi.json").read_text())
style.update(color=color.primary, fillColor=color.primary)
# Create and return the GeoJSON layer
return GeoJSON(data=data, style=style, name=name)