import ogr
import gdal
import numpy as np
gdal.VersionInfo()
'2010300'
# works fine
geom = ogr.CreateGeometryFromWkt('MULTIPOLYGON EMPTY')
geom.IsEmpty(), geom.ExportToJson()
(True, '{ "type": "MultiPolygon", "coordinates": [ ] }')
# works fine
geom = ogr.CreateGeometryFromWkt('MULTIPOLYGON Z EMPTY')
geom.IsEmpty(), geom.ExportToJson()
(True, '{ "type": "MultiPolygon", "coordinates": [ ] }')
# works fine,
geom = ogr.CreateGeometryFromJson('{"type": "MultiPolygon", "coordinates": []}')
geom.IsEmpty(), geom.ExportToIsoWkt()
(True, 'MULTIPOLYGON EMPTY')
# works fine,
geom = ogr.CreateGeometryFromJson('{"type": "MultiPolygon", "coordinates": [[]]}')
geom.IsEmpty(), geom.ExportToIsoWkt()
(True, 'MULTIPOLYGON EMPTY')
# this geojson is created when using "ST_ASGEOJSON(geom)" in PostGIS
# on a geometry containing a Z dimensions.
# Exporting results in empty WKT, but the IsEmpty() check fails
# Using ST_FORCE2D() is a workaround if the Z dimension can be ignored, results in single brackets []
geom = ogr.CreateGeometryFromJson('{"type": "MultiPolygon", "coordinates": [[[]]]}')
geom.IsEmpty(), geom.ExportToIsoWkt()
(False, 'MULTIPOLYGON EMPTY')
rasdrv = gdal.GetDriverByName('MEM')
vecdrv = ogr.GetDriverByName('Memory')
# in-mem raster to rasterize to
outds = rasdrv.Create('', 100, 100, 1, gdal.GDT_Byte)
outds.SetGeoTransform([0, 1, 0, 0, 0, 1])
0
# Hard crash
geom = ogr.CreateGeometryFromJson('{"type": "MultiPolygon", "coordinates": [[[]]]}')
# Works fine
#geom = ogr.CreateGeometryFromJson('{"type": "MultiPolygon", "coordinates": [[]]}')
# create in-mem vector to rasterize from
ft = ogr.Feature(ogr.FeatureDefn())
ft.SetGeometry(geom)
dsvec = vecdrv.CreateDataSource('')
lyr = dsvec.CreateLayer('', None, ogr.wkbMultiPolygon)
lyr.CreateFeature(ft)
0
# rasterization
gdal.RasterizeLayer(outds, [1], lyr, burn_values=[1], options=[])
mask = outds.ReadAsArray()
mask.min(), mask.max() # expect all zeros for an empty polygon, makes sense