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
or0
to indicate whether a geometryg1
completely contains geometryg2
.
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.
Potřebujete více informací?
Zpráva byla úspěšně odeslána.
Děkujeme
Omlouváme se, ale zprávu se nepovedlo odeslat.
Budeme rádi, když nám o tomto dáte vědět na info@id-sign.com