Geometry型の動作確認

Tag:

Geometry型の動作確認をします。MySQL5.7からInnoDBでもGEOMETRY型のカラムでインデックスを作成できるようになったので、利用機会が増えるかと思います。

テーブル作成

Geometry型のカラムをもつテーブルを作成します。

CREATE TABLE `test`.`test` (
  `name` VARCHAR(30) NOT NULL, 
  `location` GEOMETRY NOT NULL 
) ENGINE = InnoDB;

インデックスを作成します。5.7からInnoDBでもGeometry型のカラムでインデックスを作れるようになりました。

ALTER TABLE `test`.`test` ADD SPATIAL `location` (`location`); 

緯度・経度の挿入、取得

東京駅の緯度(35.681298)経度(139.766247)を格納してみます。

INSERT INTO `test` (`name`, `location`) 
VALUES ('東京駅', GeomFromText('POINT(139.766247 35.681298)'));

データを表示します。X関数で経度を、Y関数で緯度を取得できます。

SELECT location, X(location), Y(location) 
FROM `test` 

近い順でレコード取得

2点間の距離が近い順にデータを取得します。

前準備としてレコードを挿入します。

INSERT INTO `test` (`name`, `location`) 
VALUES ('札幌駅', GeomFromText('POINT(141.350857 43.067656)')),
       ('上野駅', GeomFromText('POINT(139.776381 35.712297)')),
       ('品川駅', GeomFromText('POINT(139.73876 35.628471)'));

品川駅から近い順でソートしてみます。

SELECT name, 
       GLength(GeomFromText(
           CONCAT('LineString(139.73876 35.628471, ', 
                  X(location), 
                  ' ', 
                  Y(location), 
                  ')'
                 )
       )) as distance
FROM test
ORDER BY distance;

結果は以下のようになります。

上記クエリでは以下のことを行っています。
1. LineStringで折れ線を取得(ここでは一本線)

LineString( Aの経度 Aの緯度, Bの経度 Bの緯度, ... )

2. GeomFromTextでgeometry型へ変換
3. GLengthでLineStringの長さを取得

スポンサーリンク