Pocket

【読了時間: 5分】

以前、MySQLにおいてシェープファイルを読み込む記事を記載しました。
今回は続編として、MySQLでポリゴン包含判定する内容を紹介したいと思います。

やること

下記の2種類のデータを用意します。

  • ポイントデータ(点)
  • ポリゴンデータ(面)

ここでは対象に、下北沢駅と桜新町駅(ポイントデータ)が世田谷区内に存在するかを判定する例文を記述したいと思います。

テーブル作成

ポイントデータ

サンプルでテーブルを作成したいと思います。

テーブルの作成

CREATE TABLE IF NOT EXISTS `geo_table` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `geometry` geometry NOT NULL COMMENT 'ジオメトリ',
  PRIMARY KEY (`id`),
  SPATIAL KEY `geometry` (`geometry`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

下北沢駅と桜新町駅をインサート

INSERT INTO `geo_table` (`geometry`) 
VALUES (
  GeomFromText('Point(139.667039 35.661446)', 1)
);

INSERT INTO `geo_table` (`geometry`) 
VALUES (
  GeomFromText('Point(139.644694 35.631917)', 1)
);

ポリゴンデータ

総務省が公開している平成27年度町丁・字ポリゴンデータ(世界測地系緯度経度) をサンプルに用いたいと思います。
先の記事に従って、ESRIシェープファイルからインポートします。

ポリゴン判定

ポリゴン内にポイントが存在するかどうかの判定は MBRWithin() 関数を用いて実施します。

例文

select h.MOJI, MBRWithin(g.geometry, h.geometry) from geo_table g, h27ka13112 h ;

結果

+-----------------------------+-----------------------------------+
| MOJI                        | MBRWithin(g.geometry, h.geometry) |
+-----------------------------+-----------------------------------+
| 太子堂4丁目                |                                 0 |
   (中略)
| 世田谷1丁目                |                                 0 |
| 北沢2丁目                  |                                 1 |
   (中略)
| 桜新町2丁目                |                                 1 |
| 上野毛3丁目                |                                 0 |
   (中略)
| 上用賀3丁目                |                                 0 |
+-----------------------------+-----------------------------------+
554 rows in set (0.00 sec)

下北沢駅と桜新町駅のある北沢2丁目と桜新町2丁目において、Booleanが真になっていることを確認できました。

たとえば、ポイントデータに平成27年度町丁・字ポリゴンデータの町丁・字の列を追加したいときはselect文の代わりにalterupdate を使うことで空間結合もできますね。

便利ですね〜。

執筆: 仙石裕明