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

第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

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30