MBRWithin関数で空間データ分析を効率化!MariaDBの空間インデックス活用術


MBR は、ジオメトリを囲む最小の矩形であり、空間関係を効率的に評価するために使用されます。MBRWithin 関数は、空間インデックスと組み合わせて使用することで、パフォーマンスを向上させることができます。

MBRWithin 関数の構文

MBRWithin 関数の構文は次のとおりです。

MBRWithin(g1, g2)

ここで、

  • g2 は、MBRWithin 関数の 2 番目のジオメトリです。
  • g1 は、MBRWithin 関数の最初のジオメトリです。

MBRWithin 関数の戻り値

MBRWithin 関数は、次のいずれかの値を返します。

  • 0g1 の MBR が g2 の MBR 内に完全に収まっていない場合。
  • 1g1 の MBR が g2 の MBR 内に完全に収まっている場合。

MBRWithin 関数の例

次の例では、MBRWithin 関数を使用して、points テーブル内のすべてのポイントが polygon テーブル内のポリゴン内に収まっているかどうかを判断します。

SELECT p.id, p.latlng
FROM points p
JOIN polygon poly ON MBRWithin(p.latlng, poly.polygon);

このクエリは、points テーブル内のすべてのポイントと polygon テーブル内のポリゴンを結合し、p.latlng ポイントが poly.polygon ポリゴン内に収まっているかどうかを判断します。

  • MBRWithin 関数は、MySQL 5.0.15 以降で使用できます。
  • MBRWithin 関数は、空間インデックスと組み合わせて使用することで、パフォーマンスを向上させることができます。
  • MBRWithin 関数は、2 つのジオメトリの MBR の関係のみを調べます。ジオメトリ自体の形状や詳細については考慮されません。


空間データのセットアップ

まず、MariaDB に空間データを作成する必要があります。この例では、points テーブルと polygon テーブルを作成し、それぞれに空間データを追加します。

CREATE TABLE points (
  id INT PRIMARY KEY AUTO_INCREMENT,
  latlng GEOMETRY NOT NULL
);

CREATE TABLE polygon (
  id INT PRIMARY KEY AUTO_INCREMENT,
  polygon GEOMETRY NOT NULL
);

INSERT INTO points (latlng) VALUES
  (POINT(40.7128, -74.0060)),
  (POINT(40.7062, -74.0072)),
  (POINT(40.7062, -74.0084)),
  (POINT(40.7128, -74.0096));

INSERT INTO polygon (polygon) VALUES
  (POLYGON((40.7112, -74.0128), (40.7156, -74.0128), (40.7156, -74.0060), (40.7112, -74.0060)));

MBRWithin 関数の使用

SELECT p.id, p.latlng
FROM points p
JOIN polygon poly ON MBRWithin(p.latlng, poly.polygon);

このクエリを実行すると、次の結果が得られます。

id  latlng
1  POINT(40.7128, -74.0060)
4  POINT(40.7128, -74.0096)

これは、points テーブル内のポイント 14polygon テーブル内のポリゴン内に収まっていることを示しています。

パフォーマンスを向上させるために、空間インデックスを points テーブルと polygon テーブルに作成できます。

CREATE SPATIAL INDEX idx_points_latlng ON points (latlng);
CREATE SPATIAL INDEX idx_polygon_polygon ON polygon (polygon);

これらのインデックスを作成すると、MBRWithin 関数の実行速度が大幅に向上します。



ST_Contains 関数

ST_Contains 関数は、MBRWithin 関数と同様に、2 つのジオメトリの空間関係を調べます。ただし、ST_Contains 関数は、1 つ目のジオメトリが 2 つ目のジオメトリ内に完全に収まっているかどうかを判断します。

ST_Contains(g1, g2)

ST_Intersects 関数

ST_Intersects 関数は、2 つのジオメトリが互いに交差しているかどうかを判断します。

ST_Intersects(g1, g2)

ST_Overlaps 関数

ST_Overlaps 関数は、2 つのジオメトリが互いに重なっているかどうかを判断します。

ST_Overlaps(g1, g2)

ST_Touches 関数

ST_Touches 関数は、2 つのジオメトリが互いに接触しているかどうかを判断します。

ST_Touches(g1, g2)

空間インデックス

空間インデックスを使用すると、空間データのクエリのパフォーマンスを向上させることができます。

CREATE SPATIAL INDEX idx_points_latlng ON points (latlng);
CREATE SPATIAL INDEX idx_polygon_polygon ON polygon (polygon);

これらのインデックスを作成すると、MBRWithin 関数、ST_Contains 関数、ST_Intersects 関数、ST_Overlaps 関数、ST_Touches 関数のいずれを使用する場合でも、パフォーマンスが向上します。

どの方法を使用するかは、特定のニーズによって異なります。

  • 空間データのクエリのパフォーマンスを向上させたい場合は、空間インデックスを使用します。
  • 2 つのジオメトリが互いに接触しているかどうかを判断したい場合は、ST_Touches 関数を使用します。
  • 2 つのジオメトリが互いに重なっているかどうかを判断したい場合は、ST_Overlaps 関数を使用します。
  • 2 つのジオメトリが互いに交差しているかどうかを判断したい場合は、ST_Intersects 関数を使用します。
  • 1 つ目のジオメトリが 2 つ目のジオメトリ内に完全に収まっているかどうかを判断したい場合は、MBRWithin 関数または ST_Contains 関数を使用します。