#31162 closed Bug (fixed)
GIS error logging when using WKT string as input to filter() query.
Reported by: | Arno | Owned by: | Mariusz Felisiak |
---|---|---|---|
Component: | GIS | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Accepted | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
When executing a geometry lookup like my_geo_model.objects.filter(my_geom__intersects=wkt_string)
(i.e. using a WKT string as value) django.contrib.gis emits the following errors:
2020-01-13 10:16:07,145 - django.contrib.gis - ERROR - GDAL_ERROR 4: b'POLYGON ((1 1, 1 0, 0 0, 0 1, 1 1)): No such file or directory' 2020-01-13 10:16:08,403 - django.contrib.gis - ERROR - GDAL_ERROR 10: b"Pointer 'hObject' is NULL in 'GDALGetDescription'.\n"
The reason is that if passed a string, the string is first treated as a potential filename which GDAL tries to open and fails ("no such file"). Only then it is tried to open the string as WKT/GeoJSON etc. Older Django versions did not emit these errors. However, in commit 6f44f714c9 a check in django/contrib/gis/gdal/raster/source.py:69 whether the file exists was removed.
Silencing all errors from django.contrib.gis is not really a feasable workaround, as it would mean silcencing interesting GIS errors too.
According to https://docs.djangoproject.com/en/2.2/ref/contrib/gis/db-api/#geometry-lookups passing WKT strings is allowed, but there's no mention of being able to pass a filename as parameter.
It's a bit unexpected that Django first tries to open a file before it checks whether the passed string is valid WKT/GeoJSON, and that using WKT results in error messages. Or am I misunderstanding the documentation and calling the API wrongly?
Relevant parts of example source:
models.py: class Area(models.Model): area = models.PolygonField() settings.py: LOGGING = { 'version': 1, 'handlers': { 'console': { 'level': 'INFO', 'class': 'logging.StreamHandler', }, }, 'root': { 'handlers': ['console'], 'level': 'INFO', } } main.py: from app.models import Area Area.objects.filter(area__intersects='POLYGON ((1 1, 1 0, 0 0, 0 1, 1 1))')
Change History (9)
comment:1 by , 5 years ago
Summary: | GIS error logging when using WKT string as input to filter() query → GIS error logging when using WKT string as input to filter() query. |
---|---|
Triage Stage: | Unreviewed → Accepted |
Type: | Uncategorized → Bug |
Version: | 2.2 → master |
comment:2 by , 5 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
comment:4 by , 5 years ago
Has patch: | unset |
---|---|
Owner: | removed |
Status: | assigned → new |
comment:5 by , 5 years ago
Owner: | set to |
---|---|
Status: | new → assigned |
comment:8 by , 4 years ago
Is the fix scheduled for a Django 2.2 LTS release?
We have the same error being raised after upgrading to 2.2. The latest 2.2.15 release does not include the patch.
comment:9 by , 4 years ago
This patch will not be backported to Django 2.2. It's included in Django 3.1+.
Thanks for this report. Django tries to use a
GDALRaster
if you passbytes
orstr
and if conversion is not successful then usesGEOSGeometry
.GDALRaster
accepts a string representing a file path. I agree that we should restore the previous check to avoid logging:GDAL_ERROR 4: b'LINESTRING(0 0, 1 1, 5 5): No such file or directory'
We should also protect
GDALRaster._del__()
to avoid:GDAL_ERROR 10: b"Pointer 'hObject' is NULL in 'GDALGetDescription'.
Maybe: