MySQLで学ぶGIS入門 9

「線」の地理情報データを扱ってみよう

第9回の今回は、MySQLで扱える地理情報データの中から「線」の地理情報データの扱い方について解説します。

坂井 恵 (さかい けい)

1月9日 6:30

はじめに

第7回では、MySQL上のテーブルに「点」(POINT)の位置情報を登録する方法を解説しました。MySQLでは地理情報データとして点のほかに「線」や「面」(形)の情報も登録できます。そこで今回は、線のデータの扱い方について解説します。

線の「Well Known Text」

点の地理情報を扱うための「Well Known Text(WKT)」が“POINT()”で表現されていたように、線に関するWKTは“LINESTRING()”で扱うことができます。線というのはいくつかの点を結んだものですから、LINESTRING()にはそれらの点の情報を順番に与えます。例えば、6個の点を結んだ線は、以下のように表現されます。

LINESTRING(
      35.745833 140.850812,
      35.739563 140.828196,
      35.797261 140.722967,
      35.833732 140.711981,
      35.865178 140.616022,
      35.902730 140.562979)

POINTの解説で「緯度と経度の区切りはコンマではなく空白文字です」と説明しました。LINESTRINGでは各点の区切りにコンマ(,)を使います。 緯度と経度の区切りにコンマを使わなかった理由が今回で分かったことでしょう。

なお、先ほどのLINESTRINGの例では見やすいように各点ごとに改行して見せましたが、実際には改行を入れずに記述することが多いです(改行してもしなくても同様に動作します)。

MYSQLにラインのデータを登録しよう

データ登録用テーブルの作成

まず、LINESTRINGのデータを登録するためのテーブルを作ます。第7回と同じテーブル構造ですが、ここでは「g2」という名前のテーブルにしました。

mysql> CREATE TABLE g2 (
    ->     id INTEGER, 
    ->     name VARCHAR(30), 
    ->     g GEOMETRY SRID 6668
    -> );
Query OK, 0 rows affected (0.118 sec)

データを登録してみよう

では、作成したテーブルに実際に線のデータを登録してみましょう。線のデータは、点のときと同様にST_GeomFromText()関数を使ってMySQLに与えます。関数に与える引数であるWKT文字列により、線のデータであることを表現します。

ST_GeomFromText(WKTによる地理情報[, SRS_ID])

今回もSRS_IDは「6668」なので、ST_GeomFromText()の第2引数に与えます。第1引数には先ほどのLINESTRINGのWKTを与えれば良いので、このデータを登録するSQLは次のようになります。

INSERT INTO g2 VALUES( 11, 'LINE1', 
   ST_GeomFromText('LINESTRING(35.745833 140.850812, 35.739563 140.828196, 35.797261 140.722967, 35.833732 140.711981, 35.865178 140.616022, 35.902730 140.562979)', 6668));

登録したデータでは、地理情報のカラムがバイナリであるという点もPOINTのときと一緒です。SRID(0C1A 0000)の後ろにリトルエンディアン(1)、そしてこれが線のデータであることを示す値(0200 0000)が格納されています。複数の点の情報が含まれてるためPOINTのときよりも長いバイナリデータとなります。

mysql> SELECT * FROM g2\G
*************************** 1. row ***************************
  id: 11
name: LINE1
   g: 0x0C1A00000102000000060000006B6116DA399B614087A3AB7477DF4140B2D5E594809A6140732A1900AADE4140CBA2B08B2297614029B000A60CE64140F3CB608CC896614078D0ECBAB7EA4140BAF3C473B6936140FE9B1727BEEE4140B72A89EC039261401D8F19A88CF34140
1 row in set (0.000 sec)

前回紹介したGUIツール「DBeaver」で確認すると、下図のように地図上に線が表示されます。SRS_IDの指定が誤っていたり、そもそも数字が誤っていたりした場合には期待と全然違う場所に表示されるので、正しく位置の情報が登録されていることを自分の目で確認できるツールとして、非常に便利です。

おまけ:長めの線を登録しよう

今回はLINESTRINGデータの使い方の説明として、たった6個の点からなる小さな線を例として取り上げました。 実際に川や道路などの情報を表す場合は、もっとたくさんの点から構成されることも多く、100点を超えるような線データも少なくありません。

ここでは、私が地図上から拾った15点からなる利根川データを登録してみます。このデータでさえ本来の利根川を表すには全くポイントの数が足りておらず、全体の雰囲気を表すだけのデータではありますが、実際にデータを登録して地図上で見てみるとそれっぽく見えて嬉しいものです。

INSERT INTO g2 VALUES
  ( 12, 'Tone', 
    ST_GeomFromText('LINESTRING(35.741549 140.847765,
    35.800324 140.723826, 35.839855 140.703226,
    35.871855 140.602633, 35.904399 140.559374,
    35.918302 140.464274, 35.893552 140.351664,
    35.865735 140.304285, 35.845143 140.148417,
    35.883261 140.097948, 35.944155 139.934183,
    36.132104 139.745012, 36.211368 139.585711,
    36.191144 139.455248,  36.276991 139.170634,
    36.438184 139.036909)',6668));
mysql> SELECT * FROM g2 WHERE id=12\G
*************************** 1. row ***************************
  id: 12
name: Tone
   g: 0x0C1A000001020000001000000031B610E4209B6140D5B0DF13EBDE4140D3BF2495299761401A1A4F0471E641404DF6CFD380966140E8305F5E80EB4140B14F00C54893614052EDD3F198EF414072874D64E69161407EC4AF58C3F3414042CC2555DB8E6140FAEC80EB8AF54140C765DCD4408B614040A374E95FF241403A75E5B3BC89614054008C67D0EE4140742502D5BF846140BFB854A52DEC4140AD16D86322836140876A4AB20EF14140552FBFD3E47D61406DAD2F12DAF8414015E46723D7776140DCD5ABC8E81042400ABDFE24BE726140E1B54B1B0E1B424039F24064916E6140CF69166877184240BE326FD575656140A724EB7074234240B37DC85B2E616140B3D0CE6916384240
1 row in set (0.000 sec)
【コラム】曲線はどう表現するのか

世の中に数ある地理データフォーマットの中には「曲線」(curve)を表現できるものも存在します。しかし、MySQLでは曲線を出すデータ型はありません。公開されている様々な地理情報データを眺めてみても、基本的には曲線部分の表現方法として短い直線を何本かつないで表しているようです。

実例としては、交差点の角が丸く取れている部分の表現として、6個ぐらいの中間ポイントを置いてカーブのように見せているデータに出会ったことがあります。

この記事のキーワード

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored