[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10. MySQL における空間情報の機能

MySQL 4.1 では空間情報を扱う機能が導入され、地理的特性の生成、格納、分析が可能になっています。 地理情報は現在、MyISAM テーブルに対してのみ使用することができます。

この章で取り上げるトピックは以下のとおりです。

10.1 はじめに   
10.2 OpenGIS ジオメトリモデル   
10.3 サポートされている空間データ形式   
10.4 空間的に有効な MySQL データベースの作成   
10.5 空間情報の分析   
10.6 空間分析の最適化   
10.7 MySQL の適合性と互換性   


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.1 はじめに

MySQL は、Open GIS Consortium(OGC)の仕様に準拠した空間情報の機能を実装します。OGC は、合計 250 を超える団体からなる国際コンソーシアムです。加盟している企業、政府機関、大学では、公開可能な概念ソリューションを開発しており、それらのソリューションは、空間データを管理するあらゆるアプリケーションで使用できるものです。 OGC の Web サイトは http://www.opengis.org/ です。

1997 年、Open GIS Consortium は OpenGIS (R) Simple Features Specifications For SQL を公開しました。この文書では、SQL RDBMS を拡張して空間データをサポートするための概念的な手法がいくつか提案されています。この仕様は、Open GIS Web サイト(http://www.opengis.org/techno/implementation.htm )で入手可能であり、この章の補足情報が記載されています。

MySQL は、OGC により提案されているジオメトリタイプを有する SQL 環境のサブセットを実装します。 これは、ジオメトリタイプのセットにより拡張された SQL 環境のことです。ジオメトリ値を持つ SQL カラムは、ジオメトリタイプのカラムとして実装されます。仕様には、SQL ジオメトリタイプのセットと、ジオメトリ値の作成と分析に使用される、これらのタイプの各種関数について記述されています。

地理的特性とは、実世界において位置を持つ存在を指します。 地理的特性の例を以下に示します。

また、geospatial(地理空間) という用語が使用されている文書を探し、地理空間について詳しい情報を得ることもできます。

ジオメトリは、地理情報の機能を表す別の用語です。ジオメトリは本来、数学の一分野である幾何学を意味します。 もう 1 つの意味は地図作成法に由来し、地図の作成時に使用される地理的な特性を指します。

この章では、地理的特性地理空間特性地物ジオメトリをすべて同義語として使用しています。 使用頻度が最も高い用語はジオメトリです。

ここでは、ジオメトリ位置を持ち存在を表すポイントまたはポイントの集まりと定義します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.2 OpenGIS ジオメトリモデル

OGC のジオメトリタイプを有する SQL 環境で提案されているジオメトリタイプのセットは、OpenGIS ジオメトリモデルに基づきます。このモデルでは、各ジオメトリオブジェクトに以下の汎用特性があります。

10.2.1 ジオメトリクラス階層   
10.2.2 Geometry クラス   
10.2.3 クラス Point   
10.2.4 Curve クラス   
10.2.5 LineString クラス   
10.2.6 Surface クラス   
10.2.7 Polygon クラス   
10.2.8 GeometryCollection クラス   
10.2.9 MultiPoint クラス   
10.2.10 MultiCurve クラス   
10.2.11 MultiLineString クラス   
10.2.12 MultiSurface クラス   
10.2.13 MultiPolygon クラス   


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.2.1 ジオメトリクラス階層

ジオメトリクラスの階層は以下のとおりです。

これらのクラスの一部は抽象クラス(インスタンス化できないクラス)です。つまり、これらのクラスのオブジェクトを作成することはできません。他のクラスはインスタンス化が可能であり、オブジェクトを作成することができます。 各クラスにはプロパティがあり、インスタンス化可能なクラスにはアサート(有効なクラスインスタンスを定義するルール)が含まれている場合があります。

Geometry は基本クラスです。これは抽象クラスです。 Geometry のインスタンス化可能サブクラスは、2 次元の座標空間に存在する 0 次元、1 次元、2 次元のジオメトリオブジェクトに制限されています。インスタンス化可能なジオメトリクラスはすべて、有効なインスタンスが位相的に閉じるように定義されています(すべての定義済みジオメトリには境界が含まれています)。

基本 Geometry クラスには、PointCurveSurfaceGeometryCollection のサブクラスがあります。

GeometryCurveSurfaceMultiCurveMultiSurface は、インスタンス化できないクラスとして定義されます。 これらのクラスには、それぞれのサブクラス用メソッドの共通セットが定義されています。これらは拡張目的で含まれています。

PointLineStringPolygonGeometryCollectionMultiPointMultiLineStringMultiPolygon はインスタンス化が可能なクラスです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.2.2 Geometry クラス

Geometry は階層のルートクラスです。これはインスタンス化できないクラスですが、Geometry サブクラスから作成されたすべてのジオメトリの値に対して共通な多数のプロパティを含んでいます。 これらのプロパティを以下に示します。特定のサブクラスには固有のプロパティがありますが、それについては後述します。

ジオメトリのプロパティ

ジオメトリ値には以下のプロパティがあります。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.2.3 クラス Point

Point は、座標空間における単一の場所を表すジオメトリです。

Point の例

Point のプロパティ


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.2.4 Curve クラス

Curve は 1 次元のジオメトリであり、通常は一連の Point によって表現されます。Curve の特定のサブクラスでは、Point 間の内挿が定義されます。Curve はインスタンス化できないクラスです。

Curve のプロパティ


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.2.5 LineString クラス

LineString は、Point 間が直線補間されている Curve です。

LineString の例

LineString のプロパティ


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.2.6 Surface クラス

Surface は 2 次元のジオメトリです。インスタンス化できないクラスであり、その下に属するインスタンス化可能なサブクラスは Polygon だけです。

Surface のプロパティ


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.2.7 Polygon クラス

Polygon は、複数の辺を持つジオメトリを表す平面 Surface です。単一の外部境界および 0 以上の内部境界によって定義されます。内部境界はそれぞれ Polygon 内の穴を定義します。

Polygon の例

Polygon のアサート

上記のアサートでは、Polygon は単純なジオメトリです。これらのアサートにより、Polygon は単純なジオメトリになります。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.2.8 GeometryCollection クラス

GeometryCollection は単一のジオメトリですが、任意クラスのジオメトリ(1 つ以上)のコレクションとなっています。

GeometryCollection に含まれる要素はすべて、同じ座標系に存在していなければなりません。 GeometryCollection では、他の制限を要素に課していません。ただし、以降で説明する GeometryCollection のサブクラスによってメンバーシップが制限されることがあります。制限は以下に基づきます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.2.9 MultiPoint クラス

MultiPoint は、Point 要素で構成されるジオメトリコレクションです。各ポイントは接続されておらず、順序付けられてもいません。

MultiPoint の例

MultiPoint のプロパティ


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.2.10 MultiCurve クラス

MultiCurve は、Curve 要素で構成されるジオメトリコレクションです。MultiCurve はインスタンス化できないクラスです。

MultiCurve のプロパティ


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.2.11 MultiLineString クラス

MultiLineString は、LineString 要素で構成される MultiCurve ジオメトリコレクションです。

MultiLineString の例


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.2.12 MultiSurface クラス

MultiSurface は、地表面要素で構成されるジオメトリコレクションです。 MultiSurface はインスタンス化できないクラスであり、その下に属するインスタンス化可能なサブクラスは MultiPolygon だけです。

MultiSurface のアサート


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.2.13 MultiPolygon クラス

MultiPolygon は、Polygon 要素で構成される MultiSurface オブジェクトです。

MultiPolygon の例

MultiPolygon のアサート

MultiPolygon のプロパティ


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.3 サポートされている空間データ形式

このセクションでは、クエリでジオメトリオブジェクトを表現するために使用される標準的な空間データ形式について説明します。 具体的には、以下のデータ形式が対象となります。

MySQL でジオメトリ値が内部的に保存される形式は、WKT 形式でも WKB 形式でもありません。

10.3.1 Well-Known Text(WKT)形式   
10.3.2 Well-Known Binary(WKB)形式   


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.3.1 Well-Known Text(WKT)形式

ジオメトリの Well-Known Text(WKT)表現は、ジオメトリデータを ASCII 形式で交換するためのものです。

ジオメトリオブジェクトの WKT の例

WKT 値を記述するための正式なプロダクションルールを指定する Backus-Naur 文法については、この章の冒頭で言及されている OGC 仕様書を参照してください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.3.2 Well-Known Binary(WKB)形式

ジオメトリック値の Well-Known Binary(WKB)表現は、OpenGIS 仕様によって定義されています。 また、ISO "SQL/MM Part 3: Spatial" 標準でも定義されています。

ジオメトリック WKB 情報を含む BLOB 値で表現されるバイナリストリームとしてジオメトリ値を交換するために、WKB を使用します。

1 バイトの符号なし整数、4 バイトの符号なし整数、8 バイトの倍精度数値(IEEE 754 形式)が WKB によって使用されます。1 バイトは 8 ビットです。

たとえば WKB 値が POINT(1 1) に対応する場合、この値は次の 21 バイトの連続(ここでは 2 桁の 16 進数で 1 バイト)で構成されます。

 
0101000000000000000000F03F000000000000F03F

上記の数値は以下の構成要素に分割できます。

 
Byte order : 01
WKB type   : 01000000
X          : 000000000000F03F
Y          : 000000000000F03F

構成要素の表現は以下のとおりです。

より複雑なジオメトリ値に対応する WKB 値は、より複雑なデータ構造で表現されます(詳細については OpenGIS 仕様を参照してください)。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.4 空間的に有効な MySQL データベースの作成

このセクションでは、MySQL で空間データを表現するために使用できるデータ型と、空間値の作成および検索に使用できる関数について説明します。

10.4.1 MySQL 空間データ型   
10.4.2 空間情報の値の作成   
10.4.3 空間情報カラムの作成   
10.4.4 空間情報カラムへのデータ入力   
10.4.5 空間データの取り込み   


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.4.1 MySQL 空間データ型

MySQL には、OpenGIS ジオメトリモデルのクラス階層内のクラスに対応するデータ型のセットが用意されています。これらのデータ型には、単一ジオメトリ値を保持するものもあります。

GEOMETRY は、単一値データ型のうちで最も汎用的であり、どのタイプのジオメトリ値でも格納できます。 他の単一値データ型では、特定かつ単一のジオメトリタイプに値が制限されます。

上記以外のデータ型では、値のコレクションが保持されます。

GEOMETRYCOLLECTION では、あらゆるタイプのオブジェクトのコレクションを格納できます。他のコレクションタイプでは、コレクションメンバは特定のジオメトリタイプを持つものに制限されます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.4.2 空間情報の値の作成

このセクションでは、Well-Known Text および Well-Known Binary 関数(OpenGIS 標準で定義)と MySQL 固有の関数を使用して空間情報の値を作成する方法について説明します。

10.4.2.1 WKT 関数によるジオメトリ値の作成   
10.4.2.2 WKB 関数によるジオメトリ値の作成   
10.4.2.3 MySQL 固有の関数によるジオメトリ値の作成   


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.4.2.1 WKT 関数によるジオメトリ値の作成

MySQL には、Well-Known Text 表現(およびオプションとして空間参照系 ID(SRID))を入力パラメータとして受け取り、対応するジオメトリを返す関数が多数用意されています。

GeomFromText() は、任意のジオメトリタイプの WKT を最初の引数として受け取ります。タイプ固有の作成関数も用意されており、これらは各ジオメトリタイプのジオメトリ値を生成するために使用されます。

GeomFromText(wkt[,srid])
GeometryFromText(wkt[,srid])
WKT 表現と SRID を使用して、任意のタイプのジオメトリ値を生成する。

PointFromText(wkt[,srid])
WKT 表現と SRID を使用して、POINT 値を生成する。

LineFromText(wkt[,srid])
LineStringFromText(wkt[,srid])
WKT 表現と SRID を使用して、LINESTRING 値を生成する。

PolyFromText(wkt[,srid])
PolygonFromText(wkt[,srid])
WKT 表現と SRID を使用して、POLYGON 値を生成する。

MPointFromText(wkt[,srid])
MultiPointFromText(wkt[,srid])
WKT 表現と SRID を使用して、MULTIPOINT 値を生成する。

MLineFromText(wkt[,srid])
MultiLineStringFromText(wkt[,srid])
WKT 表現と SRID を使用して、MULTILINESTRING 値を生成する。

MPolyFromText(wkt[,srid])
MultiPolygonFromText(wkt[,srid])
WKT 表現と SRID を使用して、MULTIPOLYGON 値を生成する。

GeomCollFromText(wkt[,srid])
GeometryCollectionFromText(wkt[,srid])
WKT 表現と SRID を使用して、GEOMETRYCOLLECTION 値を生成する。

Ring または閉じた LineString 値のコレクションの WKT 表現に基づいて Polygon 値または MultiPolygon 値を生成するためのオプション関数についても、OpenGIS 仕様に記述されています。これらの値は交差できます。これらの関数は、MySQL にまだ実装されていません。

BdPolyFromText(wkt,srid)
閉じた LineString 値から成る任意のコレクションが含まれている MultiLineString 値(WKT 形式)から Polygon 値を生成する。

BdMPolyFromText(wkt,srid)
閉じた LineString 値から成る任意のコレクションが含まれている MultiLineString 値(WKT 形式)から MultiPolygon 値を生成する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.4.2.2 WKB 関数によるジオメトリ値の作成

Well-Known Binary 表現が含まれている BLOB(およびオプションとして空間参照系 ID(SRID))を入力パラメータとして受け取り、対応するジオメトリを返す関数が MySQL に多数用意されています。

GeomFromWKT() は、任意のジオメトリタイプの WKB を最初の引数として受け取ります。タイプ固有の作成関数も用意されており、これらは各ジオメトリタイプのジオメトリ値を生成するために使用されます。

GeomFromWKB(wkb[,srid])
GeometryFromWKB(wkt[,srid])
WKB 表現と SRID を使用して、任意のタイプのジオメトリ値を生成する。

PointFromWKB(wkb[,srid])
WKB 表現と SRID を使用して、POINT 値を生成する。

LineFromWKB(wkb[,srid])
LineStringFromWKB(wkb[,srid])
WKB 表現と SRID を使用して、LINESTRING 値を生成する。

PolyFromWKB(wkb[,srid])
PolygonFromWKB(wkb[,srid])
WKB 表現と SRID を使用して、POLYGON 値を生成する。

MPointFromWKB(wkb[,srid])
MultiPointFromWKB(wkb[,srid])
WKB 表現と SRID を使用して、MULTIPOINT 値を生成する。

MLineFromWKB(wkb[,srid])
MultiLineStringFromWKB(wkb[,srid])
WKB 表現と SRID を使用して、MULTILINESTRING 値を生成する。

MPolyFromWKB(wkb[,srid])
MultiPolygonFromWKB(wkb[,srid])
WKB 表現と SRID を使用して、MULTIPOLYGON 値を生成する。

GeomCollFromWKB(wkb[,srid])
GeometryCollectionFromWKB(wkt[,srid])
WKB 表現と SRID を使用して、GEOMETRYCOLLECTION 値を生成する。

Ring または閉じた LineString 値のコレクションの WKB 表現に基づいて Polygon または MultiPolygon を生成するためのオプション関数についても、OpenGIS 仕様に記述されています。これらの値は交差できます。これらの関数は、MySQL にまだ実装されていません。

BdPolyFromWKB(wkb,srid)
閉じた LineString 値から成る任意のコレクションが含まれている MultiLineString 値(WKB 形式)から Polygon 値を生成する。

BdMPolyFromWKB(wkb,srid)
閉じた LineString 値から成る任意のコレクションが含まれている MultiLineString 値(WKB 形式)から MultiPolygon 値を生成する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.4.2.3 MySQL 固有の関数によるジオメトリ値の作成

注意: このセクションで取り上げる関数は、MySQL にまだ実装されていません。

ジオメトリ WKB 表現を作成する際に役立つ関数が MySQL に用意されています。このセクションで説明する関数は、OpenGIS 仕様に対する MySQL 拡張です。これらの関数の結果、SRID のないジオメトリ値の WKB 表現を含む BLOB 値が返されます。 これらの関数の結果は、GeomFromWKB() 関数ファミリに含まれるどの関数についても、最初の引数として代用できます。

Point(x,y)
座標を使用して WKB Point を生成する。

MultiPoint(pt1,pt2,...)
WKB Point 引数を使用して WKB MultiPoint 値を生成する。 いずれかの引数が WKBPoint でない場合、返り値は NULL になる。

LineString(pt1,pt2,...)
WKB Point 引数から WKB LineString 値を生成する。いずれかの引数が WKB Point でない場合、返り値は NULL になる。Point 引数が 2 個に満たない場合、返り値は NULL になる。

MultiLineString(ls1,ls2,...)
WKB LineString 引数を使用して WKB MultiLineString 値を生成する。いずれかの引数が LineString でない場合、返り値は NULL になる。

Polygon(ls1,ls2,...)
WKB LineString 引数から WKB Polygon 値を生成する。いずれかの引数が LinearRing のWKB を表さない場合(閉じている単純な LineString でない場合)、返り値は NULL になる。

MultiPolygon(poly1,poly2,...)
WKB Polygon 引数から WKB MultiPolygon 値を生成する。 いずれかの引数が WKB Polygon でない場合、返り値は NULL になる。

GeometryCollection(g1,g2,...)
WKB GeometryCollection を生成する。いずれかの引数がジオメトリの WKB 表現として適切ではない場合、返り値は NULL になる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.4.3 空間情報カラムの作成

ジオメトリタイプに対して空間情報カラムを作成する標準的な方法が MySQL に用意されています(たとえば CREATE TABLE または ALTER TABLE を使用)。 空間情報カラムは現在、MyISAM テーブルに対してのみサポートされています。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.4.4 空間情報カラムへのデータ入力

作成した空間情報カラムには、空間データを入力することができます。

値は内部ジオメトリ形式で格納する必要がありますが、Well-Known Text(WKT)または Well-Known Binary(WKB)形式から内部ジオメトリ形式に変換することも可能です。WKT 値を内部ジオメトリ形式に変換してジオメトリ値をテーブルに挿入する方法を、以下の例に示します。

この変換は、INSERT ステートメントで直接実行することができます。

 
INSERT INTO geom VALUES (GeomFromText('POINT(1 1)'));

SET @g = 'POINT(1 1)';
INSERT INTO geom VALUES (GeomFromText(@g));

INSERT の前に変換が実行される場合もあります。

 
SET @g = GeomFromText('POINT(1 1)');
INSERT INTO geom VALUES (@g);

以下の例では、より複雑なジオメトリをテーブルに挿入しています。

 
SET @g = 'LINESTRING(0 0,1 1,2 2)';
INSERT INTO geom VALUES (GeomFromText(@g));

SET @g = 'POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))';
INSERT INTO geom VALUES (GeomFromText(@g));

SET @g = 'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))';
INSERT INTO geom VALUES (GeomFromText(@g));

前述したいずれの例でも、GeomFromText() を使用してジオメトリ値を作成しています。タイプ固有の関数を使用することもできます。

 
SET @g = 'POINT(1 1)';
INSERT INTO geom VALUES (PointFromText(@g));

SET @g = 'LINESTRING(0 0,1 1,2 2)';
INSERT INTO geom VALUES (LineStringFromText(@g));

SET @g = 'POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))';
INSERT INTO geom VALUES (PolygonFromText(@g));

SET @g = 'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))';
INSERT INTO geom VALUES (GeomCollFromText(@g));

注意: クライアントアプリケーションプログラムは、ジオメトリ値の WKB 表現を使用する場合、正しい形式の WKB をクエリでサーバに送信しなければなりません。この要件を満たすにはいくつかの方法があります。たとえば、以下のようにします。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.4.5 空間データの取り込み

テーブルに格納されたジオメトリ値は、内部形式に変換して取り込めます。この値は WKT または WKB 形式に変換することもできます。

10.4.5.1 空間データの取り込み(内部形式を使用)   
10.4.5.2 空間データの取り込み(WKT 形式を使用)   
10.4.5.3 空間データの取り込み(WKB 形式を使用)   


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.4.5.1 空間データの取り込み(内部形式を使用)

内部形式によるジオメトリ値の取り込みは、テーブル間の転送に有効です。

 
CREATE TABLE geom2 (g GEOMETRY) SELECT g FROM geom;


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.4.5.2 空間データの取り込み(WKT 形式を使用)

AsText() 関数では、ジオメトリ値をテキストとして使用することができます。この関数は、ジオメトリを内部形式から WKT 文字列に変換します。

 
mysql> SELECT AsText(g) FROM geom;
+-------------------------+
| AsText(p1)              |
+-------------------------+
| POINT(1 1)              |
| LINESTRING(0 0,1 1,2 2) |
+-------------------------+


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.4.5.3 空間データの取り込み(WKB 形式を使用)

AsBinary() 関数では、ジオメトリ値をバイナリとして使用することができます。 この関数は、ジオメトリを内部形式から BLOB(WKB 値を含む)に変換します。

 
SELECT AsBinary(g) FROM geom;


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.5 空間情報の分析

10.5.1 ジオメトリの形式を変換する関数   
10.5.2 Geometry プロパティ分析関数   
10.5.3 既存ジオメトリから新規ジオメトリを作成する関数   
10.5.4 ジオメトリオブジェクト間の空間的関係をテストするための関数   
10.5.5 最小外接矩形(MBR)における関係   
10.5.6 ジオメトリ間の空間関係をテストする関数   

空間情報カラムに値を入力した後は、クエリと分析を行うことができます。空間データに対して各種の操作を実行するための関数が MySQL に用意されています。これらの関数は、実行する操作に基づき 4 つの主要なカテゴリに分類されます。

以下のような多くの状況で、空間情報の分析関数を使用することができます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.5.1 ジオメトリの形式を変換する関数

MySQL でサポートされている以下の関数では、WKT または WKB 形式と内部形式間でジオメトリ値を変換することができます。

GeomFromText(wkt[,srid])
文字列値を WKT 表現から内部ジオメトリ形式へと変換し、結果を返す。 タイプ固有の関数も数多くサポートされている(PointFromText()LineFromText() など)。 「10.4.2.1 WKT 関数によるジオメトリ値の作成」 参照。.

GeomFromWKB(wkb[,srid])
バイナリ値を WKB 表現から内部ジオメトリ形式へと変換し、結果を返す。 タイプ固有の関数も数多くサポートされている(PointFromWKB()LineFromWKB() など)。 「10.4.2.2 WKB 関数によるジオメトリ値の作成」 参照。

AsText(g)
内部ジオメトリ形式の値を WKT 表現に変換し、結果文字列を返す。

 
mysql> SET @g = 'LineString(1 1,2 2,3 3)';
mysql> SELECT AsText(GeomFromText(@g));
+--------------------------+
| AsText(GeomFromText(@G)) |
+--------------------------+
| LINESTRING(1 1,2 2,3 3)  |
+--------------------------+

AsBinary(g)
内部ジオメトリ形式の値を WKB 表現に変換し、結果のバイナリ値を返す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.5.2 Geometry プロパティ分析関数

このグループに属す関数は、ジオメトリ値を引数として使用し、ジオメトリの質的または量的プロパティを返します。一部の関数では、引数のタイプが制限されています。そのような関数は、引数のジオメトリタイプが不正な場合に NULL を返します。たとえば、オブジェクトタイプが PolygonMultiPolygon のいずれでもない場合、Area()NULL を返します。

10.5.2.1 汎用 Geometry プロパティ分析関数   
10.5.2.2 Point プロパティ分析関数   
10.5.2.3 LineString プロパティ分析関数   
10.5.2.4 MultiLineString プロパティ分析関数   
10.5.2.5 Polygon プロパティ分析関数   
10.5.2.6 MultiPolygon プロパティ分析関数   
10.5.2.7 GeometryCollection プロパティ分析関数   


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.5.2.1 汎用 Geometry プロパティ分析関数

このセクションに列挙されている関数には引数に対する制限はなく、どのタイプのジオメトリ値も受け入れられます。

GeometryType(g)
ジオメトリインスタンス g がメンバになっているジオメトリタイプの名称を文字列として返す。 この名称は、インスタンス化可能な Geometry サブクラスの 1 つに対応する。

 
mysql> SELECT GeometryType(GeomFromText('POINT(1 1)'));
+------------------------------------------+
| GeometryType(GeomFromText('POINT(1 1)')) |
+------------------------------------------+
| POINT                                    |
+------------------------------------------+

Dimension(g)
ジオメトリ値 g 固有の次元を返す。結果は -1、0、1、2 のいずれか(これらの値の意味については 「10.2.2 Geometry クラス」 を参照)。

 
mysql> SELECT Dimension(GeomFromText('LineString(1 1,2 2)'));
+------------------------------------------------+
| Dimension(GeomFromText('LineString(1 1,2 2)')) |
+------------------------------------------------+
|                                              1 |
+------------------------------------------------+

SRID(g)
ジオメトリ値 g の空間参照系 ID を示す整数を返す。

 
mysql> SELECT SRID(GeomFromText('LineString(1 1,2 2)',101));
+-----------------------------------------------+
| SRID(GeomFromText('LineString(1 1,2 2)',101)) |
+-----------------------------------------------+
|                                           101 |
+-----------------------------------------------+

Envelope(g)
ジオメトリ値 g の最小外接矩形(MBR)を返す。 結果は Polygon 値として返す。

 
mysql> SELECT AsText(Envelope(GeomFromText('LineString(1 1,2 2)')));
+-------------------------------------------------------+
| AsText(Envelope(GeomFromText('LineString(1 1,2 2)'))) |
+-------------------------------------------------------+
| POLYGON((1 1,2 1,2 2,1 2,1 1))                        |
+-------------------------------------------------------+

境界ボックスのコーナーポイントによって、Polygon が定義される。

 
POLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))

