@@ -116,13 +116,17 @@ cdef char** dict_to_options(object values):
116
116
Parameters
117
117
----------
118
118
values: dict
119
+ all keys and values must be strings
119
120
120
121
Returns
121
122
-------
122
123
char**
123
124
"""
124
125
cdef char ** options = NULL
125
126
127
+ if values is None :
128
+ return NULL
129
+
126
130
for k, v in values.items():
127
131
k = k.encode(' UTF-8' )
128
132
v = v.encode(' UTF-8' )
@@ -305,6 +309,54 @@ cdef get_driver(OGRDataSourceH ogr_dataset):
305
309
return driver
306
310
307
311
312
+ cdef set_metadata(GDALMajorObjectH obj, object metadata):
313
+ """ Set metadata on a dataset or layer
314
+
315
+ Parameters
316
+ ----------
317
+ obj : pointer to dataset or layer
318
+ metadata : dict, optional (default None)
319
+ keys and values must be strings
320
+ """
321
+
322
+ cdef char ** metadata_items = NULL
323
+ cdef int err = 0
324
+
325
+ metadata_items = dict_to_options(metadata)
326
+ if metadata_items != NULL :
327
+ # only default namepace is currently supported
328
+ err = GDALSetMetadata(obj, metadata_items, NULL )
329
+
330
+ CSLDestroy(metadata_items)
331
+ metadata_items = NULL
332
+
333
+ if err:
334
+ raise RuntimeError (" Could not set metadata" ) from None
335
+
336
+ cdef get_metadata(GDALMajorObjectH obj):
337
+ """ Get metadata for a dataset or layer
338
+
339
+ Parameters
340
+ ----------
341
+ obj : pointer to dataset or layer
342
+
343
+ Returns
344
+ -------
345
+ dict or None
346
+ metadata as key, value pairs
347
+ """
348
+ # only default namespace is currently supported
349
+ cdef char ** metadata = GDALGetMetadata(obj, NULL )
350
+
351
+ if metadata != NULL :
352
+ return dict (
353
+ metadata[i].decode(' UTF-8' ).split(' =' , 1 )
354
+ for i in range (CSLCount(metadata))
355
+ )
356
+
357
+ return None
358
+
359
+
308
360
cdef detect_encoding(OGRDataSourceH ogr_dataset, OGRLayerH ogr_layer):
309
361
""" Attempt to detect the encoding of the layer.
310
362
If it supports UTF-8, use that.
@@ -1274,7 +1326,9 @@ def ogr_read_info(
1274
1326
" random_read" : OGR_L_TestCapability(ogr_layer, OLCRandomRead),
1275
1327
" fast_set_next_by_index" : OGR_L_TestCapability(ogr_layer, OLCFastSetNextByIndex),
1276
1328
" fast_spatial_filter" : OGR_L_TestCapability(ogr_layer, OLCFastSpatialFilter),
1277
- }
1329
+ },
1330
+ ' layer_metadata' : get_metadata(ogr_layer),
1331
+ ' dataset_metadata' : get_metadata(ogr_dataset),
1278
1332
}
1279
1333
1280
1334
finally :
@@ -1419,7 +1473,7 @@ def ogr_write(
1419
1473
str path , str layer , str driver , geometry , fields , field_data , field_mask ,
1420
1474
str crs , str geometry_type , str encoding , object dataset_kwargs ,
1421
1475
object layer_kwargs , bint promote_to_multi = False , bint nan_as_null = True ,
1422
- bint append = False
1476
+ bint append = False , dataset_metadata = None , layer_metadata = None
1423
1477
):
1424
1478
cdef const char * path_c = NULL
1425
1479
cdef const char * layer_c = NULL
@@ -1564,6 +1618,10 @@ def ogr_write(
1564
1618
else :
1565
1619
ogr_layer = exc_wrap_pointer(get_ogr_layer(ogr_dataset, layer))
1566
1620
1621
+ # Set dataset and layer metadata
1622
+ set_metadata(ogr_dataset, dataset_metadata)
1623
+ set_metadata(ogr_layer, layer_metadata)
1624
+
1567
1625
except Exception as exc:
1568
1626
OGRReleaseDataSource(ogr_dataset)
1569
1627
ogr_dataset = NULL
0 commit comments