Layer Groups¶
The REST API allows you to create and modify layer groups in GeoServer.
Note:
You can find the official example at https://docs.geoserver.org/2.25.x/en/user/rest/layergroups.html
In [1]:
Copied!
from pathlib import Path
from geoserver import GeoServer
from pathlib import Path
from geoserver import GeoServer
GeoServer Connection¶
Connect to the running GeoServer instance and create a workspace and a store.
In [2]:
Copied!
# Setup the geoserver instance
geoserver = GeoServer(
service_url="http://localhost:8080/geoserver",
username="admin",
password="geoserver",
)
# Setup the geoserver instance
geoserver = GeoServer(
service_url="http://localhost:8080/geoserver",
username="admin",
password="geoserver",
)
Let's clean up existing layer groups before we start.
In [3]:
Copied!
if geoserver.workspace_exists("demo"):
geoserver.delete_workspace("demo", recurse=True)
geoserver.create_workspace_from_name("demo")
if geoserver.workspace_exists("demo"):
geoserver.delete_workspace("demo", recurse=True)
geoserver.create_workspace_from_name("demo")
Out[3]:
'Created'
Config¶
We'll set up the configuration for the notebook:
In [4]:
Copied!
# Directory containing sample data
DATA_DIR = Path("../tests/data")
assert DATA_DIR.exists(), f"The directory {DATA_DIR} does not exist."
# Directory containing sample data
DATA_DIR = Path("../tests/data")
assert DATA_DIR.exists(), f"The directory {DATA_DIR} does not exist."
Listing layer groups¶
To list all layer groups, use the get_layer_groups
method.
In [5]:
Copied!
geoserver.get_layer_groups(workspace="demo")
geoserver.get_layer_groups(workspace="demo")
Out[5]:
{'layerGroups': ''}
Creating a layer group¶
To create a layer group, use the create_layer_group
method.
First, make sure you have setup the layers you want to include in the layer group.
In [6]:
Copied!
# Add a coverage store
file_path = DATA_DIR / "rasters" / "raster.tif"
assert file_path.exists(), f"File not found: {file_path.as_posix()!r}"
geoserver.upload_coverage_store(file=file_path, workspace="demo", format="geotiff")
# Add a vector store
file_path = DATA_DIR / "vectors" / "buildings.shp"
assert file_path.exists(), f"File not found: {file_path.as_posix()!r}"
geoserver.upload_data_store(file=file_path, workspace="demo", format="shp")
# Add a coverage store
file_path = DATA_DIR / "rasters" / "raster.tif"
assert file_path.exists(), f"File not found: {file_path.as_posix()!r}"
geoserver.upload_coverage_store(file=file_path, workspace="demo", format="geotiff")
# Add a vector store
file_path = DATA_DIR / "vectors" / "buildings.shp"
assert file_path.exists(), f"File not found: {file_path.as_posix()!r}"
geoserver.upload_data_store(file=file_path, workspace="demo", format="shp")
Out[6]:
'Created'
In [7]:
Copied!
# Using XML format
body = """
<layerGroup>
<name>my_group</name>
<layers>
<layer>buildings</layer>
<layer>raster</layer>
</layers>
<styles>
<style>polygon</style>
<style>raster</style>
</styles>
</layerGroup>
"""
geoserver.create_layer_group(body=body, workspace="demo")
# Using XML format
body = """
my_group
buildings
raster
"""
geoserver.create_layer_group(body=body, workspace="demo")
Out[7]:
'Created'
Retrieving a layer group¶
To retrieve a layer group, use the get_layer_group
method.
In [8]:
Copied!
geoserver.get_layer_group(name="my_group", workspace="demo")
geoserver.get_layer_group(name="my_group", workspace="demo")
Out[8]:
{'layerGroup': {'name': 'my_group', 'mode': 'SINGLE', 'workspace': {'name': 'demo'}, 'publishables': {'published': [{'@type': 'layer', 'name': 'demo:buildings', 'href': 'http://localhost:8080/geoserver/rest/workspaces/demo/layers/buildings.json'}, {'@type': 'layer', 'name': 'demo:raster', 'href': 'http://localhost:8080/geoserver/rest/workspaces/demo/layers/raster.json'}]}, 'styles': {'style': [{'name': 'polygon', 'href': 'http://localhost:8080/geoserver/rest/styles/polygon.json'}, {'name': 'raster', 'href': 'http://localhost:8080/geoserver/rest/styles/raster.json'}]}, 'bounds': {'minx': -1.514093836, 'maxx': -1.508900084, 'miny': 48.63391919, 'maxy': 48.638064247, 'crs': {'@class': 'org.geotools.referencing.crs.DefaultEngineeringCRS', '$': 'EPSG:404000'}}, 'dateCreated': '2024-06-12 22:31:31.591 UTC'}}
Changing a layer group¶
To update a layer group, use the update_layer_group
method.
In [9]:
Copied!
# Using XML format
body = """
<layerGroup>
<name>my_group</name>
<layers>
<layer>buildings</layer>
</layers>
<styles>
<style>polygon</style>
</styles>
</layerGroup>
"""
geoserver.update_layer_group(name="my_group", body=body, workspace="demo")
# Using XML format
body = """
my_group
buildings
"""
geoserver.update_layer_group(name="my_group", body=body, workspace="demo")
Out[9]:
'Updated'
Removing a layer group¶
To remove a layer group, use the delete_layer_group
method.
In [10]:
Copied!
geoserver.delete_layer_group(name="my_group", workspace="demo")
geoserver.delete_layer_group(name="my_group", workspace="demo")
Out[10]:
'Deleted'