OpenGIS 仕様では以下の関数も定義していますが、これらは MySQL でまだ実装されていません。

Boundary(g)
ジオメトリ値 g の組み合わせ境界の終わりとなるジオメトリを返す。

IsEmpty(g)
ジオメトリ値 g が空白ジオメトリであれば 1、空白でなければ 0、引数が NULL であれば -1 を返す。 ジオメトリが空の場合、空の Point セットを表す。

IsSimple(g)

現在、この関数はプレースホルダとなっており、使用すべきではない。 実装された場合の機能については、以下のとおり。

ジオメトリ値 g に不正な(自己交差や自己接触が起きている)ジオメトリ Point がない場合、1 を返す。IsSimple() は、引数が単純であれば 0、引数が NULL であれば -1 を返す。

インスタンス化可能な各ジオメトリクラスについては該当するセクションで説明したが、そこで、そのクラスのインスタンスが非単純と分類される場合の特定の条件について説明している。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.5.2.2 Point プロパティ分析関数

Point はX 座標と Y 座標から構成されますが、これらは以下の関数を使用して取得できます。

X(p)
Point p の X 座標値を倍精度の数値として返す。
 
mysql> SELECT X(GeomFromText('Point(56.7 53.34)'));
+--------------------------------------+
| X(GeomFromText('Point(56.7 53.34)')) |
+--------------------------------------+
|                                 56.7 |
+--------------------------------------+

