@@ -1404,7 +1404,7 @@ cdef infer_field_types(list dtypes):
1404
1404
1405
1405
# TODO: set geometry and field data as memory views?
1406
1406
def ogr_write (
1407
- str path , str layer , str driver , geometry , field_data , fields ,
1407
+ str path , str layer , str driver , geometry , fields , field_data , field_mask ,
1408
1408
str crs , str geometry_type , str encoding , object dataset_kwargs ,
1409
1409
object layer_kwargs , bint promote_to_multi = False , bint nan_as_null = True ,
1410
1410
bint append = False
@@ -1442,6 +1442,15 @@ def ogr_write(
1442
1442
if len (field_data[i]) != num_records:
1443
1443
raise ValueError (" field_data arrays must be same length as geometry array" )
1444
1444
1445
+ if field_mask is not None :
1446
+ if len (field_data) != len (field_mask):
1447
+ raise ValueError (" field_data and field_mask must be same length" )
1448
+ for i in range (0 , len (field_mask)):
1449
+ if field_mask[i] is not None and len (field_mask[i]) != num_records:
1450
+ raise ValueError (" field_mask arrays must be same length as geometry array" )
1451
+ else :
1452
+ field_mask = [None ] * len (field_data)
1453
+
1445
1454
path_b = path.encode(' UTF-8' )
1446
1455
path_c = path_b
1447
1456
@@ -1658,7 +1667,11 @@ def ogr_write(
1658
1667
field_value = field_data[field_idx][i]
1659
1668
field_type = field_types[field_idx][0 ]
1660
1669
1661
- if field_type == OFTString:
1670
+ mask = field_mask[field_idx]
1671
+ if mask is not None and mask[i]:
1672
+ OGR_F_SetFieldNull(ogr_feature, field_idx)
1673
+
1674
+ elif field_type == OFTString:
1662
1675
# TODO: encode string using approach from _get_internal_encoding which checks layer capabilities
1663
1676
if (
1664
1677
field_value is None
0 commit comments