@@ -353,5 +353,97 @@ def generate_csw_metadata(base_url: str = DMS_DATASETS_BASE, lang="en"):
353353 csw .write_parquet ("dms-metadata.parquet" )
354354
355355
356+ @app .command ()
357+ def generate_geoapi_config (base_url : str = DMS_DATASETS_BASE , lang = "en" ):
358+ # TODO: localize the output based on the language in input
359+
360+ conn = duckdb .connect ()
361+ conn .sql ("Install spatial; load spatial" )
362+
363+ datasets = conn .read_parquet (base_url + "datasets_dataset.parquet" ).filter (
364+ "json_keys(metadata) <> []"
365+ )
366+ log .debug (datasets )
367+ rasters = conn .read_parquet (base_url + "datasets_rasterresource.parquet" ).select (
368+ "* replace (ST_GEomFromHEXWKB(extent) as extent), 'raster' as type"
369+ ) # noqa: F841
370+ vectors = conn .read_parquet (base_url + "datasets_tabularresource.parquet" ).select (
371+ "* replace (ST_GEomFromHEXWKB(extent) as extent), 'vector' as type"
372+ ) # noqa: F841
373+ datatables = conn .read_parquet (base_url + "datasets_datatable.parquet" ).select (
374+ "* replace (ST_GEomFromHEXWKB(extent) as extent)"
375+ ) # noqa: F841
376+ log .debug (vectors )
377+ log .debug (datatables )
378+
379+ descriptions_structure = datasets .aggregate (
380+ "json_group_structure(metadata->'$.descriptions[*]') as stucture"
381+ ).fetchone ()[0 ]
382+
383+ descriptions = (
384+ (
385+ rasters .set_alias ("r" )
386+ .join (datasets .set_alias ("d" ), condition = "r.dataset_id = d.id" )
387+ .select (
388+ f"r.id, unnest(json_transform(d.metadata->'$.descriptions[*]', '{ descriptions_structure } '), recursive := true)" # noqa: E501
389+ )
390+ )
391+ .filter (
392+ duckdb .ColumnExpression ("lang" ) == duckdb .ConstantExpression (lang ),
393+ )
394+ .aggregate (
395+ "id, lang, string_agg('# ' || descriptionType || '\n ' || description, '\n ') as description" # noqa: E501
396+ )
397+ )
398+ log .debug (descriptions )
399+
400+ subjects = (
401+ rasters .set_alias ("r" )
402+ .join (datasets .set_alias ("d" ), condition = "r.dataset_id = d.id" )
403+ .select (
404+ """r.id, unnest(json_transform(d.metadata->'$.subjects[*]', '[{"subject": "VARCHAR", "subjectScheme": "VARCHAR", "schemeURI": "VARCHAR", "valueURI": "VARCHAR", "classificationCode": "VARCHAR"}]'), recursive := true)""" # noqa: E501
405+ )
406+ .aggregate (
407+ "id, array_agg(subject) as keywords" # noqa: E501
408+ )
409+ )
410+ log .debug (subjects )
411+
412+ geo_raster = conn .sql ("""
413+ from rasters as r
414+ join datasets as d on d.id = r.dataset_id
415+ left join descriptions as descr on descr.id = d.id
416+ left join subjects as sbj on sbj.id = d.id
417+ select
418+ d.id || '/' || r.id as id,
419+ 'collection' as type,
420+ 'default' as visibility,
421+ d.title || ' - ' || r.title as title,
422+ coalesce(sbj.keywords, []) as keywords,
423+ coalesce(r.description || '\n ' || descr.description, '') as description,
424+ {
425+ "spatial": {
426+ bbox: [
427+ ST_XMIN(r.extent), ST_YMIN(r.extent),
428+ ST_XMAX(r.extent), ST_YMAX(r.extent),
429+ ],
430+ crs: 4326
431+ }
432+ } as extent,
433+ [{
434+ "type": 'coverage',
435+ "default": true,
436+ "name": 'rasterio',
437+ "data": '/vsicurl/' || r.uri,
438+ "format": {
439+ "name": r.metadata->>'$.driverShortName'
440+ }
441+ }] as providers
442+ """ )
443+
444+ log .debug (geo_raster )
445+ conn .sql ("copy geo_raster to 'dms-raster.json' (FORMAT json, ARRAY true)" )
446+
447+
356448if __name__ == "__main__" :
357449 app ()
0 commit comments