Y(p)
Point p の Y 座標値を倍精度の数値として返す。
 
mysql> SELECT Y(GeomFromText('Point(56.7 53.34)'));
+--------------------------------------+
| Y(GeomFromText('Point(56.7 53.34)')) |
+--------------------------------------+
|                                53.34 |
+--------------------------------------+


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.5.2.3 LineString プロパティ分析関数

LineStringPoint 値で構成されます。LineString に関し、その特定 Point を抽出するか、含まれている Point 数をカウントするか、その長さを取得することができます。

EndPoint(ls)
LineStringls の終点となっている Point を返す。

 
mysql> SELECT AsText(EndPoint(GeomFromText('LineString(1 1,2 2,3 3)')));
+------------------------------------------------------------+
| AsText(EndPoint(GeomFromText('LineString(1 1,2 2,3 3)')))  |
+------------------------------------------------------------+
| POINT(3 3)                                                 |
+------------------------------------------------------------+

GLength(ls)
関連する空間参照における LineStringls の長さを倍精度の数値として返す。

 
mysql> SELECT GLength(GeomFromText('LineString(1 1,2 2,3 3)'));
+--------------------------------------------------+
| GLength(GeomFromText('LineString(1 1,2 2,3 3)')) |
+--------------------------------------------------+
|                                  2.8284271247462 |
+--------------------------------------------------+

