MariaDB, ST_Contains a hraniční body

MariaDB funkce ST_Contains není kompatibilní s MySQL ST_Contains v tom, že nenalezne body ležící na hranici prohledávaného polygonu.

Následující ukázka bohužel vrátí jiný výsledek v MySQL5.7+ a MariaDB10+:

SET @area = ST_GEOMFROMTEXT('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))');
SET @point = ST_GEOMFROMTEXT('POINT(0 9)');
SELECT ST_Contains(@area,@point);

V MySQL bude výsledek ten, že polygon @area obsahuje @point (ležící na hranici oblasti), zatímco z MariaDB se dozvíme, že neobsahuje. Vysvětlení k tomuto rozdílu chování jsem nikde nenašel a ani MariaDB dokumentace k ST_Contains to nijak zvlášť nevysvětluje:

Returns 1 or 0 to indicate whether a geometry g1 completely contains geometry g2.

Pokud tedy chceme v MariaDB testovat nebo hledat i hraniční body, musíme doplnit test i o ST_Touches:

SET @area = ST_GEOMFROMTEXT('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))');
SET @point = ST_GEOMFROMTEXT('POINT(0 9)');
SELECT ST_Contains(@area,@point) || ST_Touches(@area, @point);

Pro úplnost uvedu, že uvedené chování platí pro body. Pokud testujeme polygony, tak u těch je stejná hranice výsledek neovlivní, viz ukázka:

SET @area = ST_GEOMFROMTEXT('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))');
SET @subarea = ST_GEOMFROMTEXT('POLYGON((0 0, 5 0, 5 5, 0 5, 0 0))');
SELECT ST_Contains(@area,@subarea);

V tomto případě nám i MariaDB vrátí výsledek, že podoblast @subarea zcela leží v oblasti @area.

nám. Republiky 28
301 00 Plzeň
Česká republika
IČ: 28006402
DIČ: CZ28006402

© 2002 - 2021 iD-SIGN BRANDS MENTIONED ABOVE ARE PROPERTY OF THEIR RESPECTIVE OWNER.