Skip to content

Commit 25c7f22

Browse files
committed
feat: draft raster pygeoapi
1 parent a4876c4 commit 25c7f22

1 file changed

Lines changed: 92 additions & 0 deletions

File tree

src/datasync/dms.py

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
356448
if __name__ == "__main__":
357449
app()

0 commit comments

Comments
 (0)