IsClosed(ls)
LineStringls が閉じている(StartPoint() 値と EndPoint() 値が一致する)場合、1 を返す。 ls が閉じてなければ 0、NULL であれば -1 を返す。

 
mysql> SELECT IsClosed(GeomFromText('LineString(1 1,2 2,3 3)'));
+---------------------------------------------------+
| IsClosed(GeomFromText('LineString(1 1,2 2,3 3)')) |
+---------------------------------------------------+
|                                                 0 |
+---------------------------------------------------+

NumPoints(ls)
LineStringls における Point 数を返す。

 
mysql> SELECT NumPoints(GeomFromText('LineString(1 1,2 2,3 3)'));
+----------------------------------------------------+
| NumPoints(GeomFromText('LineString(1 1,2 2,3 3)')) |
+----------------------------------------------------+
|                                                  3 |
+----------------------------------------------------+

PointN(ls,n)
LineStringls における n 番目の Point を返す。 Point 番号は 1 から始まる。

 
mysql> SELECT AsText(PointN(GeomFromText('LineString(1 1,2 2,3 3)'),2));
+-----------------------------------------------------------+
| AsText(PointN(GeomFromText('LineString(1 1,2 2,3 3)'),2)) |
+-----------------------------------------------------------+
| POINT(2 2)                                                |
+-----------------------------------------------------------+

