この章では、OracleAS MapViewerに対するPL/SQL Application Program Interface(API)について解説します。このAPIを構成しているPL/SQLパッケージSDO_MVCLIENTは、Oracleデータベースの内部からOracleAS MapViewerサービスにアクセスするOracleデータベース・ユーザーを対象としたものです。このパッケージは、OracleAS MapViewerのほとんどの機能を公開しており、中間層で動作する実際のOracleAS MapViewerサーバーとのやりとりを、mapリクエストを出すユーザーにかわってすべて処理します。
SDO_MVCLIENTパッケージは現在、デフォルトではインストールされません。該当するパッケージは、MapViewerで提供されるsdomvclh.sql
およびsdomvclb.sql
という2つのSQLスクリプトを実行してインストールする必要があります。
そのインストールを実行するには、$MAPVIEWER_HOME
ディレクトリの下にあるsql
ディレクトリに移動してSQL*Plusを起動し、DBAロール(SYSTEMなど)を所持するユーザーとして接続した後、次のコマンドを入力します。
@sdomvclh @sdomvclb
これら2つのスクリプトを実行した後は、SQL*Plusを終了して$MAPVIEWER_HOME
/web/WEB-INF/lib
ディレクトリに移動し、シェル・コマンドloadjava
を使用してmvclient.jar
ファイルをMDSYSスキーマにロードします。例を次に示します(パスワードがmanagerのSYSTEMアカウントの使用が前提)。
loadjava -force -schema mdsys -grant PUBLIC -user system/manager mvclient.jar
これで、データベース・ユーザーは6.2項で説明するように、SDO_MVCLIENT PL/SQLパッケージを使用できます。
SDO_MVCLIENT PL/SQLパッケージは、HTTPプロトコルを介してOracleAS MapViewerのリモート・サービスと通信します。データベース・セッションごとに、MapViewerクライアントのグローバル・ハンドル、および現行のmapリクエスト・オブジェクトとmapレスポンス・オブジェクトを維持します。
SDO_MVCLIENTパッケージの使用モデルはほとんど、MapViewer JavaBeanベースAPI(第4章を参照)と同じです。MapViewer JavaBeanベースAPI(oracle.lbs.mapclient.MapViewer
)に実装されているほとんどのメソッドはこのPL/SQLパッケージで利用することができ、このパッケージではJavaBeanベースAPIが使用するのと同じメソッド名およびパラメータを使用します。特定の関数またはプロシージャの使用方法および参照情報については、関連するJavaBeanベースAPIのメソッドおよびインタフェースに関する解説(第4章)を参照してください。
このPL/SQLパッケージを介してMapViewerのサービスにアクセスする場合の基本的なワークフローは、一部の初期設定を除き、JavaクライアントAPIの場合とほとんど同じです。その場合に従う次の主要なステップについては、後述の各項で説明します。
ネットワーク・アクセス権の付与(6.2.1項を参照)
MapViewerクライアント・ハンドルの作成(6.2.2項を参照)
mapリクエストの準備(6.2.3項を参照)
MapViewerサービスに対するmapリクエストの送信(6.2.4項を参照)
mapリクエストからの情報の抽出(オプション)(6.2.5項を参照)
SDO_MVCLIENTパッケージを使用する各データベース・ユーザーに、ネットワーク・アクセス権限を付与します。たとえば、SCOTTというデータベース・ユーザーが該当パッケージを使用する必要がある場合は、DBA権限を持つユーザーとして接続されているときにあなたが次の一般的な書式で文を入力します。
call dbms_java.grant_permission('SCOTT', 'SYS:java.net.SocketPermission', 'www.mycorp.com', 'connect, resolve' );
直前の例のwww.mycorp.com
は、MapViewerサービスが動作しているホストに変更します。
Oracleデータベースのバージョンによっては、データベース・ユーザーMDSYS(SDO_MVCLIENTパッケージを所有)にネットワーク・アクセス権を付与する必要もあります。その場合は、DBA権限を持つユーザーとして接続されているときに、次の一般的な書式で文を入力します。
call dbms_java.grant_permission('MDSYS', 'SYS:java.net.SocketPermission', 'www.mycorp.com:8888', 'connect, resolve' );
直前の例のwww.mycorp.com
は、MapViewerサービスが動作しているホストに変更します。
dbms_java.grant_permissionに対するコールは、影響を受けるデータベース・ユーザーごとに一度だけ実行すればすみます。該当する権限は、該当ユーザーにおける以降のすべてのデータベース・セッションで有効状態が維持されます。
SDO_MVCLIENTパッケージの関数またはプロシージャを使用する場合は、各データベース・セッションを開始する前に、MapViewerクライアント・ハンドルを事前に作成する必要があります。次の例では、MapViewerクライアント・ハンドルを作成しています。
connect scott/tiger call sdo_mvclient.createmapviewerclient( 'http://www.mycorp.com:8888/mapviewer/omserver') ;
直前の例では、現行のセッション内で、MapViewerサービスのURL http://www.mycorp.com:8888/mapviewer/omserver
に対する一意なMapViewerクライアント・ハンドルを作成しています。直前の例のwww.mycorp.com
は、MapViewerサービスが動作しているホストに変更する必要があります。
MapViewerクライアント・ハンドルの作成が終わったら、次の問合せを実行して、MapViewerが正しく動作しているかどうかをチェックすることができます。
select sdo_mvclient.getdatasources() datasources from dual;
SQL関数sdo_mvclient.getdatasources()
は、MapViewer PL/SQLパッケージAPIに含まれています。この関数は、実行されると、リモートのMapViewerサーバーに接続し、認識されている全データソースのリストを取得します。インストールに成功し、MapViewerサーバーが動作中であると、先の例の結果として次のような出力が得られます。つまり、MapViewerサーバーで定義されている一連のデータソースの名前が含まれる文字列配列が得られます。
DATASOURCES -------------------------------------------------------------------------------- SDO_1D_STRING_ARRAY('mvdemo', 'wms')
PL/SQLパッケージ内の様々なメソッドをコールして、mapリクエストを準備します。そのmapリクエストは、最終的にはMapViewerサーバーに送信され、処理されます。作成対象マップの基本特性を指定し、現行mapリクエストに対して一時スタイルの追加およびテーマの操作を実行することができます。
例6-1では、データソースなどのマップ特性を設定し、動的に定義される色スタイルをmapリクエストに追加して、テーマを操作しています。
例6-1 mapリクエストの準備
call sdo_mvclient.setDataSourceName('mvdemo'); call sdo_mvclient.setImageFormat('PNG_URL'); call sdo_mvclient.setAntiAliasing('true'); call sdo_mvclient.setBaseMapName('qa_map') ; call sdo_mvclient.setBox(-122.3615, 37.4266, -121.1615, 37.6266); call sdo_mvclient.setDevicesize(500,400); call sdo_mvclient.addColorStyle('colorst', 'blue', 'yellow', 100,100); select sdo_mvclient.addJDBCTheme('mvdemo', 'theme1', 'select geom from states where state_abrv = ''CA''', 'geom', '8307', 'C.RED', null, null, 'FALSE') from dual ;
次の例では、リモートのMapViewerサーバーに対して現行mapリクエストを効率よく送信し、処理しています。該当するmapリクエストは、サーバーで処理された後、戻されます。
select sdo_mvclient.run() from dual;
また、sdo_mvclient.zoomIn()
やsdo_mvclient.zoomOut()
などのメソッドを使用すると、ズーム処理されたマップを取得できます。
次の例では、生成されたmap画像のURL文字列を抽出しています。
select sdo_mvclient.getgeneratedMapImageURL() from dual;
map画像のURLを取得すると、データベース表に対する画像のフェッチや格納を実行したり、該当するマップをその他の情報とともにHTMLページに表示したりするなど、様々な処理を実行できます。