Kontakt aufnehmen
Backend 1 Min. Lesezeit · 11/2021

MariaDB, ST_Contains und Randpunkte

Die MariaDB-Funktion ST_Contains ist insofern nicht mit ST_Contains in MySQL kompatibel, als sie keine Punkte findet, die auf dem Rand des durchsuchten Polygons liegen.

Das folgende Beispiel liefert in MySQL 5.7+ und MariaDB 10+ leider unterschiedliche Ergebnisse:

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);

In MySQL lautet das Ergebnis, dass das Polygon @area den Punkt @point (der auf dem Rand des Bereichs liegt) enthält, während MariaDB uns mitteilt, dass er nicht enthalten ist. Eine Erklärung für dieses unterschiedliche Verhalten habe ich nirgends gefunden, und auch die Dokumentation von MariaDB zu ST_Contains erklärt es nicht näher:

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

Wenn wir also in MariaDB auch Randpunkte prüfen oder finden möchten, müssen wir die Abfrage um ST_Touches ergänzen:

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);

Der Vollständigkeit halber sei erwähnt, dass dieses Verhalten für Punkte gilt. Werden Polygone geprüft, beeinflusst ein gemeinsamer Rand das Ergebnis nicht, siehe Beispiel:

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);

In diesem Fall liefert auch MariaDB das Ergebnis, dass der Teilbereich @subarea vollständig im Bereich @area liegt.

Teilen
LinkedIn Facebook

Brauchen Sie mehr als einen Artikel?

Melden Sie sich unverbindlich – ein paar Sätze dazu, worum es geht, genügen.

Weiterlesen

Ähnliche Artikel

Weitere Notizen aus Betrieb und Entwicklung.

Gesamter Ratgeber