StartPoint(ls)
LineStringls の始点となっている Point を返す。

 
mysql> SELECT AsText(StartPoint(GeomFromText('LineString(1 1,2 2,3 3)')));
+-------------------------------------------------------------+
| AsText(StartPoint(GeomFromText('LineString(1 1,2 2,3 3)'))) |
+-------------------------------------------------------------+
| POINT(1 1)                                                  |
+-------------------------------------------------------------+

OpenGIS 仕様では以下の関数も定義していますが、これは MySQL でまだ実装されていません。

IsRing(ls)
LineStringls が閉じており(StartPoint() 値と EndPoint() 値が一致)、かつ、単純である(同じ Point を 2 回以上通過しない)場合、1 を返す。 ls が Ring でなければ 0、NULL であれば -1 を返す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.5.2.4 MultiLineString プロパティ分析関数

GLength(mls)
MultiLineStringmls の長さを倍精度の数値として返す。mls の長さは、要素の長さを合計した値と一致する。

 
mysql> SELECT GLength(GeomFromText('MultiLineString((1 1,2 2,3 3),(4 4,5 5))'));
+-------------------------------------------------------------------+
| GLength(GeomFromText('MultiLineString((1 1,2 2,3 3),(4 4,5 5))')) |
+-------------------------------------------------------------------+
|                                                   4.2426406871193 |
+-------------------------------------------------------------------+

