2011年5月24日火曜日

位置情報(緯度、経度)をMySQLのGeometry型で保存する

こんばんは。BS事業部隊員です。

今回は、位置情報(緯度、経度)の保存方法を紹介します。

これもまた得意のググりで見つけたものです。
位置情報サービスのはじめ方
Google MapsとMySQLの連携

MySQL(v5.0)のGeometry型.... 便利そう!とういうことで使ってみることにしました。
....
くわしいことは、先輩方のサイトを参考にしてください。詳しく載ってます。

ここでは、ポイントだけ。※ 例の位置情報は適当です。

1.Geometry型とは
MySQL4.1以降で用意されている空間情報を扱うデータ型

2.テーブル定義
対象カラムの型をGeometryとするだけ。
CREATE TABLE points (
  point_id INT NOT NULL
 ,latlon GEOMETRY NOT NULL
 ,PRIMARY KEY (point_id)
 ,SPATIAL KEY (latlon)
) Engine=MyISAM;
latlonカラムをSPATIAL INDEXとするため、MyISAMで使用します。

3.データの挿入
INSERT INTO points (
  point_id
 ,latlon
) VALUES (
  1
 ,GeomFromText('POINT(137.111 35.222)')
);
GeomFromTextはGeometry型に変換するMySQLの関数です。

4.データの取得
① 位置情報を取得する
SELECT
  point_id
 ,X(latlon) as lon
 ,Y(latlon) as lat
 ,ASTEXT(latlon) as geomtext
FROM points;
Xは経度、Yは緯度、ASTEXTは文字表現を返す関数です。

② 指定した範囲内の位置情報を取得する
SELECT
  point_id
 ,X(latlon) as lon
 ,Y(latlon) as lat
FROM points
WHERE MBRContains(GeomFromText('LINESTRING(140.00 36.00, 139.20 35.55)'), latlon);
MBRContains、LINESTRING関数については、このサイトに詳しく載ってます。

③ 2点間で一番近い位置情報を取得する
SELECT
  point_id
 ,X(latlon) as lon
 ,Y(latlon) as lat
 ,GLength(GeomFromText(CONCAT('LineString(137.111 35.222,', X(latlon), ' ', Y(latlon),')'))) AS len
FROM points
ORDER BY len
LIMIT 0 , 1
GLength関数は、2点間の距離を取得します。

かなり、省略してしまいましたが、こんな感じです。
足りない情報は、追記していきます。では。

0 件のコメント:

コメントを投稿

とある規格化されたコード

世の中こんなもんまで規格化されていますよ、というお話 https://ja.wikipedia.org/wiki/ISO_5218 この辺が大変良くできた、ためになる(?)解説記事です。(長い https://qiita.com/aoshirobo/items/32deb...