MBRTouchesを超えた!MariaDBで空間データ分析を極めるための関数とテクニック


MBRTouches 関数の構文

MBRTouches(g1, g2)

引数

  • g2: 2 番目のジオメトリ
  • g1: 最初のジオメトリ

戻り値

  • 2 つのジオメトリの MBR が接触していない場合は 0 を返します。
  • 2 つのジオメトリの MBR が接触している場合は 1 を返します。

MBRTouches 関数の動作

MBRTouches 関数は、2 つのジオメトリの MBR を比較して、以下のいずれかに該当するかどうかを判断します。

  • 2 つの MBR が 1 つの点で接している
  • 2 つの MBR が互いに重なっている

いずれの場合も、MBRTouches 関数は 1 を返します。

MBRTouches 関数の例

SELECT MBRTouches(
  GeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10))'),
  GeomFromText('POLYGON((5 5, 15 5, 15 15, 5 15))')
);

この例では、最初のジオメトリは 10x10 の正方形を表し、2 番目のジオメトリは 10x10 の正方形を表します。 2 つの正方形は 1 つの点で接しているので、MBRTouches 関数は 1 を返します。

MBRTouches 関数の使用例

MBRTouches 関数は、空間データ分析において、さまざまな目的に使用できます。 例えば、以下のことができます。

  • 2 つの土地が隣接しているかどうかを判断する
  • 2 つの道路が交差しているかどうかを判断する
  • 2 つの建物の境界線が接触しているかどうかを判断する

MBRTouches 関数の利点

MBRTouches 関数は、MBR を使用してジオメトリを比較するため、非常に効率的な関数です。 MBR は、ジオメトリの最小と最大の X 座標と Y 座標を含む単純な矩形であるため、計算コストが低くなります。

MBRTouches 関数の制限事項

MBRTouches 関数は、MBR を使用してジオメトリを比較するため、精度が制限されます。 MBR はジオメトリの形状を完全に表現していないため、2 つのジオメトリが接触している場合でも、MBRTouches 関数は 0 を返す可能性があります。



例 1: 2 つの建物の境界線が接触しているかどうかを判断する

この例では、2 つの建物の境界線を表す 2 つの POLYGON ジオメトリを作成し、MBRTouches 関数を使用して境界線が接触しているかどうかを判断します。

-- 2 つの建物の境界線を表す POLYGON ジオメトリを作成する
SET @building1 = GeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10))');
SET @building2 = GeomFromText('POLYGON((5 5, 15 5, 15 15, 5 15))');

-- 2 つの建物の境界線が接触しているかどうかを判断する
SELECT MBRTouches(@building1, @building2);

このコードを実行すると、次の出力が表示されます。

1

これは、2 つの建物の境界線が 1 つの点で接していることを意味します。

例 2: 2 つの道路が交差しているかどうかを判断する

この例では、2 つの道路を表す 2 つの LINEString ジオメトリを作成し、MBRTouches 関数を使用して道路が交差しているかどうかを判断します。

-- 2 つの道路を表す LINEString ジオメトリを作成する
SET @road1 = GeomFromText('LINESTRING(0 0, 10 0)');
SET @road2 = GeomFromText('LINESTRING(5 5, 5 15)');

-- 2 つの道路が交差しているかどうかを判断する
SELECT MBRTouches(@road1, @road2);
1

これは、2 つの道路が交差していることを意味します。

例 3: 2 つの土地が隣接しているかどうかを判断する

この例では、2 つの土地を表す 2 つの POLYGON ジオメトリを作成し、MBRTouches 関数を使用して土地が隣接しているかどうかを判断します。

-- 2 つの土地を表す POLYGON ジオメトリを作成する
SET @land1 = GeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10))');
SET @land2 = GeomFromText('POLYGON((10 0, 20 0, 20 10, 10 10))');

-- 2 つの土地が隣接しているかどうかを判断する
SELECT MBRTouches(@land1, @land2);
1

これは、2 つの土地が隣接していることを意味します。



  • 計算コストが高い
    複雑なジオメトリの場合、MBR を計算するコストが高くなる可能性があります。
  • 精度が制限される
    MBR はジオメトリの形状を完全に表現していないため、2 つのジオメトリが接触している場合でも、MBRTouches 関数は 0 を返す可能性があります。

これらの制限を克服するために、MBRTouches 関数の代替方法をいくつか検討することができます。

ST_Intersects 関数

ST_Intersects 関数は、2 つのジオメトリが互いに交差しているかどうかを判断する関数です。 MBRTouches 関数よりも精度が高く、複雑なジオメトリでも効率的に計算できます。

SELECT ST_Intersects(g1, g2);

ST_TouchesWithin 関数

ST_TouchesWithin 関数は、最初のジオメトリが 2 番目のジオメトリの内部または境界に接しているかどうかを判断する関数です。 MBRTouches 関数よりも精度が高く、複雑なジオメトリでも効率的に計算できます。

SELECT ST_TouchesWithin(g1, g2);

カスタム関数

特定のニーズに合わせた精度と効率性を備えたカスタム関数を作成することもできます。

MBRTouches 関数の代替方法を選択する際の考慮事項

MBRTouches 関数の代替方法を選択する際には、以下の点を考慮する必要があります。

  • 複雑さ
    どのくらいの複雑さのジオメトリを扱う必要がありますか?
  • 効率性
    どのくらいのパフォーマンスが必要ですか?
  • 精度
    どのような精度が必要ですか?

2 つの建物の境界線が接触しているかどうかを判断する必要がある場合、ST_Intersects 関数を使用することをお勧めします。 ST_TouchesWithin 関数は、最初の建物が 2 番目の建物の内部または境界に完全に収まっている場合にのみ 1 を返します。

2 つの道路が交差しているかどうかを判断する必要がある場合、ST_Intersects 関数を使用することをお勧めします。

2 つの土地が隣接しているかどうかを判断する必要がある場合、MBRTouches 関数または ST_Intersects 関数を使用できます。 ST_TouchesWithin 関数は、最初の土地が 2 番目の土地の内部または境界に完全に収まっている場合にのみ 1 を返します。