IsClosed(mls)
MultiLineStringmls が閉じている(mls で各 LineString に対する StartPoint() 値と EndPoint() 値が一致する)場合、1 を返す。 mls が閉じていなければ 0、NULL であれば -1 を返す。

 
mysql> SELECT IsClosed(GeomFromText('MultiLineString((1 1,2 2,3 3),(4 4,5 5))'));
+--------------------------------------------------------------------+
| IsClosed(GeomFromText('MultiLineString((1 1,2 2,3 3),(4 4,5 5))')) |
+--------------------------------------------------------------------+
|                                                                  0 |
+--------------------------------------------------------------------+


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.5.2.5 Polygon プロパティ分析関数

Area(poly)
空間参照系での測定に基づいて、Polygonpoly の領域を倍精度の数値として返す。

 
mysql> SELECT Area(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'));
+----------------------------------------------------------------------------+
| Area(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))')) |
+----------------------------------------------------------------------------+
|                                                                          8 |
+----------------------------------------------------------------------------+

NumInteriorRings(poly)
Polygonpoly における内部 Ring 数を返す。
 
mysql> SELECT NumInteriorRings(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'));
+----------------------------------------------------------------------------------------+
| NumInteriorRings(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))')) |
+----------------------------------------------------------------------------------------+
|                                                                                      1 |
+----------------------------------------------------------------------------------------+

