feat(workbench): add runtime GIS and sample integrations

This commit is contained in:
2026-09-22 10:44:31 +08:00
parent a3b4e75317
commit 7ab9b36a5e
62 changed files with 6685 additions and 51 deletions
+83
View File
@@ -94,6 +94,89 @@ class GeoServerAdminClient:
)
return True
def feature_type_exists(
self,
*,
workspace: str,
datastore: str,
layer: str,
) -> bool:
response = self._client.get(
f"/rest/workspaces/{workspace}/datastores/{datastore}/featuretypes/{layer}.json"
)
if response.status_code == 404:
return False
if response.is_error:
raise GeoServerProvisioningError(
f"GeoServer feature type check failed with HTTP {response.status_code}"
)
return True
def publish_feature_type(
self,
*,
workspace: str,
datastore: str,
layer: str,
title: str,
map_bbox: tuple[float, float, float, float],
) -> None:
minx, miny, maxx, maxy = map_bbox
payload = {
"featureType": {
"name": layer,
"nativeName": layer,
"title": title,
"srs": "EPSG:3857",
"projectionPolicy": "FORCE_DECLARED",
"enabled": True,
"advertised": True,
"nativeBoundingBox": {
"minx": minx,
"miny": miny,
"maxx": maxx,
"maxy": maxy,
"crs": "EPSG:3857",
},
"latLonBoundingBox": {
"minx": _longitude(minx),
"miny": _latitude(miny),
"maxx": _longitude(maxx),
"maxy": _latitude(maxy),
"crs": "EPSG:4326",
},
}
}
if self.feature_type_exists(
workspace=workspace,
datastore=datastore,
layer=layer,
):
self._request(
"PUT",
f"/rest/workspaces/{workspace}/datastores/{datastore}/featuretypes/{layer}",
json=payload,
)
else:
self._request(
"POST",
f"/rest/workspaces/{workspace}/datastores/{datastore}/featuretypes",
json=payload,
)
self._set_client_cache(workspace, layer)
def truncate_layer_cache(self, workspace: str, layer: str) -> None:
self._request(
"POST",
"/gwc/rest/masstruncate",
content=(
"<truncateLayer><layerName>"
f"{workspace}:{layer}"
"</layerName></truncateLayer>"
),
headers={"Content-Type": "text/xml"},
)
def create_project_workspace(
self,
*,