MySQL 8.0.23で、Spatial(GIS)関連機能として、フレシェ距離を求める関数 ST_GrechetDistance() と、ハウスドルフ距離を求める関数 ST_HausdorffDistance() が追加されました。どちらも、2つのジオメトリどうしの類似度を求める関数のようですが、今ひとつよく分からないので、今日は主にフレシェ距離を中心に色々と動作を試してみて、「こういうことかな?」の理解を試みました。 想像して、試して、結果に納得する、という作業ですので、正しくない理解を書いているかもしれません。お気づきの方は、やさしくお教えいただければ幸いです。 フレシェ距離とは ざっく…
この日記は、 RDBMS-GIS(MySQL,PostgreSQLなど) Advent Calendar 2020 の14日目ぶんとして後から書いているものです。 この日記は QGISという GISの専用ツールがあります。 QGIS が何かについては私も語るほど整理できた情報を持っていないので、とにかく地理情報(緯度経度等の情報)のデータを、表示したり色々したりできるツールです(雑な説明)。 この、QGISからMySQLにアクセスし、MySQLのデータを表示する試みを紹介します。本日記ではとりあえず、Windows上で MySQLに接続して、テーブルまるごと表示するところまでです。 概要 実は…
この日記は、RDBMS-GIS(MySQL,PostgreSQLなど) Advent Calendar 2020 の7日目ぶん(あいていたので後から埋めてます)の記事です。 この日記は 世の中の地理情報データ(位置の情報を含んだデータ)には、shapefile というファイル形式で公開されているものが非常にたくさんあります。この日記では、shapefileのデータをMySQL に取り込む方法として、私が開発している shp2sql というツールを紹介します。 shp2sql の入手 shp2sql は単一の Python スクリプトです。github にて公開しています。以下のURLから sh…
この日記は、RDBMS-GIS(MySQL,PostgreSQLなど) Advent Calendar 2020 の 17日目のエントリーです。 はじめに MySQLで取り扱うことができる空間情報の型には、点、線、ポリゴン があります。それぞれ にそれらの集合を扱える型が存在してるので、都合6つとなります。これら相互の変換について考えてみたいと思います。なお、緑色線は本日記および今後の日記にて紹介を予定しているものです(スマートなやり方ではなく力ワザ(ちからわざ)のものも含む)。赤い点線は、今のところ試したことがないもの。 今回使うデータ 今回のお試しの範囲では、テーブルにデータを入れておく必…
この日記は、RDBMS-GIS(MySQL,PostgreSQLなど) Advent Calendar 2020 の16日目の記事です。 何をしたいか 先日の日記で雑に作成した大量のPOINTデータを使って、ある点から一定距離内にある点を検索します。普通にやると結構時間がかかりますが、空間インデックスがきちんと使用されて高速に検索できるところがポイントです。POINTの話だけに。 先日のデータ 先日の日記で書いたスクリプトを使って、テーブル sp1 に、約29万件のデータを作成しました。 mysql> select COUNT(*) FROM sp1; +----------+ | COUNT…
これは、RDBMS-GIS(MySQL,PostgreSQLなど) Advent Calendar 2020 の11日目のエントリだったはずのものです。実際には3日ほど遅れてしまいました。 MySQLで、空間情報を扱う動作の確認をしたいときに、ちょっとばかり多めのデータが欲しくなることがあります。 実際の世の中のデータを取り込む形で実現しても良いのですが、ある一定の範囲内に存在する点の分量を自由に増減できない点は不便です。 ということで、とってもザツに大量データを作成する機会があったので、本日記ではその方法を披露。 とりあえずテーブルを作る とりあえず ID めいたものと、POINT型のカラム…
緯度と経度それぞれが別々のカラムに格納されているデータに対して、生成列を使ってGEOMETRY型のカラムとして扱えるようにする方法を考えてみました。速度面で何かディスアドバンテージがあるのか否かは未知数ですが、こんな方法もあるのだというヒントになればと思い、書いてみました。
元データの用意
まず、緯度、経度それぞれが別々のカラムに格納されているテーブル spot1 を作成し、データを投入します。
DROP TABLE IF EXISTS spot1; CREATE TABLE spot1 ( id integer auto_increment, name varchar(256) , lat double , lng double , PRIMARY KEY (id) ); INSERT INTO spot1 (name, lat, lng) VALUES ('サークルハッピー寺院', 35.16110304 ,136.87678426); INSERT INTO spot1 (name, lat, lng) VALUES ('旋法学園螺旋', 35.16814112 ,136.88577498); INSERT INTO spot1 …[さらに読む]
訳あって、MySQLで「GEOMETRY型のカラムに、いったん
SRID=0で登録したあと、一気に正しいSRIDに変換する」ということをやろうとしたところ、思惑通りにいかず随分悩んだので、整理しておきます。
やろうとしたこととエラー発生
ここではシンプルな例に置き換えた再現実験で紹介します。
まず、GEOMETRY型を入れられるテーブルを作りデータを1件登録します。
CREATE TABLE g1 (g GEOMETRY); INSERT INTO g1 VALUES (ST_GeomFromText("POINT(35 135)"));
SRIDを指定していないので、SRID=0で登録されています。axis-orderは lat-long です(というか、そうなっていることを期待して登録しました)。登録された内容を確認してみます。
mysql> SELECT …[さらに読む]