[QGIS-Developer] Strange Mysql (spatial) behaviour: no points visible

Even Rouault even.rouault at spatialys.com
Sun Jan 28 10:04:51 PST 2024


Richard,

what I don't understand is how you manage to create with ogr2ogr a table 
without explicit SRS with features whose coordinates are not compatible 
of geographic coordinates. As mentioned previously, I do get a hard 
error from ogr2ogr when trying that. Which GDAL version do you use?

The reason for which QGIS doesn't display features is likely it calls 
OGR with SetSpatialFilter() , which the mySQL driver turns into a  WHERE 
MBRIntersects(ST_GeomFromText('POLYGON((.....))', 
'axis-order=long-lat'), `geom_colum_name`) filter. The 
'axis-order=long-lat' qualifier is because OGR (perhaps mistakenly?) 
identifies the layer as with a geographic SRS, and if the extents of the 
layer aren't compatible of geographic coordinates, that probably causes 
the filter to fail.

Actually trying the following on a layer without explicit CRS, which 
then causes a undefined geographic CRS to be assigned to the layer

$ ogrinfo 
"mysql:test,user=root,password=passwd,port=33060,host=127.0.0.1" test 
-spat -180 -90 180 90

I do get:

ERROR 1: MySQL error message:Longitude -180.000000 is out of range in 
function st_geomfromtext. It must be within (-180.000000, 180.000000]. 
Description: SELECT `OGR_FID`, `SHAPE` `SHAPE`, `id` FROM `test` WHERE 
MBRIntersects(ST_GeomFromText('POLYGON((-180 -90, 180 -90, 180 90, -180 
90, -180 -90))', 32767, 'axis-order=long-lat'), `SHAPE`)

So MySQL is super picky on the range of values for spatial filters. OK, 
fair enough, easy to fix by clamping values on the driver side.

But!!! I also discovered what is to me a MySQL non-sense. It seems 
spatial predicates are totally broken when using geographic SRS.

select MBRIntersects(ST_GeomFromText('POLYGON((-90 -90, 90 -90, 90 90, 
-90 90, -90 -90))', 4326), ST_GeomFromText('POINT(0 0)', 4326));

returns true as expected

But enlarging that extent to almost the whole world with

select MBRIntersects(ST_GeomFromText('POLYGON((-179 -89, 179 -89, 179 
89, -179 89, -179 -89))', 4326, 'axis-order=long-lat'), 
ST_GeomFromText('POINT(0 0)', 4326));

or (to test if winding order has some importance)

select MBRIntersects(ST_GeomFromText('POLYGON((-179 -89, -179 89, 179 
89, 179 -89, -179 -89))', 4326, 'axis-order=long-lat'), 
ST_GeomFromText('POINT(0 0)', 4326));

returns false !!!! (I've also verified with mysql:8.3.0 image)

And

select MBRIntersects(ST_GeomFromText('POLYGON((-179 -89, 179 -89, 179 
89, -179 89, -179 -89))', 32631), ST_GeomFromText('POINT(0 0)', 32631));

returns true as expected

Consequence, it seems safer to disable spatial filtering on layers with 
geographic coordinates with MySQL...

That's just what I've done in https://github.com/OSGeo/gdal/pull/9152 . 
Hopefully that will fix those issues with geometries not appearing. 
Obviously performance will not be optimal as spatial filtering will be 
done on OGR client side...

Even

Le 28/01/2024 à 14:52, Richard Duivenvoorde a écrit :
>
> On 1/23/24 23:21, Even Rouault wrote:
>> So all in all, no issues on my side...
>
> You were off course right :-)
>
> I found out how to fix the missing crs in mysql and wrote some info 
> (for future reference) in a comment:
>
> https://github.com/qgis/QGIS/issues/55463#issuecomment-1913602140
>
> One thing I'm curious for, is why QGIS even after setting the right 
> crs, is not able to show the geom (but IS able to show the 
> attributes). Apparently the features are retrieved. If you receive 
> features from a shp file without crs, after setting it on the layer, 
> all is fine. So myql is different?
>
> Did a short try to debug this, but this is above my c++ skills :-)
>
> Anyway thanks! And I hope the comment is helpful to mysql peeps
>
> Regards,
>
> Richard Duivenvoorde
>
>
-- 
http://www.spatialys.com
My software is free, but my time generally not.



More information about the QGIS-Developer mailing list