この章では、Oracle Continuous Query Language (Oracle CQL)を拡張して位置情報対応型のアプリケーションに高度な空間機能を提供するOracle Spatialカートリッジを使用する場合のリファレンスとガイドを提供します。
Oracle Event Processingアプリケーション作成において、Oracle CQLネイティブ型と同じように、Oracle CQL問合せおよびビューでOracle Spatialの型、メソッド、フィールドおよびコンストラクタを使用できます。
この章の内容は次のとおりです。
Oracle Spatialは、ハイエンドな地理情報システム(GIS)と位置情報を有効化したビジネス・インテリジェンス・ソリューション(LBS)をサポートする高度な空間機能を提供するOracle Databaseオプションです。
Oracle Spatialは、Oracle Event ProcessingアプリケーションでOracle Spatialクラスをシームレスに操作するOracle CQL問合せおよびビューを記述できるオプションのデータ・カートリッジです。
Oracle Spatialを使用すると、空間データを索引付する機能により、空間データの保存、空間データ上の近接や重なりの比較、Oracle Event Processingサーバーへの空間データの統合などの非常に重要な地理ドメイン操作を実行するOracle CQL問合せを構成できます。
Oracle Spatialを使用するには、Oracle Spatial APIに関する実用的な知識が必要です。Oracle Spatialの詳細は、次の資料を参照してください。
製品概要: http://www.oracle.com/in/products/database/options/spatial/index.html
Oracle Spatialのドキュメント: http://www.oracle.com/pls/db112/portal.portal_db?selected=7&frame=#oracle_spatial_and_location_information
Oracle Spatial Java APIリファレンス: http://download.oracle.com/docs/cd/E11882_01/appdev.112/e11829/toc.htm
この項では、次の内容について説明します。
Oracle Spatialでは、カートリッジID com.oracle.cep.cartrdiges.spatial
を使用してサーバー・スコープ予約済リンク名spatial
を登録します。
spatial
リンク名を使用して、Oracle Spatialのメソッド呼出しとOracle Spatialのアプリケーション・コンテキストを関連付けます。
詳細は、次を参照してください。
Oracle SpatialはOracle Spatial Java APIに基づいています。Oracle SpatialはOracle Spatial機能をcom.oracle.cep.cartridge.spatial.Geometry
クラスに公開します。Oracle Spatial Java APIにないOracle Spatial機能に、Oracle Spatialからアクセスすることはできません。
Oracle Spatialを使用することで、Oracle CQL問合せで表4-1のOracle Spatial機能にアクセスできます。
表4-1 Oracle Spatialのスコープ
Oracle Spatialの機能 | スコープ |
---|---|
ジオメトリ・タイプ |
Oracle Spatial Java APIの次のジオメトリ・タイプ:
次のジオメトリ操作:
詳細は、次を参照してください。 |
座標系 |
詳細は、「縦座標および座標系とSDO_SRID」を参照してください。 |
ジオメトリ索引 |
詳細は、「ジオメトリ索引」を参照してください。 |
ジオメトリ関係演算子 |
詳細は、「ジオメトリ関係演算子」を参照してください。 |
ジオメトリ・フィルタ演算子 |
詳細は、「ジオメトリ・フィルタ演算子」を参照してください。 |
ジオメトリAPI |
|
ジオメトリ集約 |
詳細は、「ジオメトリ集約」を参照してください。 |
Oracle Spatialを使用してこれらのOracle Spatial機能にアクセスする方法の詳細は、「Oracle Spatialの使用」を参照してください。
Oracle Spatialのデータ・モデルはジオメトリで構成されます。ジオメトリは、順序の付いた一連の頂点です。ジオメトリのセマンティクスは、そのタイプによって決まります。Oracle Spatialにより、Oracle CQL問合せおよびビューで次のOracle Spatialの型に直接アクセスできます。
SDO_GTYPES
: Oracle Spatialは次のジオメトリ・タイプをサポートしています。
2D点
2D単純ポリゴン
2D矩形
3D点
3D線
3D矩形
3Dポリゴン
表4-2は、使用可能なcom.oracle.cep.cartridge.spatial.Geometry
クラスのジオメトリ・タイプを説明しています。
表4-2 Oracle Spatialジオメトリ・タイプ
ジオメトリ・タイプ | 説明 |
---|---|
|
1つの点を含む点ジオメトリ・タイプ。 |
|
直線セグメントまたは円弧セグメント(あるいはその両方)を含むことができる1つの線ストリングを含む曲線ジオメトリ・タイプです。
|
|
1つのポリゴンを含むポリゴン・ジオメトリ・タイプ。 穴のあるまたは穴のない1つのポリゴンまたは1つ以上のポリゴンで構成される1つの面を含むポリゴン・ジオメトリ・タイプまたは面ジオメトリ・タイプです。3次元ポリゴンでは、すべての点が同じ平面上にあることが必要です。 |
|
異種の要素の集合であるコレクション・ジオメトリ・タイプです。
|
|
1つ以上の点を持つマルチポイント・ジオメトリ・タイプです。 |
|
1つ以上の線ストリングを持つマルチライン・ジオメトリまたはマルチカーブ・ジオメトリ・タイプです。
|
|
複数の非接続ポリゴン(複数の外側の境界)または面を持てるマルチポリゴン・ジオメトリ・タイプまたはマルチサーフェイス・ジオメトリ・タイプです。
|
|
複数の面で構成され、3次元空間で完全に囲まれたソリッド・ジオメトリです。立方形や錐台があります。 |
|
複数の非接続のソリッド(複数の外側の境界)で構成されるマルチソリッド・ジオメトリです。
|
SDO_ELEMENT_INFO
: 次の項目を使用して、要素情報配列を作成できます。
com.oracle.cep.cartridge.spatial.Geometry.createElemInfo
静的メソッド
einfogenerator
関数
詳細は、「要素情報配列」を参照してください。
ORDINATES
: Oracle Spatialのordsgenerator
関数を使用して、縦座標を作成できます。
詳細は、「縦座標および座標系とSDO_SRID」を参照してください。
詳細は、次を参照してください。
Element Info属性は、可変長の数値配列を使用して定義されます。この属性は、Ordinates属性に格納されている縦座標を解釈する方法を指定します。
Oracle Spatialには、Element Info属性値を生成するために、次のヘルパー関数が用意されています。
com.oracle.cep.cartridge.spatial.Geometry.createElemInfo(int SDO_STARTING_OFFSET, int SDO_ETYPE , int SDO_INTERPRETATION)
einfogenerator
関数を使用することもできます。
詳細は、次を参照してください。
表4-3は、Oracle Spatialがデフォルトでサポートする座標系、および各座標系を識別するSDO_SRID
の一覧です。
表4-3 Oracle Spatial座標系
座標系 | SDO_SRID | 説明 |
---|---|---|
デカルト |
0 |
デカルト座標は、指定した基点からの点の位置を、空間の直交する軸を関連付けて測定する座標です。 |
測地(WGS84) |
8307 |
測地座標(地理座標)は、角度を持つ座標(経度および緯度)で、球体の極点の座標と密接に関連しており、地球上の特定の測地データに関連付けて定義されます。 これは、Oracle Spatialのデフォルトの座標系です。 |
SDO_SRID
の値は、呼び出すOracle Spatialのメソッドおよびコンストラクタのそれぞれに引数として指定できます。または、SDO_SRID
をOracle Spatialのアプリケーション・コンテキストに一度だけ構成し、毎回引数としてSDO_SRID
を設定することなくcom.oracle.cep.cartridge.spatial.Geometry
メソッドを使用できます。アプリケーション・コンテキストを使用する場合、Oracle Spatialでサポートされる任意の座標系も指定できます。
注意:
SDO_SRID
値を使用しないcom.oracle.cep.cartridge.spatial.Geometry
メソッドを使用する場合、Oracle Spatialのアプリケーション・コンテキストを使用する必要があります。たとえば、次のメソッド呼出しはランタイム例外の原因になります。
com.oracle.cep.cartridge.spatial.Geometry.createPoint(lng, lat)
かわりに、spatial
リンク名を使用して、メソッド呼出しをOracle Spatialのアプリケーション・コンテキストと関連付ける必要があります。
com.oracle.cep.cartridge.spatial.Geometry.createPoint@spatial(lng, lat)
SDO_SRID
値を使用するGeometry
メソッドを使用する場合、spatial
リンク名の使用はオプションです。たとえば、次のメソッド呼出しは両方とも有効です。
com.oracle.cep.cartridge.spatial.Geometry.createPoint(8307, lng, lat) com.oracle.cep.cartridge.spatial.Geometry.createPoint@spatial(lng, lat)
詳細は、「Oracle Spatialアプリケーション・コンテキスト」を参照してください。
縦座標は、ダブル配列を使用してジオメトリの座標の配列を定義します。Oracle Spatialには、座標の配列を生成するためにordsgenerator
ヘルパー関数が用意されています。構文は、「ordsgenerator」を参照してください。
詳細は、次を参照してください。
Oracle Spatialでは空間索引を使用して、1次フィルタを実装します。空間索引の目的は、データのサブセットを迅速に作成し、2次フィルタでの処理の負荷を軽減することです。
空間索引は、他の索引と同様、検索対象を限定するメカニズムを提供しますが、この場合は、交差および包含のような空間基準に基づきます。
Oracle Spatialでは、デフォルトの索引作成メカニズムにRツリー索引を使用しています。空間Rツリー索引では、最大4次元の空間データの索引を作成できます。Rツリー索引では、ジオメトリを囲む最小の矩形(最小境界矩形(MBR))によって各ジオメトリを近似させます。
詳細は、「ジオメトリ・フィルタ演算子」を参照してください。
Oracle Spatialでは、次のOracle Spatialジオメトリ関係演算子がサポートされます。
これらの操作はすべて、Oracle CQL問合せのprojection句またはwhere句のいずれかに使用できます。
Oracle CQL問合せのwhere句でジオメトリ関係演算子を使用する場合、Oracle Spatialで、where句で指定された関係に対してRツリー索引を作成できます。
Oracle Spatialでは、点と他のジオメトリ・タイプ間のジオメトリ関係のみがサポートされます。
詳細は、「ジオメトリ関係演算子の使用方法」を参照してください。
Oracle Spatialでは、次のOracle Spatialジオメトリ・フィルタ演算子がサポートされます。
これらのフィルタ演算子では一時フィルタが実行されるので、Oracle CQL問合せのwhere句でのみ使用されます。
これらのフィルタ演算子では空間索引を使用して、指定するオブジェクトと空間的に対話する可能性がある一連の空間オブジェクトが識別されます。
詳細は、次を参照してください。
Oracle SpatialはOracle Spatial Java APIに基づいています。Oracle SpatialはOracle Spatial機能をcom.oracle.cep.cartridge.spatial.Geometry
クラスに公開します。このGeometry
クラスにより、oracle.spatial.geometry.J3D_Geometry
も拡張されます。Oracle Spatialは2Dジオメトリおよび3Dジオメトリをサポートし、J3D_Geometry
メソッドでZ座標を自動的にゼロ詰めします。
Geometry
クラスからアクセスできない(またはOracle Spatialがサポートする有効範囲およびジオメトリ・タイプに準拠していない)Oracle Spatial機能に、Oracle Spatialからアクセスすることはできません。
この項では、次の内容について説明します。
詳細は、次を参照してください。
注意:
Oracle Spatialの型名を単純化するには、Oracle Event Processing Oracle CQL言語リファレンスで説明している別名を使用できます。
表4-4は、Geometry
クラスが提供するパブリック・メソッドの一覧です。
表4-4 Oracle Spatialジオメトリ・メソッド
タイプ | メソッド |
---|---|
バッファ |
|
円 |
|
変換 |
|
距離 |
|
要素情報 |
|
ジオメトリ |
|
単線または複線のストリング |
|
線形ポリゴン |
|
最小境界矩形(MBR) |
|
点 |
|
矩形 |
|
型および型変換 |
注意:
Geometry
クラスでは大文字と小文字が区別されるため、表示されている方を使用してください。
次のJGeometry
パブリック・メソッドを、Oracle Spatialに適用できます。
double area(double tolerance)
: 2Dジオメトリの平面の表面積合計を返します。
double length(double tolerance)
: 2Dジオメトリの周辺の長さを返します。すべての辺の長さが加えられます。
double[] getMBR()
: このジオメトリの最小境界矩形(MBR)を返します。2DのMBRのminX
、minY
、maxX
およびmaxY
値を含むダブル配列を返します。
詳細は、次を参照してください。
Oracle Spatialカートリッジは、1つのデータ型com.oracle.cep.cartridge.spatial.Geometry
をサポートしています。
Geometryクラスはoracle.spatial.geometry.J3D_Geometry
を拡張し、J3D_Geometry
および親クラスのoracle.spatial.geometry.JGeometry
が提供するすべてのパブリックなメソッド、フィールドおよびコンストラクタをサポートします。
com.oracle.cep.cartridge.spatial.Geometry
が提供するメソッドの完全なリストは、「ジオメトリAPI」を参照してください。
Oracle Spatialのインスタンスにアプリケーション・コンテキストを定義し、このアプリケーション・コンテキストをランタイム時に伝播できます。これにより、特定のOracle Spatialアプリケーション・デフォルト(SDO_SRID
など)を特定のOracle Spatialインスタンスに関連付けることができます。
Oracle Spatialアプリケーション・コンテキストを定義する前に、Oracle Event ProcessingアプリケーションEPNアセンブリ・ファイルを編集して、必要なネームスペースおよびスキーマの場所のエントリを追加します。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:osgi="http://www.springframework.org/schema/osgi" xmlns:wlevs="http://www.bea.com/ns/wlevs/spring" xmlns:spatial="http://www.oracle.com/ns/ocep/spatial" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd http://www.bea.com/ns/wlevs/spring http://www.bea.com/ns/wlevs/spring/spring-wlevs-v11_1_1_6.xsd" http://www.oracle.com/ns/ocep/spatial http://www.oracle.com/ns/ocep/spatial/ocep-spatial.xsd">
次の例では、Geodetic Reference System 1980 (GRS80)座標系を使用して、EPNアセンブリ・ファイルにSpatialGRS80
という名前の空間コンテキストを作成する方法を説明しています。
<spatial:context id="SpatialGRS80" srid="4269" sma="6378137" rof="298.25722101" />
次の例は、Oracle CQL問合せでspatial:context
を参照する方法を示しています。この場合、問合せでリンク名SpatialGRS80
(前述の例で定義)が使用され、このアプリケーション・コンテキストがOracle Spatialに伝播されます。SpatialGRS80
のspatial:context
属性設定は、createPoint
メソッド・コールに適用されます。
<view id="createPoint"> select com.oracle.cep.cartridge.spatial.Geometry.createPoint@SpatialGRS80( lng, lat) from CustomerPos[NOW] </view>
この項では、Oracle Event ProcessingアプリケーションでOracle Spatialをどのように使用できるかを中心に、次のような一般的な使用例を説明します。
詳細は、「ジオメトリAPI」を参照してください。
次の手順では、Oracle CQL問合せでOracle Spatialを使用してOracle Spatialジオメトリ・タイプSDO_GTYPE
、SDO_ELEMENT_INFO
およびORDINATES
にアクセスする方法について説明します。
Oracle Spatial Java APIでサポートされているジオメトリ・タイプにアクセスするには:
次のメソッドを呼び出すことで、Oracle Spatialを使用してOracle CQL問合せでジオメトリを作成できます。
com.oracle.cartridge.spatial.Geometry
の静的メソッド
Oracle Spatialがサポートする有効範囲およびジオメトリ・タイプに準拠している、oracle.spatial.geometry.JGeometry
のメソッド。
oracle.spatial.geometry.J3D_Geometry
のコンストラクタ・メソッド
oracle.spatial.geometry.J3D_Geometry
の静的メソッド
詳細は、「ジオメトリAPI」を参照してください。
Oracle Spatialジオメトリ・クラスでの静的メソッドの使用
次の例では、com.oracle.cartridge.spatial.Geometry
の静的メソッドを使用して点ジオメトリを作成する方法を説明しています。この例では、リンク(@spatial
)を使用して、このクラスを提供するデータ・カートリッジを識別する必要があります。この方法の利点は、Oracle Spatialアプリケーション・コンテキストを使用してSRIDや他のOracle Spatialオプションの設定を行えることです。これはデフォルトで実行されるか、構成するアプリケーション・コンテキストに基づいて実行されます(「Oracle Spatialアプリケーション・コンテキスト」を参照)。
<view id="CustomerPosGeom"> select com.oracle.cep.cartridge.spatial.Geometry.createPoint@spatial( lng, lat) as geom from CustomerPos[NOW] </view>
Oracle Spatial J3D_Geometryコンストラクタ
次の例では、oracle.spatial.geometry.J3D_Geometry
のコンストラクタ・メソッドを使用してジオメトリを作成する方法を説明しています。この場合、J3D_Geometry
はJavaクラスなので、リンク(@spatial
)を使用しません。この方法の欠点は、com.oracle.cartridge.spatial.Geometry
の使用とは異なり、アプリケーション・コンテキストを使用できないため、SRIDを設定する必要がある点です。
<view id="CustomerPosGeom"> select oracle.spatial.geometry.J3D_Geometry( oracle.spatial.geometry.GTYPE_POINT, srid, x, y, z) as geom from CustomerPos[NOW] </view>
Oracle Spatial J3D_Geometryの静的メソッドの使用
次の例では、oracle.spatial.geometry.J3D_Geometry
の静的メソッドを使用してジオメトリを作成する方法を説明しています。
<view id="CustomerPosGeom"> select oracle.spatial.geometry.J3D_Geometry.createArc@spatial( x1, y1, x2, y2, x3, y3) as geom from CustomerPos[NOW] </view>
詳細は、「ジオメトリ・タイプ」を参照してください。
Oracle Spatialを使用すると、Oracle CQLでOracle Spatialクラスのpublicメンバー関数およびpublicメンバー・フィールドに直接アクセスできます。
Geometry
クラスからアクセスできない(またはOracle Spatialがサポートする有効範囲およびジオメトリ・タイプに準拠していない)Oracle Spatial機能に、Oracle Spatialからアクセスすることはできません。
次の例では、ShopGeom
ビューはgeom
という名前のOracle Spatialジオメトリを作成します。ビューshopMBR
はJGeometry
静的メソッドgetMBR
を呼び出し、double[]
がストリーム要素mbr
として返されています。問合せqshopMBR
は標準Java APIを使用してこのdouble[]
にアクセスしています。
<view id="ShopGeom"> select com.oracle.cep.cartridge.spatial.Geometry.createGeometry@spatial( com.oracle.cep.cartridge.spatial.Geometry.GTYPE_POLYGON, com.oracle.cep.cartridge.spatial.Geometry.createElemInfo(1, 1003, 1), ordsgenerator@spatial( lng1, lat1, lng2, lat2, lng3, lat3, lng4, lat4, lng5, lat5, lng6, lat6 ) ) as geom from ShopDesc </view> <view id="shopMBR"> select geom.getMBR() as mbr from ShopGeom </view> <query id="qshopMBR"> select mbr[0], mbr[1], mbr[2], mbr[3] from shopMBR </query>
詳細は、次を参照してください。
Oracle Spatialを使用すると、Oracle CQL問合せのWHERE
句またはSELECT
句で、次のOracle Spatialジオメトリ関係演算子にアクセスできます。
次の例では、op_in_where
ビューはWHERE
句でCONTAIN
ジオメトリ比較演算子を使用します。この場合、Oracle SpatialはRツリー索引を使用します。ビューop_in_proj
では、SELECT
句でCONTAIN
を使用しています。
<view id="op_in_where"> RStream( select loc.customerId, shop.shopId from LocGeomStream[NOW] as loc, ShopGeomRelation as shop where CONTAIN@spatial(shop.geom, loc.curLoc, 5.0d) = true ) </view> <view id="op_in_proj"> RStream( select loc.customerId, shop.shopId, CONTAIN@spatial(shop.geom, loc.curLoc, 5.0d) from LocGeomStream[NOW] as loc, ShopGeomRelation as shop ) </view>
詳細は、「ジオメトリ比較演算子」を参照してください。
Oracle Spatialを使用すると、Oracle CQL問合せのWHERE
句で、次のOracle Spatialジオメトリ・フィルタ演算子にアクセスできます。
次の例では、filter
ビューのWHERE
句でジオメトリ・フィルタ演算子FILTER
を使用します。
<view id="filter"> RStream( select loc.customerId, shop.shopId from LocGeomStream[NOW] as loc, ShopGeomRelation as shop where FILTER@spatial(shop.geom, loc.curLoc, 5.0d) = true ) </view>
詳細は、「ジオメトリ・フィルタ演算子」を参照してください。
Oracle Spatialデータ・カートリッジを使用して、Oracle CQL問合せのSELECT句で、次のOracle Spatial集約演算子を使用できます。
MBR
次の例では、vaggrmbr
ビューはSELECT
句でジオメトリ集約演算子MBR
を使用します。問合せqaggrmbr
は、標準のJava APIを使用して、MBR
ジオメトリ集約演算子が返すdouble[]
値にアクセスします。
<view id="vaggrmbr"> select MBR@spatial1(shop.geom) as mbr from ShopGeomRelation as shop </view> <query id="qaggrmbr"> select mbr[0], mbr[1], mbr[2], mbr[3], mbr[4], mbr[5], mbr[6] from vaggrmbr </query>
詳細は、「ジオメトリ・フィルタ演算子」を参照してください。
Oracle Spatialのデフォルトのアプリケーション・コンテキストを使用してOracle CQL問合せを作成すると、デフォルトのSRID
がCARTESIAN
に設定されます。
次の例では、createPoint
メソッド呼出しでデフォルトのリンク(@spatial
)が使用されます。これにより、Oracle Spatialのデフォルトのアプリケーション・コンテキストが適用されるようになります。
<view id="createPoint"> select com.oracle.cep.cartridge.spatial.Geometry.createPoint@spatial( lng, lat) from CustomerPos[NOW] </view>
詳細は、次を参照してください。