ExteriorRing(poly)
Polygonpoly の外部 Ring を LineString として返す。
 
mysql> SELECT AsText(ExteriorRing(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))')));
+--------------------------------------------------------------------------------------------+
| AsText(ExteriorRing(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'))) |
+--------------------------------------------------------------------------------------------+
| LINESTRING(0 0,0 3,3 3,3 0,0 0)                                                            |
+--------------------------------------------------------------------------------------------+

InteriorRingN(poly,n)
Polygonpolyn 番目の内部 Ring を LineString として返す。 Ring 番号は 1 から始まる。
 
mysql> SELECT AsText(InteriorRingN(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'),1));
+-----------------------------------------------------------------------------------------------+
| AsText(InteriorRingN(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'),1)) |
+-----------------------------------------------------------------------------------------------+
| LINESTRING(1 1,1 2,2 2,2 1,1 1)                                                               |
+-----------------------------------------------------------------------------------------------+

OpenGIS 仕様では以下の関数も定義していますが、これらは MySQL でまだ実装されていません。

Centroid(poly)
Polygonpoly の数学的な重心を Point として返す。結果が Polygon 上に存在することは保証されない。

PointOnSurface(poly)
Polygonpoly に存在することが保証される Point 値を返す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.5.2.6 MultiPolygon プロパティ分析関数

Area(mpoly)

空間参照系での測定に基づいて、MultiPolygonmpoly の領域を倍精度の数値として返す。

 
mysql> SELECT Area(GeomFromText('MultiPolygon(((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1)))'));
+-----------------------------------------------------------------------------------+
| Area(GeomFromText('MultiPolygon(((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1)))')) |
+-----------------------------------------------------------------------------------+
|                                                                                 8 |
+-----------------------------------------------------------------------------------+

OpenGIS 仕様では以下の関数も定義していますが、これらは MySQL でまだ実装されていません。

Centroid(mpoly)
MultiPolygonmpoly の数学的な重心を Point として返す。結果が MultiPolygon 上に存在することは保証されない。

PointOnSurface(mpoly)
MultiPolygonmpoly 上に存在することが保証される Point 値を返す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.5.2.7 GeometryCollection プロパティ分析関数

NumGeometries(gc)
GeometryCollectiongc におけるジオメトリ数を返す。

 
mysql> SELECT NumGeometries(GeomFromText('GeometryCollection(Point(1 1),LineString(2 2, 3 3))'));
+------------------------------------------------------------------------------------+
| NumGeometries(GeomFromText('GeometryCollection(Point(1 1),LineString(2 2, 3 3))')) |
+------------------------------------------------------------------------------------+
|                                                                                  2 |
+------------------------------------------------------------------------------------+

GeometryN(gc,n)
GeometryCollectiongc における n 番目のジオメトリを返す。ジオメトリ番号は 1 から始まる。

 
mysql> SELECT AsText(GeometryN(GeomFromText('GeometryCollection(Point(1 1),LineString(2 2, 3 3))'),1));
+------------------------------------------------------------------------------------------+
| AsText(GeometryN(GeomFromText('GeometryCollection(Point(1 1),LineString(2 2, 3 3))'),1)) |
+------------------------------------------------------------------------------------------+
| POINT(1 1)                                                                               |
+------------------------------------------------------------------------------------------+


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.5.3 既存ジオメトリから新規ジオメトリを作成する関数

10.5.3.1 新規ジオメトリを作成する関数   
10.5.3.2 空間情報の演算子   


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.5.3.1 新規ジオメトリを作成する関数

セクション 「10.5.2 Geometry プロパティ分析関数」 では、既存ジオメトリから新規ジオメトリを構築する関数をいくつか取り上げました。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.5.3.2 空間情報の演算子

OpenGIS では、ジオメトリを作成できるその他の関数が数多く提案されています。これらは、空間演算子を実装するように設計されています。

そのような関数は MySQL では実装されておらず、将来のリリースで実装される予定です。

Intersection(g1,g2)
ジオメトリ値 g1 および g2 の Point セット交差を表すジオメトリを返す。

Union(g1,g2)
ジオメトリ値 g1 および g2 の Point セット接合を表すジオメトリを返す。

Difference(g1,g2)
ジオメトリ値 g1 および g2 の Point セット差異を表すジオメトリを返す。

SymDifference(g1,g2)
ジオメトリ値 g1 および g2 の Point セット対称差異を表すジオメトリを返す。

Buffer(g,d)
ジオメトリ値 g からの距離が d の距離以下になっているすべての Point を表すジオメトリを返す。

ConvexHull(g)
ジオメトリ値 g の凸包を表すジオメトリを返す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.5.4 ジオメトリオブジェクト間の空間的関係をテストするための関数

これらのセクションで説明されている関数は、2 つのジオメトリを入力パラメータとして受け取り、ジオメトリ間の質的または量的な関係を返します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.5.5 最小外接矩形(MBR)における関係

ジオメトリ g1 および g2 の最小外接矩形間の関係をテストできる関数が MySQL に用意されています。 たとえば、以下の関数があります。

MBRContains(g1,g2)
1 または 0 を返すことにより、g1 の最小外接矩形に g2 の最小外接矩形が含まれているかどうかを示す。

 
mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
mysql> SET @g2 = GeomFromText('Point(1 1)');
mysql> SELECT MBRContains(@g1,@g2), MBRContains(@g2,@g1);
----------------------+----------------------+
| MBRContains(@g1,@g2) | MBRContains(@g2,@g1) |
+----------------------+----------------------+
|                    1 |                    0 |
+----------------------+----------------------+

MBRWithin(g1,g2)
1 または 0 を返すことにより、g1 の最小外接矩形が g2 の最小外接矩形に含まれているかどうかを示す。

 
mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
mysql> SET @g2 = GeomFromText('Polygon((0 0,0 5,5 5,5 0,0 0))');
mysql> SELECT MBRWithin(@g1,@g2), MBRWithin(@g2,@g1);
+--------------------+--------------------+
| MBRWithin(@g1,@g2) | MBRWithin(@g2,@g1) |
+--------------------+--------------------+
|                  1 |                  0 |
+--------------------+--------------------+

MBRDisjoint(g1,g2)
1 または 0 を返すことにより、ジオメトリ g1g2 の 2 つの最小外接矩形が分離している(交差していない)かどうかを示す。

MBREquals(g1,g2)
1 または 0 を返すことにより、ジオメトリ g1g2 の 2 つの最小外接矩形が同じかどうかを示す。

MBRIntersects(g1,g2)
1 または 0 を返すことにより、ジオメトリ g1g2 の 2 つの最小外接矩形が交差しているどうかを示す。

MBROverlaps(g1,g2)
1 または 0 を返すことにより、ジオメトリ g1g2 の 2 つの最小外接矩形が重なっているかどうかを示す。

MBRTouches(g1,g2)
1 または 0 を返すことにより、ジオメトリ g1g2 の 2 つの最小外接矩形が接触しているどうかを示す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

10.5.6 ジオメトリ間の空間関係をテストする関数

OpenGIS 仕様では以下の関数を定義していますが、これらは MySQL でまだ実装されていません。将来のリリースで実装される予定です。 実装されると、MBR ベースのサポートのみならず、空間分析の完全なサポートが提供されます。

これらの関数は、2 つのジオメトリ値 g1 および g2 で動作します。

Contains(g1,g2)
1 または 0 を返すことにより、g1g2 が完全に含まれているかどうかを示す。

Crosses(g1,g2)
g1g2 と空間的にクロスする場合、1 を返す。 g1Polygon または MultiPolygon であるか、あるいは g2Point または MultiPoint である場合、NULL を返す。 その他の場合は 0 を返す。

空間的にクロスするという表現は、以下のプロパティを持つ 2 つの指定されたジオメトリの関係を示す。

Disjoint(g1,g2)
1 または 0 を返すことにより、g1g2 が空間的に分離している(交差しない)かどうかを示す。

Equals(g1,g2)
1 または 0 を返すことにより、g1g2 が空間的に等しいかどうかを示す。

Intersects(g1,g2)
1 または 0 を返すことにより、g1g2 が空間的に交差するどうかを示す。

Overlaps(g1,g2)
1 または 0 を返すことにより、g1g2 が空間的に重なるかどうかを示す。 空間的に重なるという用語が使用されるのは、2 つのジオメトリの交差部分が単一のジオメトリになり、そのジオメトリは指定された 2 つのジオメトリと次元が一致するが、どちらのジオメトリとも等しくない場合である。

Touches(g1,g2)
1 または 0 を返すことにより、g1g2 が空間的に接触するどうかを示す。2 つのジオメトリが空間的に接触するのは、ジオメトリ内部は交差しないが、一方のジオメトリの境界が他方のジオメトリの境界または内部と交差する場合である。

Within(g1,g2)
1 または 0 を返すことにより、g1g2 に空間的に含まれているかどうかを示す。

Distance(g1,g2)
2 つのジオメトリにおける任意の 2 Point の最短距離を倍精度の数値として返す。

Related(g1,g2,pattern_matrix)
1 または 0 を返すことにより、pattern_matrix によって指定された空間関係が g1g2 の間に存在するかどうかを示す。 引数が NULL である場合は -1 を返す。 パターン行列は文字列である。パターン行列については、この関数が実装された時点でここに記載する。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]