Opened 5 years ago

Closed 5 years ago

Last modified 4 years ago

#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 Mariusz Felisiak, 5 years ago

Summary: GIS error logging when using WKT string as input to filter() queryGIS error logging when using WKT string as input to filter() query.
Triage Stage: UnreviewedAccepted
Type: UncategorizedBug
Version: 2.2master

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.

Thanks for this report. Django tries to use a GDALRaster if you pass bytes or str and if conversion is not successful then uses GEOSGeometry.

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:

    @cached_property
    def is_vsi_based(self):
        return self._ptr and self.name.startswith(VSI_FILESYSTEM_BASE_PATH)

comment:2 by dbxnr, 5 years ago

Owner: changed from nobody to dbxnr
Status: newassigned

comment:3 by dbxnr, 5 years ago

Has patch: set

comment:4 by dbxnr, 5 years ago

Has patch: unset
Owner: dbxnr removed
Status: assignednew

comment:5 by Mariusz Felisiak, 5 years ago

Owner: set to Mariusz Felisiak
Status: newassigned

comment:6 by Mariusz Felisiak, 5 years ago

Has patch: set

comment:7 by GitHub <noreply@…>, 5 years ago

Resolution: fixed
Status: assignedclosed

In 266c853e:

Fixed #31162 -- Prevented error logs when using WKT strings in lookups.

Thanks dbxnr for the initial patch.

Regression in 6f44f714c92d2966dca390ebd3054e5fb0bb0c80.

comment:8 by John Chandler, 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 Mariusz Felisiak, 4 years ago

This patch will not be backported to Django 2.2. It's included in Django 3.1+.

Note: See TracTickets for help on using tickets.
Back to Top