Add bounded GRB map acquisition
GeoIntel CI / docs-smoke (push) Canceled after 0s
GeoIntel CI / contract-smoke (push) Canceled after 0s

This commit is contained in:
Codex
2026-07-17 21:29:26 +02:00
parent 47cde21e17
commit 488da4cc83
28 changed files with 1644 additions and 134 deletions
@@ -6,7 +6,7 @@ import { terrainSelectionToMapSelection } from '../lib/terrainSelection'
import { floodHazardSelectionToMapSelection } from '../lib/floodHazardSelection'
import { thematicRasterSelectionToMapSelection } from '../lib/thematicRaster'
export type MapThemeAcquisitionKind = 'thematic_raster' | 'dhmv' | 'flood_hazard'
export type MapThemeAcquisitionKind = 'thematic_raster' | 'dhmv' | 'flood_hazard' | 'grb'
export interface MapThemeAcquisition {
kind: MapThemeAcquisitionKind
@@ -72,30 +72,34 @@ export function useMapThemeSelectionInsights<TThemeId extends string>(
queries.map(async ({ themeId, dataset: existingDataset, partitioned, acquisition }) => {
let dataset = existingDataset
if (acquisition) {
const commonPayload = {
bbox,
area_id: areaId,
force_refresh: false,
}
const acquisitionJob = acquisition.kind === 'thematic_raster'
? await datasetsApi.acquireThematicRaster(selectedProjectId, {
bbox,
area_id: areaId,
...commonPayload,
product_key: acquisition.productKey,
force_refresh: false,
})
: acquisition.kind === 'dhmv'
? await datasetsApi.acquireDhmv(selectedProjectId, {
bbox,
area_id: areaId,
...commonPayload,
product_key: acquisition.productKey as 'dtm_1m' | 'dsm_1m',
force_refresh: false,
})
: await datasetsApi.acquireFloodHazard(selectedProjectId, {
bbox,
area_id: areaId,
product_key: acquisition.productKey,
force_refresh: false,
})
: acquisition.kind === 'flood_hazard'
? await datasetsApi.acquireFloodHazard(selectedProjectId, {
...commonPayload,
product_key: acquisition.productKey,
})
: await datasetsApi.acquireGrb(selectedProjectId, {
...commonPayload,
product_key: acquisition.productKey as 'buildings' | 'roads' | 'water' | 'parcels',
})
if (acquisitionJob.status !== 'success' || !acquisitionJob.output_dataset_id) {
throw new Error(
acquisitionJob.error_message
|| `De officiële rasterbron ${acquisition.displayName} kon niet worden ingeladen.`,
|| `De officiële kaartbron ${acquisition.displayName} kon niet worden ingeladen.`,
)
}
dataset = await datasetsApi.get(selectedProjectId, acquisitionJob.output_dataset_id)
@@ -4,23 +4,26 @@ import { formatError } from '../lib/formatError'
import type {
DhmvProductRead,
FloodHazardProductRead,
GrbProductRead,
ThematicRasterProductRead,
} from '../types'
interface OfficialRasterProducts {
interface OfficialMapProducts {
thematic: ThematicRasterProductRead[]
dhmv: DhmvProductRead[]
floodHazard: FloodHazardProductRead[]
grb: GrbProductRead[]
}
const EMPTY_PRODUCTS: OfficialRasterProducts = {
const EMPTY_PRODUCTS: OfficialMapProducts = {
thematic: [],
dhmv: [],
floodHazard: [],
grb: [],
}
export function useOfficialRasterProducts(selectedProjectId: string | null) {
const [products, setProducts] = useState<OfficialRasterProducts>(EMPTY_PRODUCTS)
export function useOfficialMapProducts(selectedProjectId: string | null) {
const [products, setProducts] = useState<OfficialMapProducts>(EMPTY_PRODUCTS)
const [loading, setLoading] = useState(false)
const [error, setError] = useState<string | null>(null)
@@ -41,20 +44,22 @@ export function useOfficialRasterProducts(selectedProjectId: string | null) {
datasetsApi.listThematicRasterProducts(selectedProjectId),
datasetsApi.listDhmvProducts(selectedProjectId),
datasetsApi.listFloodHazardProducts(selectedProjectId),
datasetsApi.listGrbProducts(selectedProjectId),
])
.then(([thematic, dhmv, floodHazard]) => {
.then(([thematic, dhmv, floodHazard, grb]) => {
if (!cancelled) {
setProducts({
thematic: thematic.items,
dhmv: dhmv.items,
floodHazard: floodHazard.items,
grb: grb.items,
})
}
})
.catch((requestError) => {
if (!cancelled) {
setProducts(EMPTY_PRODUCTS)
setError(formatError(requestError, 'De officiële Vlaamse rastercatalogi konden niet worden geladen.'))
setError(formatError(requestError, 'De officiële Vlaamse kaartcatalogi konden niet worden geladen.'))
}
})
.finally(() => {