#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 , 6 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 , 6 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:4 by , 6 years ago
| Has patch: | unset |
|---|---|
| Owner: | removed |
| Status: | assigned → new |
comment:5 by , 6 years ago
| Owner: | set to |
|---|---|
| Status: | new → assigned |
comment:8 by , 5 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 , 5 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
GDALRasterif you passbytesorstrand if conversion is not successful then usesGEOSGeometry.GDALRasteraccepts 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)