Skip to content

Instantly share code, notes, and snippets.

@RutgerK
Last active May 9, 2017 08:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RutgerK/47412685882ed3f518c70fd09f57691c to your computer and use it in GitHub Desktop.
Save RutgerK/47412685882ed3f518c70fd09f57691c to your computer and use it in GitHub Desktop.
GDAL Rasterize empty polygon
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'2010300'"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import ogr\n",
"import gdal\n",
"import numpy as np\n",
"\n",
"gdal.VersionInfo()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## WKT"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(True, '{ \"type\": \"MultiPolygon\", \"coordinates\": [ ] }')"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# works fine\n",
"geom = ogr.CreateGeometryFromWkt('MULTIPOLYGON EMPTY')\n",
"geom.IsEmpty(), geom.ExportToJson()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(True, '{ \"type\": \"MultiPolygon\", \"coordinates\": [ ] }')"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# works fine\n",
"geom = ogr.CreateGeometryFromWkt('MULTIPOLYGON Z EMPTY')\n",
"geom.IsEmpty(), geom.ExportToJson()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## GeoJSON"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(True, 'MULTIPOLYGON EMPTY')"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# works fine,\n",
"geom = ogr.CreateGeometryFromJson('{\"type\": \"MultiPolygon\", \"coordinates\": []}')\n",
"geom.IsEmpty(), geom.ExportToIsoWkt()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(True, 'MULTIPOLYGON EMPTY')"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# works fine,\n",
"geom = ogr.CreateGeometryFromJson('{\"type\": \"MultiPolygon\", \"coordinates\": [[]]}')\n",
"geom.IsEmpty(), geom.ExportToIsoWkt()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### PostGIS ST_ASGEOJSON() output on \"Multipolygon Z EMPTY\" geometry:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(False, 'MULTIPOLYGON EMPTY')"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# this geojson is created when using \"ST_ASGEOJSON(geom)\" in PostGIS\n",
"# on a geometry containing a Z dimensions.\n",
"# Exporting results in empty WKT, but the IsEmpty() check fails\n",
"\n",
"# Using ST_FORCE2D() is a workaround if the Z dimension can be ignored, results in single brackets []\n",
"\n",
"geom = ogr.CreateGeometryFromJson('{\"type\": \"MultiPolygon\", \"coordinates\": [[[]]]}')\n",
"geom.IsEmpty(), geom.ExportToIsoWkt()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Rasterizing an empty geom"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rasdrv = gdal.GetDriverByName('MEM')\n",
"vecdrv = ogr.GetDriverByName('Memory')\n",
"\n",
"# in-mem raster to rasterize to\n",
"outds = rasdrv.Create('', 100, 100, 1, gdal.GDT_Byte)\n",
"outds.SetGeoTransform([0, 1, 0, 0, 0, 1])"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Hard crash\n",
"geom = ogr.CreateGeometryFromJson('{\"type\": \"MultiPolygon\", \"coordinates\": [[[]]]}')\n",
"\n",
"# Works fine\n",
"#geom = ogr.CreateGeometryFromJson('{\"type\": \"MultiPolygon\", \"coordinates\": [[]]}')\n",
"\n",
"# create in-mem vector to rasterize from\n",
"ft = ogr.Feature(ogr.FeatureDefn())\n",
"ft.SetGeometry(geom)\n",
"\n",
"dsvec = vecdrv.CreateDataSource('')\n",
"\n",
"lyr = dsvec.CreateLayer('', None, ogr.wkbMultiPolygon)\n",
"lyr.CreateFeature(ft)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# rasterization\n",
"gdal.RasterizeLayer(outds, [1], lyr, burn_values=[1], options=[]) "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mask = outds.ReadAsArray()\n",
"mask.min(), mask.max() # expect all zeros for an empty polygon, makes sense"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### gdal.RasterizeLayer() with [[[]]] geojson results in:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"data:image/png;base64,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\">"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment