データベース内の空間データ
Oracle DatabaseではSDO_GEOMETRYというオブジェクト形式のデータ型で空間の形状データを表現することを述べました。他のリレーショナルデータベース製品においても形状表現のためのデータ型が用意されており、それをデータベース内の列の型として定義することでリレーショナル表の中で利用されます。
Oracle DatabaseではSDO_GEOMETRY型の列を定義することで、その表に形状データを格納することができます。
CREATE TABLE SHELTER ( "行政区域コード" number, "名称" varchar2(500), "住所" varchar2(500), "施設の種類" varchar2(500), geometry SDO_GEOMETRY );
表に対するデータ挿入INSERT文では、オブジェクト形式のデータとして値を指定する形になります。
INSERT INTO SHELTER values ( 13110, '都立芸術高校', '東京都目黒区大橋2-18-58', '第一次避難場所', SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(139.684497, 35.654544, NULL), NULL, NULL) ); COMMIT;
空間データの使われ方
ここまで空間データというデータの特徴である形状の表現、測地座標系という基準に関する情報の話、実際のリレーショナル表での定義の仕方を述べてきましたが、これらのデータは実際にどのように使われるものなのでしょうか。
例えば、とあるフランチャイズチェーンでは、空間データを用いて情報を取得し、出店予定の店舗の売上予測をすることで投資の判断の一助としています。具体的には、既存の店舗の売上と、店舗の座席数や駐車場の有無、駐車可能台数などの店舗の属性に加え、その立地による商圏を特徴づけるデータとして、店舗から指定範囲内の世帯数、経済階層別人口、労働者人口、外食消費のポテンシャル、競合店舗のプレゼンスなどを空間データから取得し、売上の予測モデルを生成しています。
この中で空間データは各種商圏を特徴づけるデータを生成するために利用されます。「店舗から指定範囲内の世帯数」を例にとると、店舗の位置という「点」の空間データと世帯数を保持する行政境界を表現する「ポリゴン」の空間データが指定距離内にあるかどうかを測地座標系や単位系に基づいて演算判定し、範囲内である行政境界の世帯数を取得し、集計するという処理で生成することができます。
単純なキーでデータとデータを結合したり、スカラーデータを範囲で検索するような処理と比べると、複雑な座標系の取り回しや空間的な演算を含む条件判定が行われることになります。ただし空間データを扱えるデータベースではこのような空間的な条件を表現するための演算子や関数が実装されていて、それを用いることで複雑な空間演算の記述なしに、比較的容易に空間的な判定処理が行えるようになっています。
例えば「「外苑前」駅から半径3km内の世帯数を得る」ということを考えてみます。Oracle Databaseの場合はSDO_WITHIN_DISTANCE演算子を用いて、以下のようなSQLで取得することが可能です。
SELECT count(1) 小地域数,sum( SETAI ) 世帯数 FROM SMALLAREA 小地域 WHERE SDO_WITHIN_DISTANCE( GEOMETRY, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(139.717857, 35.670527, NULL), NULL, NULL), 'distance=3 unit=km') ='TRUE' ; 小地域数 世帯数 -------------------- -------------------- 211 222229
この空間的な関係を軸にデータをつなぎ合わせることで、複合的な集合演算と検索にも対応します。少し具体的な例を挙げますと、特定地点での事故の情報を求めて車載カメラのデータを探す場合、車の動線の情報から事故前後にその付近を通りかかった車両を特定し、通過した時間帯を特定することで、事故と車載カメラの映像というデータを紐づけることが可能になります。これは一般的なキーや時間だけでは突合が難しい情報を空間データと地球を介してつなげることができるということでもあり、空間データが情報を取得する強力な武器となる可能性を示しているかと思います。
空間索引
ここまで、多くの実装でデータベース内で空間データのベクターデータはオブジェクトの形で格納され、空間的な処理が実装された関数や演算子を用いて利用、検索されることを述べました。空間的な処理は地球という楕円体表面のデータを計算することを考えれば、一般的なスカラー数値の評価や倍と列の一致評価などと比べて処理コストが高いことが容易に想像できるかと思います。そのため多くのデータベース空間機能の実装で空間索引という機構が取り入れられ、空間的な処理を含むデータ検索の高速化の役割を担っています。
ここで空間索引の手法についての詳しい説明は割愛しますが、空間的な条件にはさまざまな種類がありえることから、空間索引は関数や演算子の実装と密接に関係し、表内の対象データを索引から引き当てるようなシンプルな動作から、内部の複雑な空間処理が必要な場合に対象となるデータを絞り込んだり、内部的な処理を補助するような形でデータを受け渡すための構造を持つものもあります。
Oracle Databaseの場合、トランザクションやメンテナンスなどへの配慮もあり、基本的には軽量なR木を用いたシンプルな構造の空間索引の機能を提供しています。利用に際しては、対象の空間データ列に対してCREATE INDEX文にINDEXTYPE句で空間索引を指定した形で発行することで空間索引が生成されます。
-- メタデータの登録 INSERT INTO USER_SDO_GEOM_METADATA VALUES ('SHELTER','GEOMETRY', SDO_DIM_ARRAY(SDO_DIM_ELEMENT('Longitude', -180, 180, .05), SDO_DIM_ELEMENT('Latitude', -90, 90, .05)), 4326 ); COMMIT; --空間索引の生成 CREATE INDEX SPIDX_SHELTER_GEOMETRY ON SHELTER (geometry) INDEXTYPE is MDSYS.SPATIAL_INDEX_V2 ;
※空間索引作成には空間データ列の表現する値の範囲や測地座標系などのメタデータをUSER_SDO_GEOM_METADATA表に登録する必要があります。