Support bounded Kempen-wide thematic rasters
This commit is contained in:
+2
-2
@@ -31,8 +31,8 @@ FLOOD_HAZARD_MAX_RESPONSE_MB=160
|
|||||||
THEMATIC_RASTER_ENABLED=true
|
THEMATIC_RASTER_ENABLED=true
|
||||||
THEMATIC_RASTER_WCS_URL=https://www.mercator.vlaanderen.be/raadpleegdienstenmercatorpubliek/wcs
|
THEMATIC_RASTER_WCS_URL=https://www.mercator.vlaanderen.be/raadpleegdienstenmercatorpubliek/wcs
|
||||||
THEMATIC_RASTER_MIN_SIDE_M=100
|
THEMATIC_RASTER_MIN_SIDE_M=100
|
||||||
THEMATIC_RASTER_MAX_SIDE_M=20000
|
THEMATIC_RASTER_MAX_SIDE_M=60000
|
||||||
THEMATIC_RASTER_MAX_PIXELS=12000000
|
THEMATIC_RASTER_MAX_PIXELS=30000000
|
||||||
THEMATIC_RASTER_TIMEOUT_SECONDS=300
|
THEMATIC_RASTER_TIMEOUT_SECONDS=300
|
||||||
THEMATIC_RASTER_MAX_RESPONSE_MB=160
|
THEMATIC_RASTER_MAX_RESPONSE_MB=160
|
||||||
YOLO_ENABLED=false
|
YOLO_ENABLED=false
|
||||||
|
|||||||
@@ -1316,6 +1316,10 @@ Settings: `THEMATIC_RASTER_ENABLED`, `THEMATIC_RASTER_WCS_URL`,
|
|||||||
`THEMATIC_RASTER_MIN_SIDE_M`, `THEMATIC_RASTER_MAX_SIDE_M`,
|
`THEMATIC_RASTER_MIN_SIDE_M`, `THEMATIC_RASTER_MAX_SIDE_M`,
|
||||||
`THEMATIC_RASTER_MAX_PIXELS`, `THEMATIC_RASTER_TIMEOUT_SECONDS` and
|
`THEMATIC_RASTER_MAX_PIXELS`, `THEMATIC_RASTER_TIMEOUT_SECONDS` and
|
||||||
`THEMATIC_RASTER_MAX_RESPONSE_MB`.
|
`THEMATIC_RASTER_MAX_RESPONSE_MB`.
|
||||||
|
The default thematic ceiling is 60 km and 30 million cells so the exact
|
||||||
|
Kempen work area fits. External WCS transfers remain split into fixed 10 km
|
||||||
|
tiles, product identifiers remain server-allowlisted and other raster
|
||||||
|
pipelines retain their smaller independent limits.
|
||||||
|
|
||||||
Provision the official DOV soil polygons for Mol through the existing vector
|
Provision the official DOV soil polygons for Mol through the existing vector
|
||||||
upload path:
|
upload path:
|
||||||
|
|||||||
@@ -59,8 +59,8 @@ class Settings(BaseSettings):
|
|||||||
validation_alias="THEMATIC_RASTER_WCS_URL",
|
validation_alias="THEMATIC_RASTER_WCS_URL",
|
||||||
)
|
)
|
||||||
thematic_raster_min_side_m: float = Field(default=100.0, gt=0, validation_alias="THEMATIC_RASTER_MIN_SIDE_M")
|
thematic_raster_min_side_m: float = Field(default=100.0, gt=0, validation_alias="THEMATIC_RASTER_MIN_SIDE_M")
|
||||||
thematic_raster_max_side_m: float = Field(default=20_000.0, gt=0, validation_alias="THEMATIC_RASTER_MAX_SIDE_M")
|
thematic_raster_max_side_m: float = Field(default=60_000.0, gt=0, validation_alias="THEMATIC_RASTER_MAX_SIDE_M")
|
||||||
thematic_raster_max_pixels: int = Field(default=12_000_000, ge=1, validation_alias="THEMATIC_RASTER_MAX_PIXELS")
|
thematic_raster_max_pixels: int = Field(default=30_000_000, ge=1, validation_alias="THEMATIC_RASTER_MAX_PIXELS")
|
||||||
thematic_raster_timeout_seconds: int = Field(default=300, ge=1, validation_alias="THEMATIC_RASTER_TIMEOUT_SECONDS")
|
thematic_raster_timeout_seconds: int = Field(default=300, ge=1, validation_alias="THEMATIC_RASTER_TIMEOUT_SECONDS")
|
||||||
thematic_raster_max_response_mb: int = Field(default=160, ge=1, validation_alias="THEMATIC_RASTER_MAX_RESPONSE_MB")
|
thematic_raster_max_response_mb: int = Field(default=160, ge=1, validation_alias="THEMATIC_RASTER_MAX_RESPONSE_MB")
|
||||||
redis_url: str | None = Field(default=None, validation_alias="REDIS_URL")
|
redis_url: str | None = Field(default=None, validation_alias="REDIS_URL")
|
||||||
|
|||||||
@@ -148,6 +148,29 @@ def test_request_is_bounded_allowlisted_and_uses_native_wcs_resolution() -> None
|
|||||||
assert exc_info.value.code == "THEMATIC_RASTER_PRODUCT_NOT_SUPPORTED"
|
assert exc_info.value.code == "THEMATIC_RASTER_PRODUCT_NOT_SUPPORTED"
|
||||||
|
|
||||||
|
|
||||||
|
def test_complete_kempen_scope_fits_the_tiled_thematic_guardrails() -> None:
|
||||||
|
settings = Settings(_env_file=None)
|
||||||
|
request = ThematicRasterAcquireRequest(
|
||||||
|
bbox={
|
||||||
|
"min_x": 4.59723873,
|
||||||
|
"min_y": 51.01047967,
|
||||||
|
"max_x": 5.26224853,
|
||||||
|
"max_y": 51.50511313,
|
||||||
|
"crs": "EPSG:4326",
|
||||||
|
},
|
||||||
|
product_key="space_occupation_2025",
|
||||||
|
)
|
||||||
|
|
||||||
|
prepared = ThematicRasterAcquisitionService._prepared_request(request, settings)
|
||||||
|
|
||||||
|
assert prepared["width"] * prepared["height"] <= 30_000_000
|
||||||
|
assert len(ThematicRasterAcquisitionService._tile_bounds(prepared)) > 1
|
||||||
|
|
||||||
|
with pytest.raises(AppError) as exc_info:
|
||||||
|
ThematicRasterAcquisitionService._prepared_request(payload(side_m=61_000.0), settings)
|
||||||
|
assert exc_info.value.code == "THEMATIC_RASTER_SELECTION_TOO_LARGE"
|
||||||
|
|
||||||
|
|
||||||
def test_binary_and_normalized_products_fail_closed_on_invalid_values() -> None:
|
def test_binary_and_normalized_products_fail_closed_on_invalid_values() -> None:
|
||||||
binary = ThematicRasterAcquisitionService._product("space_occupation_2025")
|
binary = ThematicRasterAcquisitionService._product("space_occupation_2025")
|
||||||
score = ThematicRasterAcquisitionService._product("service_level_2022")
|
score = ThematicRasterAcquisitionService._product("service_level_2022")
|
||||||
|
|||||||
@@ -45,8 +45,8 @@
|
|||||||
<Config Name="Flood Hazard Maximum Cells" Target="FLOOD_HAZARD_MAX_PIXELS" Default="12000000" Mode="" Description="Maximum raster cells per flood-hazard acquisition or selection analysis." Type="Variable" Display="advanced" Required="true" Mask="false">12000000</Config>
|
<Config Name="Flood Hazard Maximum Cells" Target="FLOOD_HAZARD_MAX_PIXELS" Default="12000000" Mode="" Description="Maximum raster cells per flood-hazard acquisition or selection analysis." Type="Variable" Display="advanced" Required="true" Mask="false">12000000</Config>
|
||||||
<Config Name="Official Thematic Raster Acquisition" Target="THEMATIC_RASTER_ENABLED" Default="true" Mode="" Description="Allow bounded official Departement Omgeving rasters for space, population, accessibility and services." Type="Variable" Display="advanced" Required="true" Mask="false">true</Config>
|
<Config Name="Official Thematic Raster Acquisition" Target="THEMATIC_RASTER_ENABLED" Default="true" Mode="" Description="Allow bounded official Departement Omgeving rasters for space, population, accessibility and services." Type="Variable" Display="advanced" Required="true" Mask="false">true</Config>
|
||||||
<Config Name="Thematic Raster WCS URL" Target="THEMATIC_RASTER_WCS_URL" Default="https://www.mercator.vlaanderen.be/raadpleegdienstenmercatorpubliek/wcs" Mode="" Description="Official public MercatorNet WCS endpoint. Product identifiers remain server allowlisted." Type="Variable" Display="advanced" Required="true" Mask="false">https://www.mercator.vlaanderen.be/raadpleegdienstenmercatorpubliek/wcs</Config>
|
<Config Name="Thematic Raster WCS URL" Target="THEMATIC_RASTER_WCS_URL" Default="https://www.mercator.vlaanderen.be/raadpleegdienstenmercatorpubliek/wcs" Mode="" Description="Official public MercatorNet WCS endpoint. Product identifiers remain server allowlisted." Type="Variable" Display="advanced" Required="true" Mask="false">https://www.mercator.vlaanderen.be/raadpleegdienstenmercatorpubliek/wcs</Config>
|
||||||
<Config Name="Thematic Raster Maximum Side (m)" Target="THEMATIC_RASTER_MAX_SIDE_M" Default="20000" Mode="" Description="Maximum side length for one persisted thematic raster scope." Type="Variable" Display="advanced" Required="true" Mask="false">20000</Config>
|
<Config Name="Thematic Raster Maximum Side (m)" Target="THEMATIC_RASTER_MAX_SIDE_M" Default="60000" Mode="" Description="Maximum side length for one allowlisted thematic raster scope; supports the complete Kempen work area while WCS transfers remain tiled." Type="Variable" Display="advanced" Required="true" Mask="false">60000</Config>
|
||||||
<Config Name="Thematic Raster Maximum Cells" Target="THEMATIC_RASTER_MAX_PIXELS" Default="12000000" Mode="" Description="Maximum raster cells per acquisition or selection analysis." Type="Variable" Display="advanced" Required="true" Mask="false">12000000</Config>
|
<Config Name="Thematic Raster Maximum Cells" Target="THEMATIC_RASTER_MAX_PIXELS" Default="30000000" Mode="" Description="Maximum raster cells per allowlisted thematic acquisition or selection analysis." Type="Variable" Display="advanced" Required="true" Mask="false">30000000</Config>
|
||||||
<Config Name="Local Ollama Assistant" Target="OLLAMA_ENABLED" Default="true" Mode="" Description="Enable the source-grounded GeoIntel assistant backed by Ollama on the Unraid host." Type="Variable" Display="always" Required="true" Mask="false">true</Config>
|
<Config Name="Local Ollama Assistant" Target="OLLAMA_ENABLED" Default="true" Mode="" Description="Enable the source-grounded GeoIntel assistant backed by Ollama on the Unraid host." Type="Variable" Display="always" Required="true" Mask="false">true</Config>
|
||||||
<Config Name="Ollama Base URL" Target="OLLAMA_BASE_URL" Default="http://host.docker.internal:11434" Mode="" Description="Ollama API reachable from the container. The deployment maps host.docker.internal to the Unraid host gateway." Type="Variable" Display="always" Required="true" Mask="false">http://host.docker.internal:11434</Config>
|
<Config Name="Ollama Base URL" Target="OLLAMA_BASE_URL" Default="http://host.docker.internal:11434" Mode="" Description="Ollama API reachable from the container. The deployment maps host.docker.internal to the Unraid host gateway." Type="Variable" Display="always" Required="true" Mask="false">http://host.docker.internal:11434</Config>
|
||||||
<Config Name="Default Ollama Model" Target="OLLAMA_DEFAULT_MODEL" Default="qwen3.5:9b" Mode="" Description="Preferred locally installed Ollama model. Users can select another installed model in GeoIntel." Type="Variable" Display="always" Required="true" Mask="false">qwen3.5:9b</Config>
|
<Config Name="Default Ollama Model" Target="OLLAMA_DEFAULT_MODEL" Default="qwen3.5:9b" Mode="" Description="Preferred locally installed Ollama model. Users can select another installed model in GeoIntel." Type="Variable" Display="always" Required="true" Mask="false">qwen3.5:9b</Config>
|
||||||
|
|||||||
@@ -49,6 +49,16 @@ FLOOD_HAZARD_MAX_PIXELS=12000000
|
|||||||
FLOOD_HAZARD_TIMEOUT_SECONDS=300
|
FLOOD_HAZARD_TIMEOUT_SECONDS=300
|
||||||
FLOOD_HAZARD_MAX_RESPONSE_MB=160
|
FLOOD_HAZARD_MAX_RESPONSE_MB=160
|
||||||
|
|
||||||
|
# Allowlisted Departement Omgeving policy rasters. Regional requests are
|
||||||
|
# transferred as fixed 10 km WCS tiles before exact Area clipping.
|
||||||
|
THEMATIC_RASTER_ENABLED=true
|
||||||
|
THEMATIC_RASTER_WCS_URL=https://www.mercator.vlaanderen.be/raadpleegdienstenmercatorpubliek/wcs
|
||||||
|
THEMATIC_RASTER_MIN_SIDE_M=100
|
||||||
|
THEMATIC_RASTER_MAX_SIDE_M=60000
|
||||||
|
THEMATIC_RASTER_MAX_PIXELS=30000000
|
||||||
|
THEMATIC_RASTER_TIMEOUT_SECONDS=300
|
||||||
|
THEMATIC_RASTER_MAX_RESPONSE_MB=160
|
||||||
|
|
||||||
# Optional configured-YOLO runtime. Keep disabled unless a local model is mounted.
|
# Optional configured-YOLO runtime. Keep disabled unless a local model is mounted.
|
||||||
GEOINTEL_INSTALL_AI=false
|
GEOINTEL_INSTALL_AI=false
|
||||||
YOLO_ENABLED=false
|
YOLO_ENABLED=false
|
||||||
|
|||||||
@@ -46,8 +46,8 @@ FLOOD_HAZARD_MAX_RESPONSE_MB="${FLOOD_HAZARD_MAX_RESPONSE_MB:-160}"
|
|||||||
THEMATIC_RASTER_ENABLED="${THEMATIC_RASTER_ENABLED:-true}"
|
THEMATIC_RASTER_ENABLED="${THEMATIC_RASTER_ENABLED:-true}"
|
||||||
THEMATIC_RASTER_WCS_URL="${THEMATIC_RASTER_WCS_URL:-https://www.mercator.vlaanderen.be/raadpleegdienstenmercatorpubliek/wcs}"
|
THEMATIC_RASTER_WCS_URL="${THEMATIC_RASTER_WCS_URL:-https://www.mercator.vlaanderen.be/raadpleegdienstenmercatorpubliek/wcs}"
|
||||||
THEMATIC_RASTER_MIN_SIDE_M="${THEMATIC_RASTER_MIN_SIDE_M:-100}"
|
THEMATIC_RASTER_MIN_SIDE_M="${THEMATIC_RASTER_MIN_SIDE_M:-100}"
|
||||||
THEMATIC_RASTER_MAX_SIDE_M="${THEMATIC_RASTER_MAX_SIDE_M:-20000}"
|
THEMATIC_RASTER_MAX_SIDE_M="${THEMATIC_RASTER_MAX_SIDE_M:-60000}"
|
||||||
THEMATIC_RASTER_MAX_PIXELS="${THEMATIC_RASTER_MAX_PIXELS:-12000000}"
|
THEMATIC_RASTER_MAX_PIXELS="${THEMATIC_RASTER_MAX_PIXELS:-30000000}"
|
||||||
THEMATIC_RASTER_TIMEOUT_SECONDS="${THEMATIC_RASTER_TIMEOUT_SECONDS:-300}"
|
THEMATIC_RASTER_TIMEOUT_SECONDS="${THEMATIC_RASTER_TIMEOUT_SECONDS:-300}"
|
||||||
THEMATIC_RASTER_MAX_RESPONSE_MB="${THEMATIC_RASTER_MAX_RESPONSE_MB:-160}"
|
THEMATIC_RASTER_MAX_RESPONSE_MB="${THEMATIC_RASTER_MAX_RESPONSE_MB:-160}"
|
||||||
YOLO_ENABLED="${YOLO_ENABLED:-false}"
|
YOLO_ENABLED="${YOLO_ENABLED:-false}"
|
||||||
|
|||||||
@@ -44,8 +44,8 @@ services:
|
|||||||
THEMATIC_RASTER_ENABLED: ${THEMATIC_RASTER_ENABLED:-true}
|
THEMATIC_RASTER_ENABLED: ${THEMATIC_RASTER_ENABLED:-true}
|
||||||
THEMATIC_RASTER_WCS_URL: ${THEMATIC_RASTER_WCS_URL:-https://www.mercator.vlaanderen.be/raadpleegdienstenmercatorpubliek/wcs}
|
THEMATIC_RASTER_WCS_URL: ${THEMATIC_RASTER_WCS_URL:-https://www.mercator.vlaanderen.be/raadpleegdienstenmercatorpubliek/wcs}
|
||||||
THEMATIC_RASTER_MIN_SIDE_M: ${THEMATIC_RASTER_MIN_SIDE_M:-100}
|
THEMATIC_RASTER_MIN_SIDE_M: ${THEMATIC_RASTER_MIN_SIDE_M:-100}
|
||||||
THEMATIC_RASTER_MAX_SIDE_M: ${THEMATIC_RASTER_MAX_SIDE_M:-20000}
|
THEMATIC_RASTER_MAX_SIDE_M: ${THEMATIC_RASTER_MAX_SIDE_M:-60000}
|
||||||
THEMATIC_RASTER_MAX_PIXELS: ${THEMATIC_RASTER_MAX_PIXELS:-12000000}
|
THEMATIC_RASTER_MAX_PIXELS: ${THEMATIC_RASTER_MAX_PIXELS:-30000000}
|
||||||
THEMATIC_RASTER_TIMEOUT_SECONDS: ${THEMATIC_RASTER_TIMEOUT_SECONDS:-300}
|
THEMATIC_RASTER_TIMEOUT_SECONDS: ${THEMATIC_RASTER_TIMEOUT_SECONDS:-300}
|
||||||
THEMATIC_RASTER_MAX_RESPONSE_MB: ${THEMATIC_RASTER_MAX_RESPONSE_MB:-160}
|
THEMATIC_RASTER_MAX_RESPONSE_MB: ${THEMATIC_RASTER_MAX_RESPONSE_MB:-160}
|
||||||
YOLO_ENABLED: ${YOLO_ENABLED:-false}
|
YOLO_ENABLED: ${YOLO_ENABLED:-false}
|
||||||
|
|||||||
+2
-2
@@ -49,8 +49,8 @@ services:
|
|||||||
THEMATIC_RASTER_ENABLED: ${THEMATIC_RASTER_ENABLED:-true}
|
THEMATIC_RASTER_ENABLED: ${THEMATIC_RASTER_ENABLED:-true}
|
||||||
THEMATIC_RASTER_WCS_URL: ${THEMATIC_RASTER_WCS_URL:-https://www.mercator.vlaanderen.be/raadpleegdienstenmercatorpubliek/wcs}
|
THEMATIC_RASTER_WCS_URL: ${THEMATIC_RASTER_WCS_URL:-https://www.mercator.vlaanderen.be/raadpleegdienstenmercatorpubliek/wcs}
|
||||||
THEMATIC_RASTER_MIN_SIDE_M: ${THEMATIC_RASTER_MIN_SIDE_M:-100}
|
THEMATIC_RASTER_MIN_SIDE_M: ${THEMATIC_RASTER_MIN_SIDE_M:-100}
|
||||||
THEMATIC_RASTER_MAX_SIDE_M: ${THEMATIC_RASTER_MAX_SIDE_M:-20000}
|
THEMATIC_RASTER_MAX_SIDE_M: ${THEMATIC_RASTER_MAX_SIDE_M:-60000}
|
||||||
THEMATIC_RASTER_MAX_PIXELS: ${THEMATIC_RASTER_MAX_PIXELS:-12000000}
|
THEMATIC_RASTER_MAX_PIXELS: ${THEMATIC_RASTER_MAX_PIXELS:-30000000}
|
||||||
THEMATIC_RASTER_TIMEOUT_SECONDS: ${THEMATIC_RASTER_TIMEOUT_SECONDS:-300}
|
THEMATIC_RASTER_TIMEOUT_SECONDS: ${THEMATIC_RASTER_TIMEOUT_SECONDS:-300}
|
||||||
THEMATIC_RASTER_MAX_RESPONSE_MB: ${THEMATIC_RASTER_MAX_RESPONSE_MB:-160}
|
THEMATIC_RASTER_MAX_RESPONSE_MB: ${THEMATIC_RASTER_MAX_RESPONSE_MB:-160}
|
||||||
YOLO_ENABLED: ${YOLO_ENABLED:-false}
|
YOLO_ENABLED: ${YOLO_ENABLED:-false}
|
||||||
|
|||||||
Reference in New Issue
Block a user