Přeskočit na obsah
iD-SIGN
Ptejte se

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.

1 min čtenívydáno 11/2021

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

sql
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:

sql
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:

sql
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.

Štítky Backend, Databáze

Sdílet LinkedIn Facebook

Potřebujete víc než článek?

Stačí pár vět o tom, co řešíte.