Oracle Mapsは、Webベースの高性能な対話型マッピング・アプリケーションを開発するための一連のテクノロジの名前です。Oracle Mapsは、MapViewerに同梱されています。
この章の主な項目は、次のとおりです。
Oracle Mapsは、次の主要なコンポーネントから構成されています。
マップ・タイル・サーバー: 事前に生成されるマップ画像タイルをキャッシングして表示します。
対象地物(FOI)サーバー: Oracle Spatial and Graphによって管理される地理空間地物をレンダリングします。
AjaxベースのJavaScriptマッピング・クライアント。(Ajaxは、asynchronous JavaScript and XMLの頭字語です。)このクライアントは、マップの閲覧および操作に適した機能と、柔軟なApplication Program Interface (API)を提供します。
マップ・タイル・サーバー(マップ画像キャッシング・エンジン)は、Oracle MapViewerなどのWeb対応マップ・プロバイダによってレンダリングされたマップ画像タイルのフェッチとキャッシングを自動的に実行します。また、キャッシングされたマップ画像タイルをクライアント(Oracle MapsクライアントAPIを使用して開発されたWebアプリケーション)に提供します。提供されたクライアントはその後、複数のマップ画像タイルをまとめ、1つのシームレスで大きなマップを自動的に作成します。それらのマップ画像タイルは事前に生成されキャッシングされるので、アプリケーション・ユーザーにはマップが高速に表示されます。
対象地物(FOI)サーバー(レンダリング・エンジン)は、Oracle Spatial and Graphによって管理される空間地物層のみでなく、アプリケーションによって作成されるポイント型、線型またはポリゴン型の個々の地理空間地物のレンダリングも実行します。そのようなFOI(通常は、レンダリング対象の画像も関連する一連の属性データも含まれる)は、その後クライアントに送信され、ユーザーによって操作されます。キャッシングされたイメージ・タイル(通常は静的コンテンツを表す)とは異なり、FOIは動的であり、リアルタイムのデータベース・コンテンツまたはアプリケーション・コンテンツを表します。動的なFOIとキャッシングされた静的なマップ・タイルを使用すると、Webマッピング・アプリケーションを構築できます。
JavaScriptマッピング・クライアントは、サーバーからマップ・コンテンツをフェッチしてクライアント・アプリケーションに表示するブラウザ側マップ表示エンジンです。また、マップのドラッグやクリックといったユーザーとの対話に関するマップ関連のカスタマイズ可能なコントロールをアプリケーションに提供します。JavaScriptマッピング・クライアントは、任意のWebアプリケーションまたはポータルと簡単に統合できます。
Oracle Mapsを使用して開発したWebマッピング・アプリケーションのアーキテクチャを、図8-1に示します。
アプリケーションは、Oracle Mapsアーキテクチャと次のようにやりとりします(図8-1を参照)。
アプリケーションは、JavaScriptを使用して開発され、WebブラウザのJavaScriptエンジン内で動作します。
アプリケーションは、JavaScriptマップ・クライアントを起動してマップ・タイル・サーバーからマップ画像タイルをフェッチし、Webブラウザにマップを表示します。
アプリケーションは、JavaScriptマップ・クライアントを起動してFOIサーバーから動的空間地物をフェッチし、マップ・タイル上に表示します。
JavaScriptマップ・クライアントが、アプリケーションに代わってユーザーとのマップ関連の対話を制御します。
マップ・タイル・サーバーは、マップ画像タイル・リクエストを受信すると、リクエストされたタイルがキャッシング済であるかどうかをまずチェックします。該当するタイルがキャッシング済の場合は、キャッシング済のタイルがクライアントに返されます。該当するタイルがまだキャッシングされていない場合は、該当するタイルをマップ・タイル・サーバーがフェッチしてキャッシュに格納した後、クライアントに返します。タイルは、MapViewerのマップ・レンダリング・エンジンまたは外部Webマップ・サービス・プロバイダから直接フェッチできます。
FOIサーバーは、リクエストを受信すると、MapViewerのマップ・レンダリング・エンジンを使用して地物画像を生成し、それらの画像を地物属性とともにクライアントに送信します。
図8-2は、Oracle Maps JavaScript V1 APIを使用して作成した単純なアプリケーションのインタフェースを示しています。この例と、サンプル・アプリケーション、チュートリアルおよびAPIドキュメントは、別のmvdemo.earファイルに含まれており、このファイルはhttp://www.oracle.com/technetwork/middleware/mapviewer/からダウンロードできます。mvdemo.earファイルは、mapviewer.earファイルと同じコンテナにデプロイする必要があります。
|
注意: Oracle Maps JavaScript V1およびV2 APIについては、第8.4項を参照してください。第8.1.2.1項「V2 APIを使用した単純なアプリケーション」で説明する単純な例も実質的には同じものですが、実装にはV2 APIを使用します。 |
図8-2で示す単純なアプリケーションには、http://host:port/mvdemo/fsmc/sampleApp.htmlからアクセスできます。このアプリケーションを実行するには、http://host:port/mvdemo/fsmc/tutorial/setup.htmlの手順に従ってデータベース・スキーマおよび必要なマップ・タイル層を設定します。
図8-2に示したアプリケーションでは、顧客をマップ上に表示しています。このマップは、次の2つの層から構成されています。
マップ・タイル層では、海、郡の境界線、都市および高速道路が表示されます。Webブラウザに表示されるマップ・タイル層全体は、マップ・タイル・サーバーによってレンダリングされた複数のマップ画像タイルから構成されます。
FOI層では、マップ・タイル層上に顧客が赤のドット・マーカーで表示されます。顧客を表すマーカーをユーザーがクリックすると、情報ウィンドウが表示され、該当する顧客の一部の属性が表示されます。顧客のマーカーおよび属性は、FOIサーバーによってレンダリングされます。
これら2つの層以外に、マップの左下隅にはスケール・バー、右上隅にはナビゲーション・パネルが表示されます。
アプリケーション・ユーザーは、マウスを使用してマップをドラッグできます。その場合、マップに現在含まれている空間リージョンに対応して、新しいイメージ・タイルおよびFOIが自動的にフェッチされます。また、ユーザーは、組込みマップ・ナビゲーション・ツールを使用して画像のパンやズームを実行したり、「Show customers」ボックスを選択または選択解除して顧客(赤のドット・マーカー)の表示/非表示を切り替えたりすることもできます。
図8-2で示した単純なアプリケーションのソース・コード全体を、例8-1に示します。
例8-1 単純なアプリケーションのソース・コード(V1 API)
<html>
<head>
<META http-equiv="Content-Type" content="text/html" charset=UTF-8">
<TITLE>A sample Oracle Maps Application</TITLE>
<script language="Javascript" src="jslib/oraclemaps.js"></script>
<script language=javascript>
var themebasedfoi=null
function on_load_mapview()
{
var baseURL = "http://"+document.location.host+"/mapviewer";
// Create an MVMapView instance to display the map
var mapview = new MVMapView(document.getElementById("map"), baseURL);
// Add a map tile layer as background.
mapview.addMapTileLayer(new MVMapTileLayer("mvdemo.demo_map"));
// Add a theme-based FOI layer to display customers on the map
themebasedfoi = new MVThemeBasedFOI('themebasedfoi1','mvdemo.customers');
themebasedfoi.setBringToTopOnMouseOver(true);
mapview.addThemeBasedFOI(themebasedfoi);
// Set the initial map center and zoom level
mapview.setCenter(MVSdoGeometry.createPoint(-122.45,37.7706,8307));
mapview.setZoomLevel(4);
// Add a navigation panel on the right side of the map
mapview.addNavigationPanel('east');
// Add a scale bar
mapview.addScaleBar();
// Display the map.
mapview.display();
}
function setLayerVisible(checkBox)
{
// Show the theme-based FOI layer if the check box is checked and
// hide the theme-based FOI layer otherwise.
if(checkBox.checked)
themebasedfoi.setVisible(true) ;
else
themebasedfoi.setVisible(false);
}
</script>
</head>
<body onload= javascript:on_load_mapview() >
<h2> A sample Oracle Maps Application</h2>
<INPUT TYPE="checkbox" onclick="setLayerVisible(this)" checked/>Show customers
<div id="map" style="width: 600px; height: 500px"></div>
</body>
</html>
このサンプル・アプリケーションのコンポーネントとクライアント・アプリケーションを作成するプロセスについては、8.5.1.3項を参照してください。
図8-3は、図8-2と同じロジックを使用した単純な例を示していますが、ここではOracle Maps JavaScript V2 APIを使用しています。
図8-3で示した単純なアプリケーションのソース・コード全体を、例8-2に示します。
例8-2 単純なアプリケーションのソース・コード(V2 API)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>A sample Oracle Maps V2 application</TITLE>
<script language="Javascript" src="/mapviewer/jslib/v2/oraclemapsv2.js"></script>
<script language=javascript>
var customersLayer=null;
function on_load_mapview()
{
var baseURL = "http://"+document.location.host+"/mapviewer";
// Create an OM.Map instance to display the map
var mapview = new OM.Map(document.getElementById("map"),
{
mapviewerURL:baseURL
});
// Add a map tile layer as background.
var tileLayer = new OM.layer.TileLayer(
"baseMap",
{
dataSource:"mvdemo",
tileLayer:"demo_map",
tileServerURL:baseURL+"/mcserver"
});
mapview.addLayer(tileLayer);
// Set the initial map center and zoom level
var mapCenterLon = -122.45;
var mapCenterLat = 37.7706;
var mapZoom = 4;
var mpoint = new OM.geometry.Point(mapCenterLon,mapCenterLat,8307);
mapview.setMapCenter(mpoint);
mapview.setMapZoomLevel(mapZoom);
// Add a theme-based FOI layer to display customers on the map
customersLayer = new OM.layer.VectorLayer("customers",
{
def:
{
type:OM.layer.VectorLayer.TYPE_PREDEFINED,
dataSource:"mvdemo", theme:"customers",
url: baseURL,
loadOnDemand: false
}
});
mapview.addLayer(customersLayer);
// Add a navigation panel on the right side of the map
var navigationPanelBar = new OM.control.NavigationPanelBar();
navigationPanelBar.setStyle({backgroundColor:"#FFFFFF",buttonColor:"#008000",size:12});
mapview.addMapDecoration(navigationPanelBar);
// Add a scale bar
var mapScaleBar = new OM.control.ScaleBar();
mapview.addMapDecoration(mapScaleBar);
// Display the map.
// Note: Change from V1. In V2 initialization and display is done just once
mapview.init();
}
function setLayerVisible(checkBox)
{
// Show the customers vector layer if the check box is checked and
// hide it otherwise.
if(checkBox.checked)
customersLayer.setVisible(true) ;
else
customersLayer.setVisible(false);
}
</script>
</head>
<body onload= javascript:on_load_mapview() >
<h2>A Sample Oracle Maps V2 Application</h2>
<INPUT TYPE="checkbox" onclick="setLayerVisible(this)" checked/>Show customers
<div id="map" style="width: 600px; height: 500px"></div>
</body>
</html>
この項では、Webブラウザ内でマップを表示する際にJavaScriptクライアントが様々なマップ・コンテンツを内部で編成する方法について解説します。アプリケーションは通常1つのマスターHTML DIVオブジェクトを1つのWebページに配置し、JavaScriptクライアントはそのDIVオブジェクト内に様々なコンテンツ層を追加します。
マップ・クライアントによって表示されるマップ・コンテンツは、一連の層によって編成されます。アプリケーション・スクリプトが適切なマップ・クライアントAPIを起動すると、1つのマップ・コンテナ内に一連のマップ層が作成されます。マップ・コンテナは、ユーザー定義のHTML DIVオブジェクトです。Webページ内では、マップ・コンテナのサイズと位置をカスタマイズできます。マップ層のレイアウトを、図8-4に示します。
図8-4で示したように、マップ・コンテンツ層には、マップ・タイル、テーマベースFOI、ユーザー定義のFOIまたはレッドライン、情報ウィンドウ、固定図という5つのタイプがあります。固定図層を除く層はすべて、ユーザーがマップをドラッグすると、まとまって移動します。これらの可動層は、マップがドラッグされたりズームされたりすると、マップ・クライアントによって自動的に更新されます。(固定図層が移動されることはありません。)
通常のOracle Mapsアプリケーションは、マップ・タイル層を1つ以上持ち、マップ・タイル・サーバーから事前に生成された一連のマップ画像タイルを組み立てて表示します。マップ・タイル層によって表示される静的マップ・コンテンツは、さほど変化しないため、通常はクライアント・アプリケーションによりバックグラウンド・マップとして使用されます。たとえば、8.1.2項および図8-2で説明したサンプル・アプリケーションの場合は、海、郡の境界線、都市および高速道路がすべて、マップ・タイル層として表示されています。マップ・タイル層で実行可能なユーザー操作は、マップのドラッグなどの一部の操作に限られています。
マップ・タイル層は通常、MapViewerベース・マップに関連付けられており、MapViewerサーバーによって管理されます。ただし、外部(MapViewer以外)のマップ・プロバイダにより提供されるマップ画像タイルをキャッシュできるように、マップ・タイル層を構成できます。
また、Oracle Mapsクライアントは、外部のタイル・サーバーによって直接提供されるカスタムまたは組み込まれた外部タイル層を表示することもできます。組込みのGoogle MapsやMicrosoft Bing Mapsタイル層は、その一例です。詳細は、第8.6項「Google MapsとBing Mapsの使用」およびJavaScript APIドキュメントのクラスMVGoogleTileLayerとMVBingTileLayerを参照してください。(Google MapsまたはBing Mapsタイル層の上に独自の空間データをオーバーレイする必要がある場合、8.7項「Spherical Mercator座標系へのデータ変換」も参照してください。)
マップ・タイル層は常に、層階層の最下部に位置します。マップ・タイル層には、静的なマップ・コンテンツおよびバックグラウンド・マップ・コンテンツが表示されます。こうした層が複数含まれる場合、すべての層について座標系とズーム・レベルの定義が同一である必要があります。
内部では、マップ・タイル層は、マップDIVコンテナ・ウィンドウのサイズより大きいのが普通です。そのため、ブラウザは、その他のタイルのフェッチおよびキャッシングを実行できます。その結果、それらのタイルは、マップ層がユーザーによってドラッグされるとすぐに表示されます。
テーマベースFOI層は1つ以上存在できます。それぞれのテーマベースFOI層は、MapViewerの事前定義済テーマで定義されている特定の問合せ基準を満たす一連の対話型FOIから構成されています。FOIは、ポイント、線またはポリゴンの場合があります。たとえば、売上高が$100,000を超えている店舗をすべて、ポイントのテーマベースFOI層として表示することもできます。
ユーザーは、マウスを重ねたり、クリックしたりすることにより、FOIを操作できます。アプリケーションでは、そのようなユーザー操作に対するマップ・クライアントの反応方法をカスタマイズできます。
テーマベースFOI層の地物(地理的および非地理的)はすべて、データベースに格納されます。クライアント・アプリケーションから地物がリクエストされると、FOIサーバーにより地物に対して問合せとレンダリングが実行されます。テーマベースFOI層をサーバーからリフレッシュすることなくマップをドラッグできるような余地を設けられるように、テーマベースFOI層の問合せウィンドウをカスタマイズして、マップDIVウィンドウよりも大きくできます。テーマベースFOI層の詳細は、8.3.1項を参照してください。
ユーザー定義FOIとは、クライアント側で定義されるインタラクティブな地物のことです。FOIは、ポイント地物、線地物またはポリゴン地物の場合があります。ユーザーは、テーマベースFOIの場合と同じ方法で、ユーザー定義FOIを操作できます。ただし、一連の地物としてレンダリングされるテーマベースFOI層の場合とは対照的に、ユーザー定義FOIのリクエストおよびレンダリングは個々に実行されます。ジオメトリの表現やレンダリング・スタイルも含め、ユーザー定義FOIの属性はすべて、アプリケーションで提供する必要があります。たとえば、ユーザー指定の始点アドレスおよび終点アドレスに基づいたルート・ジオメトリは、ユーザー定義の線FOIとしてマップに表示する必要があります。
ユーザー定義のFOI層の処理は、アプリケーションが動作するWebブラウザにより、次のように異なります。
Microsoft Internet Explorerの場合は、アプリケーションによって追加されたユーザー定義の各FOIがすべて、テーマベースFOI層のすぐ上の層の中に配置されます。該当する層は、最大1つしか存在できません。
OperaおよびMozillaベースのブラウザ(Netscape、Firefoxなど)の場合は、ユーザー定義の各FOIがすべて2つの層(一方はポイント地物用、他方はポリラインやポリゴンなどの非ポイント地物用)の内部に配置されます。非ポイント地物層は、ポイント地物層の下に配置されます。
マップ・タイル・サーバーは、事前に生成される固定サイズのマップ画像タイルをキャッシングして表示するマップ画像キャッシング・エンジンです。これは、MapViewerサーバーの一部であるJavaサーブレットとして実装されます。マップ・タイル・サーバーは、タイルのズーム・レベルおよびタイル位置(メッシュ・コード)によって指定されたマップ画像タイルを要求するリクエストを受け付け、リクエストされたタイルをクライアントに返送します。
マップ・タイル・サーバーの基本的なワークフローを、図8-5に示します。
図8-5のように、マップ・タイル・サーバーは、マップ・タイルを求めるリクエストを受信すると、該当するタイルをキャッシュ・ストレージ・システム内で検索します。該当するタイルがキャッシュされていると、マップ・タイル・サーバーはそのタイルをクライアントに送信します。該当するタイルがキャッシュされていない場合は、該当するタイルをフェッチしてキャッシュに保存した後、クライアントに送信します。
MapViewer管理ツールを使用すると、マップ・タイル・サーバーを管理できます。
この項では、Oracle Mapsを効果的に使用するために知っておくべき、マップ・タイル・サーバーに関する概念について説明します。
マップ・タイル層はすべてマップ・タイル・サーバーで管理されます。マップ・タイル・サーバーは、マップ・タイル層に属するマップ画像タイルのフェッチおよび格納を実行した後、マップ画像タイルをクライアントに返します。マップ・タイル・サーバーでは複数のマップ・タイル層を管理できます。
どのマップ・タイル層にも、事前定義済のズーム・レベルを複数持たせることができます。各ズーム・レベルに、0からn-1 (nはズーム・レベルの総数)のズーム・レベル番号のうち1つが割り当てられます。ズーム・レベル0は最もズーム・アウトしたレベル、ズーム・レベルn-1は最もズーム・インしたレベルです。
マップは、ズーム・レベルごとに、同一サイズの小さな一連のマップ画像タイルに均等に分割されています。クライアントは、そのズーム・レベルおよびタイル・メッシュ・コードによってマップ・タイルを指定します。
マップ・タイル層は、次の2つのタイプのソースから得られます。
MapViewer内部のベース・マップ(MapViewerマップ・レンダリング・エンジンによってレンダリングされる)。MapViewerベース・マップは、事前定義済の一連のテーマから構成され、データベース・ビューUSER_SDO_MAPS内で事前定義済である必要があります。
外部Webマップ・サービス・プロバイダによってレンダリングされたマップ。外部Webマップ・サービス・プロバイダは、Webを介したクライアント・リクエストに対してマップのレンダリングおよび表示を実行するサーバーです。外部マップ・サービス・プロバイダからマップをフェッチできるアダプタを正しく構成すると、マップ・タイル・サーバーは該当する外部マップ・サービス・プロバイダによって生成された一連のマップ・タイルをフェッチして表示できるようになります。(マップ・タイル・サーバーが内部で動作しているMapViewer以外のMapViewerインスタンスも、外部マップ・サービス・プロバイダとみなされます。)
Oracle Mapsでは、ローカル・ファイル・システムを使用して、キャッシュされたイメージ・タイルを格納します。この格納に使用されるパスは、マップ・タイル・サーバーの構成設定の一部としてカスタマイズできます。
マップ・タイル・サーバーでは、同一サイズの小さな矩形のイメージ・タイルとして一連のマップ画像をキャッシュし、管理します。タイル処理は現在、任意の2次元のデカルト座標系でサポートされています。測地座標系も、デカルト座標系であるかのようにマッピングされる場合(図8-6のように経度および緯度が単に2つの直交軸として取り扱われる場合)はサポートされています。
ズーム・レベルごとに、マップ・タイルはマップ座標系全体を2つの次元(XとY。図8-6では緯度と経度)に沿って均等に分割して作成されます。マップ・タイル・サーバーは、マップ画像タイルを作成する際、マップ座標系のこの次元情報を必要とします。そのため、マップ・タイル層の構成設定でこの情報を指定する必要があります。
マップ座標系全体は1つの矩形として表現でき、その境界線は(Xmin, Ymin)および(Xmax, Ymax)として指定します(Xminは座標系で許可される最小のX値、Yminは許可される最小のY値、Xmaxは許可される最大のX値、Ymaxは許可される最大のY値)。図8-6の場合、Xminは–180、Yminは–90、Xmaxは180、Ymaxは90です。
また、マップ・タイル・サーバーがマップ・スケールを計算できるように、座標系の空間参照ID (SRID)も指定する必要があります。
各マップ・タイルは、(Mx, My)という整数のペアとして定義されるメッシュ・コードによって指定します(MxはタイルのXディメンション・インデックス、MyはタイルのYディメンション・インデックスを指定する)。タイルがXminから始まるXディメンション上のi番目のタイルである場合、Mxはi-1になります。タイルがYminから始まるYディメンション上のj番目のタイルである場合、Myはj-1になります。マップ上のタイルのメッシュ・コードを、図8-7に示します。
JavaScriptマップ・クライアントは、Webブラウザにマップを表示するのに必要なタイルを自動的に計算し、メッシュ・コードを指定したリクエストをサーバーに送信します。メッシュ・コードはアプリケーションにとって透過的であり、アプリケーションの開発者はメッシュ・コードを直接取り扱う必要がありません。
マップの分割方法およびタイルの作成方法を決めるタイル処理ルールを作成する必要があります。マップ・タイル・サーバーは、そのようなタイル処理ルールを使用してマップを小さなマップ画像タイルに分割し、タイル・ストレージ・システムに格納します。そのようなルールは、JavaScriptマップ・クライアントも使用します。
1つのズーム・レベルに対応するタイルはすべて同じサイズなので、マップ・タイル・サーバーはタイルの分割を実行するために次の情報を必要とします。
画面ピクセルで指定したマップ・タイル画像のサイズ(幅と高さ)。これは、タイル画像の物理サイズです。
マップ座標系に従って指定されたタイル・サイズ。たとえば、マップで測地座標系を使用する場合、タイルの幅と高さは度の単位で指定します。このサイズは、タイルの幅と高さを使用して明示的に指定することもできますし、マップ・スケールを使用して暗黙的に指定することもできます。(マップ・スケールとタイル画像のサイズから、マップ座標系に従ってタイルの幅と高さを求めることができます。)
先の情報が、ズーム・レベルに対応するタイル処理ルールになります。どのズーム・レベルも、独自のタイル処理ルールを持つ必要があります。マップ・タイル・サーバーに対して構成設定を指定する場合は、8.2.2項で示すように、タイル処理ルールを定義する必要があります。
マップ・タイル・サーバーの構成設定は、ローカルな構成ファイルおよびデータベース・ビューに格納されています。それらの設定は、カスタマイズが可能です。
ロギング・オプションやデフォルトのキャッシュ・ストレージ・ディレクトリといったマップ・タイル・サーバーのグローバル設定は、MapViewer構成ファイルmapViewerConfig.xml(ディレクトリ$MAPVIEWER_HOME/web/WEB-INF/confの下)に格納されています。
マップ・タイル・サーバーの構成設定は、次の例で示すように、トップレベルの<mapperConfig>要素の中の<map_tile_server>要素で定義されています。
<map_tile_server> <tile_storage default_root_path="/scratch/tilecache/"/> </map_tile_server>
<tile_storage>要素は、マップ・タイル・ストレージについての設定を指定します。default_root_path属性では、キャッシングされたタイル画像が格納されるデフォルトのファイル・システム・ディレクトリを指定します。デフォルトのルート・ディレクトリは、設定されていない場合または有効でない場合、$MAPVIEWER_HOME/web/tilecacheになります。マップ・タイル層の構成でそれ自体のマップ・タイル・ストレージ・ディレクトリが指定されていない場合は、今示したディレクトリの下にサブディレクトリが1つ作成され、マップ・タイル層用に使用されます。このサブディレクトリの名前は、マップ・タイル層の名前と同じになります。
マップ・タイル層の構成設定は、メタデータ・ビューUSER_SDO_CACHED_MAPSに格納されます。通常、このビューは直接操作せず、MapViewer管理ツールを介して使用して、マップ・タイル層を構成します。
どのデータベース・ユーザー(スキーマ)も、独自のUSER_SDO_CACHED_MAPSビューを持ちます。このビュー内の各エントリには、各マップ・タイル層の構成設定が格納されます。マップ・タイル層がMapViewer内部ベース・マップに基づく場合、そのマップ・タイル層に関連付けられているベース・マップは、マップ・タイル層の構成設定が格納されているのと同じデータベース・スキーマに定義されている必要があります。
マップ・タイル・サーバーは、MapViewerデータソースによって指定されているデータベース接続を使用してUSER_SDO_CACHED_MAPSビューに問合せを実行し、マップ・ソースの構成を取得します。この処理は、MapViewerの管理リクエストの結果としてマップ・タイル・サーバーが起動された場合またはMapViewerに新しいデータソースが追加された場合に実行されます。
USER_SDO_CACHED_MAPSビューには、表8-1に示す列があります。
表8-1 USER_SDO_CACHED_MAPSビュー
| 列名 | データ型 | 説明 |
|---|---|---|
|
NAME |
VARCHAR2 |
キャッシング対象マップ・ソースの一意な名前 |
|
DESCRIPTION |
VARCHAR2 |
キャッシング対象マップ・ソースのオプションの記述テキスト |
|
TILES_TABLE |
VARCHAR2 |
(現在は未使用) |
|
IS_ONLINE |
VARCHAR2 |
マップ・タイル層がオンラインの場合は |
|
IS_INTERNAL |
VARCHAR2 |
マップ・ソースが内部マップ・ソースの場合は |
|
DEFINITION |
CLOB |
マップ・タイル層のXML定義(この項で後述)。 |
|
BASE_MAP |
VARCHAR2 |
キャッシング対象のMapViewerベース・マップの名前(マップ・ソースが内部マップ・ソースの場合) |
|
MAP_ADAPTER |
BLOB |
外部マップ・サービス・プロバイダのアダプタJavaクラスが含まれるjarファイル(この項で後述)。 |
DEFINITION列の場合、マップ・ソースの定義は一般的に次の形式になります。
<map_tile_layer
name = "map tile layer name"
image_format ="tile-image-format">
<internal_map_source
data_source="name-of-data-source"
base_map="name-of-MapViewer-base-map"
bgcolor="base-map-background-color"
antialias="whether-to-turn-on-antialiasing"
/>
</internal_map_source>
<external_map_source
url="external-map-service-url"
adapter_class="name-of-adapter-class"
proxy_host=" proxy-server-host "
proxy_port="proxy-server-port"
timeout="request-timeout"
request_method="http-request-method: 'GET'|'POST'">
<properties>
<property name="property-name" value="property-value"/>
…
</properties>
</external_map_source>
<tile_storage
root_path="disk-path-of-cache-root-directory"
</tile_storage>
<coordinate_system
srid="coordinate-system-srid"
minX="minimum-allowed-X-value"
maxX="maximum-allowed-X-value"
minY="minimum-allowed-Y-value"
maxY="maximum-allowed-Y-value">
</coordinate_system>
<tile_image
width="tile-image-width-in-screen-pixels"
height="tile-image-height-in-screen-pixels" >
</tile_image>
<tile_bound>
<coordinates> … </coordinates>
</tile_bound>
<zoom_levels
levels="number-of-zoom-levels"
min_scale="map-scale-at-highest-zoom-level"
max_scale="map-scale-at-lowest-zoom-level"
min_tile_width="tile-width-specified-in-map-data-units-at-
highest-zoom-level"
max_tile_width="tile-width-specified-in-map-data-units-at-
lowest-zoom-level">
<zoom_level
description="zoom-level-description"
level_name="zoom-level-name"
scale="map-scale-of-zoom-level"
tile_width ="tile-width-specified-in-map-data-units"
tile_height ="tile-height-specified-in-map-data-units">
<tile_bound>
<coordinates> … </coordinates>
</tile_bound>
</zoom_level>
…
</zoom_levels>
</map_tile_layer>
マップ・タイル層を定義するXMLのDTDは、A.9項にリストされています。
例8-3は内部マップ・タイル層のXML定義、例8-4は外部マップ・タイル層のXML定義を示しています。<map_tile_layer>要素およびそのサブ要素の説明は、これらの例の後に示します。
例8-3 内部マップ・タイル層のXML定義
<?xml version = '1.0'?>
<!-- XML definition of an internal map tile layer.
-->
<map_tile_layer image_format="PNG">
<internal_map_source base_map="demo_map"/>
<tile_storage root_path="/scratch/mapcache/"/>
<coordinate_system
srid="8307"
minX="-180" maxX="180"
minY="-90" maxY="90"/>
<tile_image width="250" height="250"/>
<zoom_levels>
<zoom_level description="continent level" scale="10000000"/>
<zoom_level description="country level" scale="3000000"/>
<zoom_level description="state level" scale="1000000"/>
<zoom_level description="county level" scale="300000"/>
<zoom_level description="city level" scale="100000"/>
<zoom_level description="street level" scale="30000"/>
<zoom_level description="local street level" scale="10000"/>
</zoom_levels>
</map_tile_layer>
例8-4 外部マップ・タイル層のXML定義
<?xml version = '1.0'?>
<!-- XML definition of an external map tile layer.
-->
<map_tile_layer image_format="PNG">
<external_map_source
url="http://elocation.oracle.com/elocation/lbs"
adapter_class="mcsadapter.MVAdapter">
<properties>
<property name="data_source" value="elocation"/>
<property name="base_map" value="us_base_map"/>
</properties>
</external_map_source>
<tile_storage root_path="/scratch/mapcache"/>
<coordinate_system
srid="8307"
minX="-180" maxX="180"
minY="-90" maxY="90"/>
<tile_image width="250" height="250"/>
<!—
The following <zoom_levels> element does not have any
<zoom_level> element inside it. But since it has its levels,
min_scale and max_scale attributes set, map tile server will
automatically generate the <zoom_level> elements for the 10
zoom levels.
-->
<zoom_levels levels="10" min_scale="5000" max_scale="10000000" />
</map_tile_layer>
トップレベルの要素は<map_tile_layer>です。image_format属性ではタイル画像の形式を指定しますが、この属性で現在サポートされている値はPNG、GIFおよびJPGです。PNGおよびGIFの画像は一般に、ベクター・ベースのマップに適しています。一方、JPG画像は、圧縮率に優れているので、一般に衛星画像のようなラスター・マップに適しています。現在は、PNG形式のタイル画像のみ、バックグラウンドを透明にできます。
<internal_map_source>要素は、マップ・タイルがMapViewerのローカル・インスタンスによってレンダリングされる場合にのみ必須です。base_map属性は、必須であり、マップ・タイル・サーバーによってキャッシングされる事前定義済のMapViewerベース・マップを指定します。その値は、USER_SDO_CACHED_MAPSビュー内のBASE_MAP列のエントリに一致する必要があります。bgcolor属性は、オプションであり、マップのバックグラウンド・カラーを指定します。この属性の値をNONEに設定すると、バックグラウンドは透明になります。(現在、MapViewerでレンダリングできるのは、透明なPNGマップ・タイルのみです。)
<external_map_source>要素は、マップ・タイルが外部マップ・サービス・プロバイダによってレンダリングされる場合にのみ必須です。この要素には、次の属性があります。
url属性は、必須であり、マップ・タイルをフェッチできるマップ・サービスのURL (http://myhost/mapviewer/omserverなど)を指定します。
adapter_class属性は、必須であり、パッケージ名が含まれる、マップ・アダプタ・クラスのフルネーム(mcsadapter.MVAdapterなど)を指定します。
proxy_host属性およびproxy_port属性は、プロキシ・サーバーを介して外部マップ・プロバイダ・サーバーにアクセスする必要がある場合にのみ必要であり、それぞれプロキシ・サーバーのホスト名およびポート番号を指定します。proxy_hostをNONEとして指定すると、マップ・タイル・リクエストはすべて、プロキシ・サーバーを経由することなく、リモート・サーバーに直接送信されます。proxy_hostを省略するか、空白を指定すると、マップ・タイル・リクエストの送信時に、mapViewerConfig.xmlファイルで定義されているMapViewerのグローバル・プロキシ設定が使用されます。
timeout属性は、オプションであり、外部マップ・タイル画像に対するマップ・タイル・サーバーの最大待ち時間(ミリ秒数)を指定します。デフォルトのタイムアウト値は15000です。
request_method属性は、オプションであり、マップ・タイル・リクエストを送信する場合のHTTPリクエスト・メソッドです。その値は、POST(デフォルト)またはGETです。
<external_map_source>要素内の<properties>要素には<property>要素を複数含めることができ、そのそれぞれではマップ・タイルをフェッチする際にマップ・アダプタが使用する各ユーザー定義パラメータを指定します。マップ・ソース・アダプタが同一でも、別々のパラメータ・セットを使用すれば、別々のマップ・タイル層をフェッチできます。たとえば、MapViewerに同梱されているサンプルのMapViewerアダプタmcsadapter.MVAdapterでは、次のように定義されているパラメータを受け付けます。
<properties> <property name="data_source" value="elocation"/> <property name="base_map" value="us_base_map"/> </properties>
ただし、このアダプタを使用する場合は、value属性の値を変更すれば、同一のデータソースまたは他のデータソースから、別のベース・マップをフェッチできます。
<tile_storage>要素は、マップ・タイル層のストレージ設定を指定します。オプションのroot_path属性では、タイル・ストレージのルート・ディレクトリとして使用するファイル・システム・ディレクトリを指定します。この属性が省略されているか無効であると、mapViewerConfig.xmlファイルで定義されているデフォルトのルート・ディレクトリが使用されます。
<coordinate_system>要素は、マップ座標系を指定し、いくつかの必須属性があります。srid属性では、座標系の空間参照IDを指定します。minX属性ではXディメンションの下限、minY属性ではYディメンションの下限、maxX属性ではXディメンションの上限、maxY属性ではYディメンションの上限を指定します。標準の経度/緯度(WGS 84)座標系の場合、srid値は8307で、minX、minY、maxXおよびmaxYの値はそれぞれ-180、-90、180および90です。
内部マップ・タイル層の場合、マップ座標系はデータ座標系と異なっていてもかまいません。それらが異なっている場合、マップ・タイル・サーバーでは<coordinate_system>要素で定義されている座標系にマップ・データを変換し、その座標系を使用してマップ・タイル画像をレンダリングします。
<tile_image>要素は、タイル画像のサイズ設定を指定し、次の必須属性があります。つまり、widthではタイル画像の幅を画面ピクセル単位で指定し、heightではタイル画像の高さを画面ピクセル単位で指定します。
オプションの<tile_bound>要素では、キャッシングされたマップ・タイルの枠ボックスを指定します。マップ・タイル・サーバーでは、このボックス内のタイルのみをフェッチし、リクエストされたタイルがこのボックスの外部にある場合は空白のタイルを返します。枠ボックスは、マップ・データ座標系内で矩形によって指定します。該当する矩形は、<coordinates>要素により、次の形式で指定します。
<coordinates>minX, minY, maxX, maxY</coordinates>
キャッシュのデフォルトの枠ボックスは、<coordinate_system>要素で指定される枠ボックスと同じです。
<zoom_levels>要素では、事前定義済のズーム・レベルを指定します。事前定義済のズーム・レベルにある画像タイルのみが、マップ・タイル・サーバーによってキャッシングされ、表示されます。<zoom_levels>要素で持つことができる複数の<zoom_level>要素のそれぞれでは、事前定義済の1つのズーム・レベルを指定します。<zoom_level>要素が存在しない場合、マップ・タイル・サーバーは<zoom_levels>要素内の次の属性を使用して、<zoom_level>要素を自動的に生成します。(それらの属性は、省略が可能であり、いずれかの<zoom_level>要素が存在する場合は無視されます。)
levelsでは、ズーム・レベルの総数を指定します。
min_scaleでは、最高のズーム・レベル(最もズーム・インしたレベル)にあるマップ画像のスケールを指定します。
max_scaleでは、最低のズーム・レベル(最もズーム・アウトしたレベル)にあるマップ画像のスケールを指定します。
min_tile_widthでは、最高のズーム・レベルにあるマップ・タイルの幅を指定します。この幅は、マップ・データ単位で指定します。
max_tile_widthでは、最低のズーム・レベルにあるマップ・タイルの幅を指定します。この幅は、マップ・データ単位で指定します。
各ズーム・レベルの定義をマップ・タイル・サーバーが自動的に生成できるようにするには、前述の属性を次のように組み合せて指定する必要があります。
levels、min_scaleおよびmax_scale
levels、min_tile_widthおよびmax_tile_width
ズーム・レベルをこのように定義すると、マップ・タイル・サーバーは各ズーム・レベルの定義をすべて自動的に導出し、それらのズーム・レベルで生成された<zoom_level>要素を使用してXML定義を更新します。各ズーム・レベルはその後、必要に応じて調整できます。
各ズーム・レベルには、ズーム・レベルの定義順に基づいて、マップ・タイル・サーバーによりズーム・レベル番号が割り当てられます。<zoom_levels>要素内で定義される最初のズーム・レベルはズーム・レベル0、2番目のズーム・レベルはズーム・レベル1、...のようになります。これらのズーム・レベル番号は、事前定義済のズーム・レベルを参照するために、タイル・リクエスト内で使用されます。
<zoom_level>要素は、事前定義済のズーム・レベルを指定し、いくつかの属性を持ちます。description属性は、オプションであり、ズーム・レベルの説明文を指定します。level_name属性は、オプションであり、ズーム・レベルの名前を指定します。scale属性は、ズーム・レベルのマップ・スケールを指定し、tile_width属性およびtile_height属性が定義されていない場合は必須です。tile_width属性およびtile_height属性ではそれぞれ、タイルの幅および高さをマップ・データ単位で指定します。fetch_larger_tiles属性は、オプションであり、小さなマップ画像タイルのかわりに大きなマップ画像をフェッチするかどうかを指定します。値がTRUE(デフォルト)の場合は、複数のマップ・タイルから構成される大きなマップ画像がフェッチされ、小さなマップ画像タイルに分割されます。そのため、マップ・タイル・サーバーとマップ・サービス・プロバイダの間のネットワーク・ラウンドトリップを抑えられます。
<zoom_level>要素では、scale属性か、tile_width要素およびtile_height要素の両方を指定する必要があります。
<zoom_level>要素内の<tile_bound>要素では、ズーム・レベルに合せてキャッシュされたマップ・タイルの枠ボックスを指定します(オプション)。マップ・タイル・サーバーでは、このボックス内のタイルのみをフェッチし、リクエストされたタイルがこのボックスの外部にある場合は空白のタイルを返します。枠ボックスは、マップ・データ座標系内で指定された矩形によって指定します。該当する矩形は、<coordinates>要素(この項で前述)によって指定します。<zoom_level>要素内で<tile_bound>要素を指定すると、XML階層内で上位にある<tile_bound>要素で指定されているキャッシュの枠ボックスの設定全体がオーバーライドされます。
外部マップ・ソース・アダプタは、マップ・タイル・サーバーと外部マップ・サービス・プロバイダの間のインタフェースです。外部マップ・サービス・プロバイダからマップ画像タイルをフェッチする必要がある場合、マップ・タイル・サーバーはタイルのズーム・レベル、サイズおよび位置に関する情報を指定して、外部マップ・ソース・アダプタをコールします。外部マップ・ソース・アダプタはその後、プロバイダに固有のリクエストを作成した後、そのリクエストを外部マップ・サービス・プロバイダに送信し、得られたイメージ・タイルをマップ・タイル・サーバーに返します。
外部マップ・ソース・アダプタは、1つのJavaクラスであり、Javaの抽象クラスoracle.mapviewer.share.mapcache.MapSourceAdapter(定義は次のとおり)を拡張する必要があります。
public abstract class MapSourceAdapter
{
public abstract String getMapTileRequest(TileDefinition tile);
public byte[] getTileImageBytes(TileDefinition tile) ;
public Properties getProperties() ;
}
このクラスを拡張するアダプタでは、次のメソッドを実装する必要があります。
public String getMapTileRequest(TileDefinition tile)
このメソッドでは、マップ・サービス・プロバイダに送信してマップ画像タイルをフェッチできるHTTPリクエスト文字列を作成するロジックを実装します。たとえば、マップ・タイルのURLがhttp://myhost/mymapserver?par1=v1&par2=v2&par3=v3の場合、このメソッドから返されるHTTPリクエスト文字列はpar1_v1&par2=v2&par3=v3になります。
マップ・タイル・サーバーは、特定のマップ・タイルが見つからない場合、getTileImageBytesメソッドをコールして該当するタイル画像のバイナリ・データをフェッチします。このメソッドは、getMapTileRequestメソッドをコールし、マップ・タイル・リクエストを作成して該当するタイルをフェッチします。getMapTileRequestメソッドが受け取る唯一のパラメータであるTileDefinitionオブジェクトでは、リクエストされたタイルのズーム・レベル、枠ボックス、画像サイズおよび画像形式を指定します。このメソッドでは、HTTPリクエスト文字列を返します。
また、マップ・ソース・アダプタは、クラスMapSourceAdapterに実装されているすべてのメソッドを継承します。それらの中で、他のメソッドに比べて重要なメソッドは次のとおりです。
public byte[] getTileImageBytes(TileDefinition tile)
このメソッドは、外部マップ・サービス・プロバイダから実際のバイナリ・マップ・タイル画像データをフェッチします。このメソッドは、実装済です。これは、抽象メソッドgetMapTileRequestをコールしてマップ・タイル・リクエストを作成し、そのリクエストを外部マップ・サービス・プロバイダに送信します。HTTPリクエストの送信によってマップ・タイルをフェッチできない場合は、このメソッドをオーバーライドし、マップ・ソースから画像タイルをフェッチするための適切なロジックを実装できます。このメソッドが受け取る唯一のパラメータであるTileDefinitionオブジェクトでは、リクエストされたタイルのズーム・レベル、枠ボックス、画像サイズおよび画像形式を指定します。このメソッドは、マップ・タイル層の構成設定で指定されている画像形式でエンコードされたバイナリ・タイル画像データを返します。
public Properties getProperties()
このメソッドでは、8.2.2.2項で説明したマップ・タイル層の構成設定内で定義されている、プロバイダに固有のパラメータを返します。
MapSourceAdapterクラスおよびTileDefinitionクラスは、mvclient.jar($MAPVIEWER_HOME/web/WEB/libディレクトリ内)にパッケージされています。
外部マップ・ソース・アダプタの例を、例8-5に示します。
例8-5 外部マップ・ソース・アダプタ
/**
* This is a sample map source adapter that can be used to fetch map
* tiles from a MapViewer instance.
*/
package mcsadapter ;
import java.awt.Dimension;
import java.net.URL;
import java.util.Properties;
import oracle.lbs.mapclient.MapViewer;
import oracle.lbs.mapcommon.MapResponse;
import oracle.mapviewer.share.mapcache.*;
/**
* The map source adapter must extend class
* oracle.lbs.mapcache.cache.MapSourceAdapter.
*/
public class MVAdapter extends MapSourceAdapter
{
/**
* Gets the map tile request string that is to be sent to the map
* service provider URL.
* @param tile tile definition
* @return request string
*/
public String getMapTileRequest(TileDefinition tile)
{
// Get map source specified parameters
Properties props = this.getProperties() ;
String dataSource = props.getProperty("data_source") ;
String baseMap = props.getProperty("base_map") ;
// Use oracle.lbs.mapclient.MapViewer to construct the request string
MapViewer mv = new MapViewer(this.getMapServiceURL()) ;
mv.setDataSourceName(dataSource);
mv.setBaseMapName(baseMap);
mv.setDeviceSize(new Dimension(tile.getImageWidth(),
tile.getImageHeight()));
mv.setCenterAndSize(tile.getBoundingBox().getCenterX(),
tile.getBoundingBox().getCenterY(),
tile.getBoundingBox().getHeight());
int format = MapResponse.FORMAT_PNG_STREAM ;
String req = null ;
switch(tile.getImageFormat())
{
case TileDefinition.FORMAT_GIF:
mv.setImageFormat(MapResponse.FORMAT_GIF_URL);
req = mv.getMapRequest().toXMLString().replaceFirst(
"format=\"GIF_URL\"", "format=\"GIF_STREAM\"") ;
break ;
case TileDefinition.FORMAT_PNG:
mv.setImageFormat(MapResponse.FORMAT_PNG_URL);
req = mv.getMapRequest().toXMLString().replaceFirst(
"format=\"PNG_URL\"", "format=\"PNG_STREAM\"") ;
break ;
case TileDefinition.FORMAT_JPEG:
mv.setImageFormat(MapResponse.FORMAT_JPEG_URL);
req = mv.getMapRequest().toXMLString().replaceFirst(
"format=\"JPEG_URL\"", "format=\"JPEG_STREAM\"");
break ;
}
byte[] reqStr = null ;
try
{
reqStr = req.getBytes("UTF8") ;
}
catch(Exception e)
{}
// Return the request string.
return "xml_request="+ new String(reqStr);
}
}
MapSourceAdapter.getTileImageBytesメソッドの実装を、例8-6に示します。
例8-6 MapSourceAdapter.getTileImageBytesの実装
/**
* Fetches the map image tile from the external map service provider by
* sending the HTTP map tile request to the map service provider, and
* return the binary tile image data. You can rewrite this method so that
* the adapter can fetch the tile from an external map service provider
* that does not accept HTTP requests at all.
* @param tile the tile definition
* @return the binary tile image data.
* @throws Exception
*/
public byte[] getTileImageBytes(TileDefinition tile)
throws Exception
{
// construct request string
String request = getMapTileRequest(tile) ;
if(request == null)
{
throw new Exception("Null map tile request string in map source adapter!") ;
}
// set proxy settings
Proxy proxy = null ;
/* If the proxyHost is "NONE", the request is sent directly to the
* external server. If the proxyHost is a valid host, that host will
* be used as the proxy server. If the proxyHost is empty of omitted,
* the global proxy setting in mapViewerConfig.xml will be in effect.
*/
boolean noProxy = "NONE".equalsIgnoreCase(getProxyHost()) ;
if(getProxyHost()!=null && !noProxy)
{
SocketAddress addr = new InetSocketAddress(proxyHost, proxyPort);
proxy = new Proxy(Proxy.Type.HTTP, addr);
}
// send the request and get the tile image binary
PrintWriter wr = null ;
BufferedInputStream bis = null;
try
{
String urlStr = mapServiceURL ;
if("GET".equalsIgnoreCase(httpMethod))
urlStr = mapServiceURL + "?" + request ;
log.finest("http "+httpMethod+": "+urlStr);
URL url = new URL(urlStr);
// Open a URL connection based on current proxy setting
URLConnection conn =
proxy!=null? url.openConnection(proxy):
(noProxy? url.openConnection(Proxy.NO_PROXY):
url.openConnection()) ;
conn.setConnectTimeout(timeOut);
if("GET".equalsIgnoreCase(getHTTPMethod()))
conn.connect();
else
{
conn.setDoOutput(true);
wr = new PrintWriter(conn.getOutputStream());
wr.print(request);
wr.flush();
wr.close();
wr = null ;
}
bis = new BufferedInputStream(conn.getInputStream());
byte[] result = toBytes(bis) ;
bis.close();
bis = null ;
return result;
}
catch(Exception ioe)
{
throw new Exception("Failed to fetch external map tile.", ioe);
}
finally
{
try
{
if(bis != null)
{
bis.close();
bis = null;
}
if(wr != null)
{
wr.close();
wr = null;
}
}
catch(IOException ioee)
{
throw ioee;
}
}
}
対象地物(FOI)とは、Webブラウザ内で動作するJavaScriptマップ・クライアントを使用して操作できるビジネス・エンティティまたは地理的地物のことです。FOIデータは、動的に表示され、マップ・タイル層の一部ではありません。FOIにはポイント、線文字列、ポリゴンなどの任意の空間ジオメトリ・タイプを使用できます。FOIの検索、参照、検査および操作機能は、位置ベースのサービスにとって必要不可欠です。
FOIサーバーは、MapViewer内で動作するJavaサーブレットです。これは、データベースに対する問合せ、FOI画像のレンダリング、およびクライアントに対するFOI画像とFOI属性データの送信を実行することにより、JavaScriptマップ・クライアントから受け取るFOIリクエストに応答します。JavaScriptマップ・クライアントは、FOI画像をエンド・ユーザーに表示し、画像を操作する機能を提供します。
FOIサーバーは、テーマベースおよびユーザー定義という2つのタイプのFOIリクエストを受け付けます。いずれのタイプのFOIリクエストも、リクエストのタイプに適したデータ層を返します。
テーマベースFOI層は、類似した特性を備えデータベースに格納される空間地物の集合です。クライアントは、テーマベースFOI層リクエストをFOIサーバーに送信することにより、テーマベースFOI層をフェッチします。このリクエストの結果として、特定の問合せ基準を満たす一連のFOIデータ・エントリが得られます。各FOIデータ・エントリは、該当するFOI画像と、JavaScriptマップ・クライアントがクライアント側の双方向性を実装する際に使用できる一連のFOI属性から構成されます。
テーマベースFOI層は、事前定義済のMapViewerテーマ(8.3.1.1項を参照)または動的JDBC問合せテーマ(8.3.1.3項を参照)に基づいており、FOIデータのレンダリングに必要なすべての情報を定義します。この情報には、ジオメトリ地物の格納先の表、データベース問合せ時に使用される基準、FOIデータの一部である属性およびFOI画像のレンダリング時に使用されるスタイルが含まれます。事前定義済テーマの定義および構成は、Map Builderツール(第9章を参照)を使用して行えます。
クライアントは、事前定義済テーマベースFOIリクエストを使用してFOIデータをリクエストする場合、事前定義済テーマの名前、地物画像のスケール、およびジオメトリ地物に対する問合せの際に使用する問合せウィンドウを指定する必要があります。テーマの名前はアプリケーションが定義する必要がありますが、地物画像のスケールおよび問合せウィンドウはJavaScriptマップ・クライアントによって自動的に計算されます。
たとえば、次のような定義を持つCUSTOMERSという名前の表上では、CUSTOMERSという事前定義済テーマを定義できます。
SQL> DESCRIBE CUSTOMERS Name Null? Type --------------------------------- ------ ---------------------------- NAME VARCHAR2(64 CHAR) CITY VARCHAR2(64 CHAR) COUNTY VARCHAR2(64 CHAR) STATE VARCHAR2(64 CHAR) LOCATION SDO_GEOMETRY SALES NUMBER
LOCATION列は、顧客マーカーのレンダリングに使用される空間列です。
CUSTOMERSテーマのXMLスタイリング・ルールを、例8-7に示します。
例8-7 FOI層用事前定義済テーマのXMLスタイリング・ルール
<?xml version="1.0" standalone="yes"?>
<styling_rules>
<hidden_info>
<field column="CITY" name="City"/>
<field column="SALES" name="Sales"/>
</hidden_info>
<rule>
<features style="M.CIRCLE"> </features>
<label column="NAME" style="T.TEXT"> 1 </label>
</rule>
</styling_rules>
例8-7のスタイリング・ルールでは、次の事柄を指定しています。それらの指定がマップ表示に与えている影響を見るには、第8.1.2項の「図8-2 Oracle Maps (V1 API)を使用して作成したアプリケーション」を参照してください。
マーカー・スタイルM.CIRCLEは、顧客のレンダリングに使用。
NAME列は、ラベル付け用属性として使用(label column="NAME")。NAME列の値(顧客の名前)は、ユーザーがマウスを顧客マーカーの上に移動したときにJavaScriptマップ・クライアントが表示する情報ウィンドウに含まれる。
情報ウィンドウには、該当する顧客の<hidden_info>要素(この例ではCITYおよびSALES)で指定されている列の値も含まれる。各<field>要素では、2つの属性を指定する。つまり、columnではデータベース列を指定し、nameでは情報ウィンドウで使用されるテキスト文字列を指定する。
MapViewerの事前定義済テーマには、標準の事前定義済テーマとテンプレート付き事前定義済テーマがあります。いずれのタイプの事前定義済テーマも、USER_SDO_THEMESビューを使用して定義します。ただし、標準の事前定義済テーマの問合せ条件は固定ですが、テンプレート付き事前定義済テーマの問合せ条件には動的なバインディング変数を含められ、それらの値はテーマ・リクエストの発行時に変更可能です。
バインディング変数を2つ(該当するテキストは<features>要素内の太字部)使用するテンプレート付き事前定義済テーマのXMLスタイリング・ルールを、例8-8に示します。
例8-8 テンプレート付き事前定義済テーマのXMLスタイリング・ルール
<?xml version="1.0" standalone="yes"?>
<styling_rules>
<hidden_info>
<field column="NAME" name="Name"/>
<field column="CITY" name="City"/>
<field column="SALES" name="Sales"/>
</hidden_info>
<rule>
<features style="M.CIRCLE">(city=:1 and sales>:2)</features>
<label column="NAME" style="T.TEXT"> 1 </label>
</rule>
</styling_rules>
例8-8では、必要条件を満たす地物が存在する都市の名前をバインディング変数:1、必要条件を満たす地物の最低売上高をバインディング変数:2で指定しています。(つまり、指定した都市で特定の最低値を超える売上高を持つ顧客のみに、店舗マーカーが表示されます。)これら2つのバインディング変数の値は、テーマの定義時には確定されず、クライアントがサーバーに送信するリクエストの中で与えられます。
クライアントは、動的JDBCテーマベースFOIリクエストを使用してFOIデータをリクエストする際、JDBCテーマの完全な定義を指定する必要があります。テーマの定義では、すべてのジオメトリ属性および非ジオメトリ属性を含め、レンダリング・スタイルと、FOIデータの問合せに使用されるSQL問合せを指定する必要があります。
例8-9は、各顧客位置の周りにバッファを表示するFOI層を作成するためのJavaScriptクライアント・コードを示しています。
例8-9 動的JDBC問合せのテーマ
var theme = '<themes><theme name="JDBC_THEME" >' +
'<jdbc_query asis="true" spatial_column="location"
jdbc_srid="8307" render_style="C.RED"
datasource="mvdemo">' +
'select sdo_geom.sdo_buffer(A.location,1,0.005,'+
'\'unit=mile arc_tolerance=0.005\') location '+
' from customers A' +
'</jdbc_query></theme></themes>' ;
buffertheme = new MVThemeBasedFOI('buffertheme',theme);
ユーザー定義FOIとは、クライアント側で定義される地物のことです。地物の集合としてレンダリングされるテーマベースFOI層とは異なり、ユーザー定義FOIの場合はリクエストとレンダリングが個々に実行されます。
ジオメトリの表現やレンダリング・スタイルも含め、ユーザー定義FOIの属性はすべて、アプリケーションで提供する必要があります。JavaScriptマップ・クライアントでは、ジオメトリ表現およびレンダリング・スタイルに関する情報を指定したリクエストを、FOIサーバーに送信します。FOIサーバーは、FOI画像をレンダリングし、クライアントに返します。レンダリング・スタイルは、USER_SDO_STYLESビュー内で事前定義済である必要があります。
Oracle Maps JavaScriptクライアントは、ブラウザベースのマップ視覚化エンジンであり、マップ・タイル・サーバーおよびFOIサーバーの上位で動作します。次の機能が実装されています。
マップ・タイル・サーバーからマップ・タイルをフェッチし、マップ・タイル層としてWebブラウザに表示する機能。
FOIリクエストをFOIサーバーに送信し、ユーザー定義の地物およびOracle Spatial and Graph問合せベースの地物をマップ・タイル層の上にオーバーレイ表示する機能。
マップ・ナビゲーション用のドラッグ、FOIのクリック、矩形の描画、レッドライニングなどのユーザー操作を制御する機能。
矩形の描画とは、アプリケーション・ユーザーが矩形の1つの隅をクリックした後、マウス・ボタンを押したままマウスを対角の隅までドラッグし、マウス・ボタンを離して矩形を作成することです。
レッドライニングとは、アプリケーション・ユーザーがマウス・ボタンをクリックした後、マウスを移動しクリックを複数回実行する(各クリックにより、まっすぐな線分を使用してレッドラインを伸ばす)ことにより、ポリゴンまたはポリラインを作成することです。(多くの場合レッドラインの描画は赤色でレンダリングされますが、任意の色を使用する線スタイルも指定できます。)
これらの機能にアクセスするには、JavaScript API (いくつかのJavaScriptクラスから構成される)を使用します。JavaScript APIには、次に示す2つのバージョンがあります。
従来のAPIとして現在もサポートされているバージョン1 (V1)。第8.4.1項「JavaScript API V1」を参照してください。
リリース11.1.1.7で導入された新しいAPIであるバージョン2 (V2)。第8.4.2項「JavaScript API V2」を参照してください。
Oracle Maps JavaScript API (V1およびV2)内の全クラスの詳細は、Javadocスタイルのリファレンス・ドキュメント(mvdemo.earファイルに同梱されており、次の場所で利用可能)を参照してください。
http://host:port/mvdemo/api/oracle_maps_api.jsp (V1)
http://host:port/mvdemo/api/oracle_maps_html5_api.jsp (V2)
V1 APIおよびV2 APIのチュートリアルとデモは、ルート・コンテキスト・パス/mvdemoで、スタンドアロンのパッケージ・アプリケーションとして提供されます。このチュートリアルでは、まず基本事項(マップ・タイル層の表示、ナビゲーション・パネルの追加、インタラクティブな地物と情報ウィンドウの表示)について説明した後、より複雑なトピック(イベント・リスナーの登録、プログラムによるスタイルの作成と使用、空間フィルタ処理など)に移ります。
すべてのチュートリアルは、MVDEMOサンプル・データセット(Oracle Technology NetworkのMapViewerページから入手可能)に基づいており、mvdemoという名前のデータソースを前提としています。チュートリアル・ページには、3つのパネルがあります。左にはサンプル・コード(デモ)のタイトルがリストされます。いずれかをクリックすると、マップ(そのサンプル・コードの実行結果)が右上のパネルに表示されます。下のパネルには「JavaScript」および「HTML」というタブがあり、それぞれのタブに、選択したデモのJavaScriptおよびHTMLコードが表示されます。
Oracle Maps JavaScriptクライアントの機能にアクセスするには、次のものを含むいくつかのJavaScriptクラスから構成される、JavaScript APIバージョン1 (V1)を使用します。
MVMapViewクラスは、該当APIのメインのエントリ・ポイントです。ほとんどのマップ制御インタフェースが実装されています。
MVMapTileLayerクラス(以前の名称はMVBaseMapクラス)は、マップ・タイル・サーバーによってレンダリングされたマップ・タイルを表示するマップ・タイル層を定義します。
MVThemeBasedFOIクラスでは、テーマベースFOI層の定義および制御を実行します。
FOIクラスでは、ユーザー定義FOIの定義と制御を実行します。
MVSdoGeometryクラスでは、ジオメトリ・オブジェクトを定義します。ジオメトリには、Oracle Spatial and Graphでサポートされている任意のジオメトリ・タイプを使用できます。
MVRedLineToolクラスでは、レッドライン・ユーティリティの定義および制御を実行します。
MVRectangleToolクラスでは、矩形ツールの定義および制御を実行します。
MVOverviewMapクラスでは、メイン・マップが小さな矩形としてミニチュア表示される概要マップ(自体は矩形ツール内にあるマップ)の定義および制御を実行します。
MVMapDecorationクラスでは、マップ装飾の定義および制御を実行します。
MVMapViewは、Webブラウザ内の全マップ操作におけるメインのエントリ・クラスです。ユーザーのWebマッピング・アプリケーションにロジックを追加するための必須のインタフェースはすべて、MVMapViewなどのクラスによって提供されます。そのような論理的インタフェースには、次のようなものがあります。
マップ・クライアント・インスタンスを作成し、それをWebページ内で作成したマップ・コンテナDIVオブジェクトと関連付ける。
マップの中心やズーム・レベルなどのマップ・パラメータを構成するもの。
マップ・タイル層を作成し、操作するもの。
テーマベースFOI層を作成し、操作するもの。
ユーザー定義の各FOIを作成し、操作するもの。
マップ上に情報ウィンドウを表示するもの。
マップ・タイトル、カスタムな著作権表示、コントロール・ボタンなどの固定のマップ装飾を作成するもの。
ナビゲーション・バー、スケール・バー、矩形ツール、レッドライン・ツール、概要マップなどの組込みユーティリティにアクセスするもの。
イベント・リスナーを使用してイベント処理をカスタマイズするもの。適切なAPIメソッドを使用すると、イベント・リスナーをMVMapViewクラス、MVThemeBasedFOIクラスおよびMVFOIクラスに追加できます。
Oracle Maps JavaScript APIバージョン2 (V2)は、最新のブラウザの機能を利用します。次のような機能があります。
maps.oracle.com、Nokia Maps、Bing Maps、OpenStreet Mapsなどのマッピング・サービス・プロバイダをはじめとする、様々なサード・パーティのマップ・タイル・サービスに対する組込みのサポート
レンダリング・スタイルおよび効果(グラデーション、アニメーション、ドロップ・シャドウなど)のオンザフライ適用による、クライアント側での地理空間データの優れたレンダリング
多くのポイントの自動クラスタリングとクライアント側でのヒート・マップの生成
属性値と空間述語(問合せウィンドウ)に基づく、クライアント側での地物のフィルタ処理
優れた一連の組込みコントロールおよびツール(カスタマイズ可能なナビゲーション・バーと情報ウィンドウ、構成可能な層コントロール、レッドライン・ツール、距離測定ツールなど)
V2 APIには、既存のOracle Maps JavaScript V1 APIアプリケーションとの後方互換性はありません。V2固有の地物を既存のV1アプリケーション(つまり、MVThemeBasedFOIなどのクラスを使用する、V1 APIで記述されたアプリケーション)で使用する場合は、まずそれらのアプリケーションを移行する必要があります。
ただし、既存のサーバー側の事前定義済スタイルおよびテーマは、V2 APIと連携して動作しません。たとえば、次のコード・スニペットでは、関連する事前定義済スタイルを持つ事前定義済テーマmvdemo.customersに基づいて、インタラクティブなベクター層を作成します。
var baseURL = "http://"+document.location.host+"/mapviewer";
var layer = new OM.layer.VectorLayer("layer1",
{
def:{
type:OM.layer.VectorLayer.TYPE_PREDEFINED,
dataSource:"mvdemo",
theme:"customers",
url: baseURL
}
});
V2 APIには、次の最上位クラスおよびサブパッケージがあり、これらはすべてネームスペースOMに含まれています。
Mapクラスは、このAPIのメイン・クラスです。
Featureクラスは、個々の地理的地物(V1ではFOIとして知られている)を表します。
MapContextクラスは、現在のマップの中心点やズーム・レベルなど、いくつかの重要なコンテキスト情報をカプセル化した最上位クラスです。通常はイベント・リスナーに渡されます。
controlパッケージには、ナビゲーション・バーや概要マップなど、すべてのマップ・コントロールが含まれています。
eventパッケージには、すべてのマップおよび層イベント・クラスが含まれています。
filterパッケージには、表示したベクター層の地物を選択またはサブセット化するためのすべてのクライアント側フィルタ(空間またはリレーショナル)が含まれています。
geometryパッケージには、様々なジオメトリ・クラスが含まれています。
layerパッケージには、様々なタイルおよびベクター層クラスが含まれています。タイル層クラスには、Oracle、Nokia、Bing、OpenStreetMapなど、いくつかのオンライン・マップ・サービスへのアクセスが含まれています。ベクター層は、インタラクティブな地物層であり、V1のMVThemeBasedFOIおよびMVFOIクラスに対応しています。
infowindowパッケージには、カスタマイズ可能な情報ウィンドウと、それらのスタイルが含まれています。
styleパッケージには、クライアント側のベクター・データに適用できるスタイルが含まれています。また、アニメーション、グラデーション、ドロップ・シャドウなどのビジュアル効果も含まれています。
toolパッケージには、距離測定ツール、レッドライン・ツール、ジオメトリ描画ツールなど、様々なマップ・ツールが含まれています。
universeパッケージには、組込み(事前定義済)マップ汎用が含まれています。マップ汎用は、マップ・コンテンツの枠ボックスと一連のズーム・レベル定義を定義します。これは、V1 APIのタイル層の構成と似ています。
utilパッケージには、様々なユーティリティ・クラスが含まれています。
visualfilterパッケージでは、グラデーションやドロップ・シャドウなど、様々なビジュアル効果を実現するためのインタフェースが提供されます。
OM.Mapは、Webブラウザ内の全マップ操作におけるメインのエントリ・クラスです。このクラスや他のクラスにより、アプリケーション固有のロジック、操作および双方向性をWebマッピング・アプリケーションに追加するためのインタフェースが提供されます。次のようなアプリケーション・ロジックおよび操作があります。
マップ・クライアント・インスタンスを作成し、それをWebページ内で作成したマップ・コンテナDIVオブジェクトと関連付ける。
マップの中心やズーム・レベルなどのマップ・パラメータを構成するもの。
マップ・タイル層を作成し、操作する(オプション)。V1の場合と異なり、V2ではマップ・タイル層は必須ではありません。アプリケーションに含めることができるのは、ズーム・レベルとスケールをプログラムによって定義するカスタム汎用を使用する、インタラクティブなベクター層のみです。
ベクター層(V1ではFOIとして知られている)を作成し、操作する。
マップ上に情報ウィンドウを表示するもの。
マップ・タイトル、著作権表示、マップ・コントロールなどの固定のマップ装飾を作成する。
ナビゲーション・パネル、矩形ツール、円形ツール、スケール・バー、概要マップ・パネルなどの組込みユーティリティにアクセスする。
イベント・リスナーを使用してイベント処理を(したがって、マップの相互作用も)カスタマイズする。
V2 APIを使用したアプリケーションの開発の詳細は、第8.5.2項「V2 APIの使用」とOracle提供のチュートリアルおよびデモを参照してください。
V1 APIとV2 APIの主な類似点は次のとおりです。
同じアーキテクチャとコンテンツ編成を使用します。(図8-1「Oracle Mapsアプリケーションのアーキテクチャ」および図8-4「マップ内の一連の層」の説明は、両方のバージョンに当てはまります。)
Oracle Spatial and GraphまたはLocatorを使用して、空間分析(近接性、包含、最も近い隣接物および距離に関する問合せ)および座標系のサポート(SRIDと変換)を行います。
ただし、大きな相違点がいくつかあります。
V2を使用した、クライアント側でのインタラクティブな地物のレンダリング(つまり、HTML5 CanvasまたはSVGを使用)により、クライアントの双方向性とユーザーの操作性が向上します。
V1の「FOIサーバー」に対応するV2のデータ・サーバーは、地物のベクター・ジオメトリと属性をクライアントにストリーミングして、ローカルでレンダリングを実行できるようにします。このため、V1の「FOI層」はV2ではベクター層と呼ばれます。
V2では、インタラクティブなベクター層を表示するために、バックグラウンド・マップ・タイル層は必要ありません。このため、たとえばV2では、アプリケーションがバックグラウンド・タイル層を使用することなく、州のテーマ・マップを(人口の五分位値別に色分けするなどして)表示することが可能です。
V2 APIはJQueryおよびJQueryUIに依存し、これらをインクルードします。このため、oraclemapsv2.jsはjquery-1.7.2.min.jsおよびjquery-ui-1.8.16.min.jsをインクルードします。アプリケーションでもJQueryとJQueryUIを使用し、これらをすでにインクルードしている場合は、Oracle Maps V2ライブラリをロードするかわりに、ファイルoraclemapsv2_core.jsを<script>タグ内で使用します。つまり、次を使用します。
<script src=”/mapviewer/jslib/v2/oraclemapsv2_core.js”></script>
次は使用しません。
<script src=”/mapviewer/jslib/v2/oraclemapsv2.js”></script>
表8-2に、V1とV1のクラス間の一般的な対応関係を示します。この関係は常に一対一ではありません。
表8-2 V1とV2のAPIクラス間の対応関係
| V1 APIクラス | V2 APIクラス |
|---|---|
|
|
|
|
|
|
|
|
カスタム・タイル層は、現在のリリースのV2では直接サポートされていません。ただし、 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
スタイル( |
|
|
ツール( |
|
|
装飾とコントロール( |
|
すべてのマップ・データがOracleデータベースに格納されており、Oracle Fusion MiddlewareにMapViewerがデプロイされている場合は、使用しているAPIバージョンに関連する項の手順に従ってOracle Mapsを使用すれば、Webベースのマッピング・アプリケーションを開発できます。
バージョン1 (V1) APIを使用してOracle Mapsアプリケーションを開発するには、次の項の手順に従います。
MapViewerがサービスを提供するクライアント側に表示される各マップ・タイル層について、対応するマップ・タイル層をMapViewerサーバー側に作成する必要があります。たとえば、8.1.2項で説明したサンプル・アプリケーションの場合、クライアント側にマップ・タイル層として海、郡の境界線、都市および高速道路を表示するには、サーバー側にマップ・タイル層を作成する必要があります。ただし、タイル層がカスタムまたは組込み外部タイル層の場合、サーバー側にタイル層を定義する必要はありません。
マップ・タイル層を作成する場合は、マップ・タイル画像のレンダリング元となるマップ・ソースが使用可能な状態にあることを事前に確認する必要があります。データベースに格納されているマップ・データに基づいてマップ・タイル画像をレンダリングする場合は、事前定義済の一連のテーマから構成されるMapViewerベース・マップを作成する必要があります。(ベース・マップの作成は、第9章で説明するMap Builderツールを使用して行えます。)外部マップ・プロバイダを使用してマップ・タイル画像をレンダリングする場合は、マップ・タイル・サーバーによって指定されているタイル画像の定義を使用して外部サーバーからマップ画像をフェッチできるマップ・ソース・アダプタを作成する必要があります。
マップ・ソースが使用可能な状態にある場合は、1.5.3項で説明したように、MapViewer管理ページを使用して、マップ・タイル層を作成できます。マップ・タイル層を作成する場合は、適切な座標系の定義、マップ・ソースの定義(内部または外部)およびズーム・レベルの定義(ズーム・レベルの数とマップ・スケール)を指定する必要があります。
マップ・タイル層は、作成し終わったら、MapViewerに同梱されているJavaServer Page (JSP)デモ・アプリケーションを使用してテストできます。JSPデモ・アプリケーションには、http://host:port/mapviewer/fsmc/omaps.jspでアクセスできます。このアプリケーションでは、ユーザーの入力に基づいて、MapViewerインスタンスで定義されている任意のマップ・タイル層によって表示されるマップを表示できます。
データベース問合せの結果に基づきアプリケーションで動的地物をテーマベースFOI層として表示する必要がある場合は、テーマベースFOI層ごとに、事前定義済のMapViewerテーマを作成する必要があります。個々の動的地物をアプリケーションでユーザー定義FOIとして表示する必要がある場合は、FOIサーバーによって使用されるレンダリング・スタイル(複数可)を定義してFOI画像をレンダリングする必要があります。事前定義済のテーマおよびレンダリング・スタイルを作成するには、Map Builderツール(第9章を参照)を使用します。
Webブラウザ内で動作するOracle Mapsクライアント・アプリケーションは、プラグインを必要としない純粋なHTMLページおよびJavaScriptページです。そのため、そのようなアプリケーションは、純粋なHTMとしてコンテンツを配信する任意のWebテクノロジを使用して作成できます。そのようなテクノロジには、JavaServer Pages、Javaサーブレット、ASP、.NET C#などがあります。この項では純粋なHTML形式を使用したクライアント・アプリケーションの開発についてのみ説明しますが、それは他のWebテクノロジにも簡単に適用できます。
8.1.2項の例8-1で示したように、Oracle Mapsアプリケーションのソース・コードは通常HTMLページにパッケージされ、次の部分から構成されます。
<script>要素: Oracle Mapsクライアント・ライブラリをブラウザのJavaScriptエンジンにロードします。例8-1の場合、この要素は次のとおりです。
<script language="Javascript" src="jslib/oraclemaps.js"></script>
HTML DIV要素 - Webページ内でマップ・コンテナとして使用されます。DIV要素のサイズと位置は、ユーザーのニーズに合わせてカスタマイズできます。例8-1の場合、この要素は次のとおりです。
<div id="map" style="left:10; top:60;width: 600px; height: 500px"></div>
JavaScriptコード: マップ・クライアント・インスタンスの作成および初期化を実行します。マップ・クライアント・インスタンスの作成、初期マップ・コンテンツ(マップ・タイル層、FOI層など)の設定、初期マップの中心とズーム・レベルの設定、アプリケーションに固有なロジックの実装、マップの表示、およびその他のアプリケーションに固有なロジックの実装が実行されます。
このコードは、JavaScript関数(サーバーからクライアントWebブラウザにHTMLページがロードされたときに実行される)の中にパッケージします。例8-1の場合、この関数はon_load_mapviewという名前です。
function on_load_mapview()
{
var baseURL = "http://"+document.location.host+"/mapviewer";
// Create an MVMapView instance to display the map
var mapview = new MVMapView(document.getElementById("map"), baseURL);
// Add a map tile layer as background.
mapview.addMapTileLayer(new MVMapTileLayer("mvdemo.demo_map"));
// Add a theme-based FOI layer to display customers on the map
var themebasedfoi = new MVThemeBasedFOI('themebasedfoi1','mvdemo.customers');
themebasedfoi.setBringToTopOnMouseOver(true);
mapview.addThemeBasedFOI(themebasedfoi);
// Set the initial map center and zoom level
mapview.setCenter(MVSdoGeometry.createPoint(-122.45,37.7706,8307));
mapview.setZoomLevel(4);
// Add a navigation panel on the right side of the map
mapview.addNavigationPanel('east');
// Add a scale bar
mapview.addScaleBar();
// Display the map.
mapview.display();
}
この関数は、<body>要素のonload属性で指定するため、Webページがロードされた後に実行されます。例8-1の場合、このコードは次のとおりです。
<body onload= JavaScript:on_load_mapview() >
その他のHTML要素およびJavaScriptコード: アプリケーションに固有なその他のユーザー・インタフェースおよび制御ロジックを実装します。8.1.2項の例8-1の場合、JavaScript関数setLayerVisibleは、ユーザーが「Show customers」チェック・ボックスを選択または選択解除したときにテーマベースFOI層を表示または非表示にするために実装されています。setLayerVisible関数のコードは、次のとおりです。
function setLayerVisible(checkBox)
{
// Show the theme-based FOI layer if the check box is checked
// and hide the theme-based FOI layer otherwise.
if(checkBox.checked)
themebasedfoi.setVisible(true) ;
else
themebasedfoi.setVisible(false);
}
この関数は、チェック・ボックスを定義する<INPUT>要素のonclick属性で指定されているので、該当するチェック・ボックスをユーザーがクリックするたびに実行されます。例8-1の場合、このコードは次のとおりです。
<INPUT TYPE="checkbox" onclick="setLayerVisible(this)" checked/>Show customers
V2 APIを使用したアプリケーションの開発は、V1 APIのプロセスと似ています。ベース・マップ、マップ・タイル層およびインタラクティブな層またはテーマに使用するすべての空間データがOracleデータベースに格納されている場合、Map Builderツールを使用したマップ作成プロセスは、どちらのAPIでも同じです。
基礎となるベース・マップおよび層をOracleデータベース内で管理する場合、クライアント・アプリケーションに表示される各マップ・タイル層は、対応するデータベース・メタデータ・エントリをUSER_SDO_CACHED_MAPSメタデータ・ビュー内に保持している必要があります(第8.2.2.2項を参照)。同様に、インタラクティブな層がデータベース・コンテンツに基づいている場合、その層はメタデータ・エントリをUSER_SDO_THEMESビュー内に保持している必要があります(第2.9項、特に第2.9.2項を参照)。このようなタイル層とインタラクティブな層、およびそれらのスタイルとスタイリング・ルールは、Map Builderツールを使用して定義できます(第9章を参照)。
バージョン2 (V2) APIを使用してOracle Mapsアプリケーションを開発するには、次の基本的な手順に従います。
oraclemapsv2.jsライブラリをインポートします。
このAPIは、MapViewer EARアーカイブの一部としてパッケージされた単一のJavaScriptライブラリに含まれています。
MapViewerをデプロイおよび起動した後、次のように<script>タグを通じてライブラリをロードします。
<script type="text/javascript" url="http://localhost:8080/mapviewer/jslib/v2/oraclemapsv2.js"/>
HTMLページ内で、インタラクティブなマップを格納する<DIV>タグを作成します。(これはV1 APIの場合と同じです。)
すべてのマップ表示関数を処理するクライアント側マップ・インスタンスを作成します。
クラスの名前はOM.Mapであり、これがV2 APIのメインのエントリ・ポイントです。このため、V2のOM.Mapは、V1のMVMApViewと同等です。
マップ汎用を設定します(次のオプション手順を実行した場合は除く)。
基本的に、マップ汎用はマップ全体のエクステント、ズーム・レベルの数、およびオプションで各ズーム・レベルの解像度(ピクセル当たりのマップ単位)を定義します。V1 APIでは、この情報はタイル層の定義に含まれています。これらはV2でも引き続き機能しますが、V2ではインタラクティブなベクター層やテーマを表示するために、事前定義済タイル層は必要ありません。たとえば、地域別の売上を示すインタラクティブなテーマ・マップには、バックグラウンド・マップやタイル層は必要ありません。
(オプション)バックグラウンド・マップとして機能するタイル層を追加します。
タイル層には、データベースのmvdemo.demo_mapや、サポートされているNokia Mapsなどのサービスを使用できます。タイル層を追加した場合、マップ汎用も暗黙的に定義されるため、前述の手順(マップ汎用の設定)を実行する必要はありません。
1つまたは複数のインタラクティブなベクター層を追加します。
OM.layer.VectorLayerは、V1 APIのMVThemeBasedFOIと同等です。主な相違点は、OM.VectorLayerがHTML5 (CanvasまたはSVG)テクノロジを使用して、すべてのデータをブラウザ内にレンダリングすることです。このため、別途指定されていないかぎり、ベクター層のすべてのコンテンツを一度ロードした後に、マップのズームまたはパン操作でデータベースへの問合せやデータのフェッチが発生することはありません。
1つまたは複数のマップ・コントロール、ツールおよびその他のアプリケーション固有のUIコントロールを追加して、表示する層、スタイリングおよびビジュアル効果をユーザーが設定できるようにします。
詳細な手順と関連情報は、Oracle提供のチュートリアルとデモを参照してください。
Oracle Maps V2アプリケーションはWebブラウザ内で動作し、その要件はHTML5 (Canvas)のサポートとJavaScriptの有効化のみです。追加のプラグインは必要ありません。
第8.1.2項の例8-1「単純なアプリケーションのソース・コード(V1 API)」で示したように、Oracle Mapsアプリケーションのソースは通常HTMLページにパッケージされますが、それは次の部分から構成されます。
<script>要素 - Oracle Maps V2クライアント・ライブラリをブラウザのJavaScriptエンジンにロードします。例:
<script src=”/mapviewer/jslib/v2/oraclemapsv2.js”></script>
HTML <div>要素 - マップを格納します。例:
<div id="map" style="width: 600px; height: 500px"></div>
JavaScriptコード - マップ・クライアント・インスタンスを作成し、初期マップ・コンテンツ(タイルおよびベクター層)、初期マップの中心とズームおよびマップ・コントロールを設定します。このコードは、HTMLページがロードされたとき、または準備完了になったときに実行される関数の中にパッケージします。この関数は、HTMLページの<body>要素のonload属性で指定します。例:
function on_load_mapview()
{
var baseURL = "http://"+document.location.host+"/mapviewer";
// Create an OM.Map instance to display the map
var mapview = new OM.Map(document.getElementById("map"),
{
mapviewerURL:baseURL
});
// Add a map tile layer as background.
var tileLayer = new OM.layer.TileLayer(
"baseMap",
{
dataSource:"mvdemo",
tileLayer:"demo_map",
tileServerURL:baseURL+"/mcserver"
});
mapview.addLayer(tileLayer);
// Set the initial map center and zoom level
var mapCenterLon = -122.45;
var mapCenterLat = 37.7706;
var mapZoom = 4;
var mpoint = new OM.geometry.Point(mapCenterLon,mapCenterLat,8307);
mapview.setMapCenter(mpoint);
mapview.setMapZoomLevel(mapZoom);
// Add a theme-based FOI layer to display customers on the map
customersLayer = new OM.layer.VectorLayer("customers",
{
def:
{
type:OM.layer.VectorLayer.TYPE_PREDEFINED,
dataSource:"mvdemo", theme:"customers",
url: baseURL,
loadOnDemand: false
}
});
mapview.addLayer(customersLayer);
// Add a navigation panel on the right side of the map
var navigationPanelBar = new OM.control.NavigationPanelBar();
navigationPanelBar.setStyle(
{backgroundColor:"#FFFFFF",buttonColor:"#008000",size:12});
mapview.addMapDecoration(navigationPanelBar);
// Add a scale bar
var mapScaleBar = new OM.control.ScaleBar();
mapview.addMapDecoration(mapScaleBar);
// Display the map.
// Note: Change from V1. In V2 initialization and display is done just once
mapview.init();
}
その他のHTML要素およびJavaScriptコード - アプリケーション固有のその他のユーザー・インタフェースおよび制御ロジックを実装します。たとえば、HTML <input>要素をJavaScript関数setLayerVisibleとともに使用して、層の表示コントロールを実装します。setLayerVisible関数のコードは、次のとおりです。
function setLayerVisible(checkBox)
{
// Show the customers vector layer if the check box is checked and
// hide it otherwise.
if(checkBox.checked)
customersLayer.setVisible(true) ;
else
customersLayer.setVisible(false);
}
この関数は、チェック・ボックスを定義する<input>要素のonclick属性で指定します。次の例では、ユーザーが「Show Customers」チェック・ボックスをクリックしたときに関数を実行します。
<INPUT TYPE="checkbox" onclick="setLayerVisible(this)" checked/>Show Customers
アプリケーションでは、Google MapsタイルまたはMicrosoft Bing Mapsタイルを組込みのマップ・タイル層として表示できます。これを行うには、MVGoogleTileLayerまたはMVBingTileLayerのインスタンスをそれぞれ作成し、マップ・ウィンドウに追加します。Oracle Mapsクライアントは、内部的に公式のGoogle MapsまたはBing Maps APIを使用して、Google MapsまたはMicrosoft Bing Mapsサーバーによって直接提供されるマップを表示します。
Google Mapsタイルを使用するには、タイルの使用方法がGoogleによって規定されているサービス条件に適合する必要があります(https://developers.google.com/readme/termsを参照)。
Bing Mapsタイルを使用するには、Bing Mapsアカウントを取得する必要があります。使用方法は、Microsoftが規定するライセンス要件に適合する必要があります(http://www.microsoft.com/maps/を参照)。
Google MapsまたはMicrosoft Bing Mapsタイル層の上部にユーザー独自の空間データをオーバーレイする必要がある場合は、8.7項「Spherical Mercator座標系へのデータ変換」を参照してください。
次の項では、組込みマップ・タイル層を使用する2つのオプションについて説明します。
組込みのマップ・タイル層をクライアント側で定義するには、MVGoogleTileLayerまたはMVBingTileLayerオブジェクトを作成し、それをMVMapViewオブジェクトに追加する必要があります。(Oracle Fusion Middlewareリリース11.1.1.6では、MVGoogleTileLayerはデフォルトでGoogle Mapsバージョン3 APIを使用し、MVBingTileLayerはデフォルトでBing Mapsバージョン7 APIを使用します。)
たとえば、Googleタイルを使用するには、マップにGoogleタイル層を追加します。
mapview = new MVMapView(document.getElementById("map"), baseURL);
tileLayer = new MVGoogleTileLayer() ;
mapview.addMapTileLayer(tileLayer);
アプリケーションで、メソッドMVGoogleTileLayer.setMapTypeまたはMVBingTileLayer.setMapTypeを起動して、マップ・タイプをマップ・プロバイダがサポートするタイプのいずれか(道路、衛星、ハイブリッドなど)に設定できます。
使用例と詳細は、JavaScript APIドキュメントのMVGoogleTileLayerとMVBingTileLayer、およびチュートリアル・デモの組込みGoogle Mapsタイル層と組込みBing Mapsタイル層を参照してください。
サーバー側で定義した組込みマップ・タイル層は、クライアント側で標準のMapViewerタイル層として使用できます。サーバー側で組込みマップ・タイル層を定義するには、次の手順に従います。
MapViewer管理ページにログインします(1.5.1項を参照)。
マップ・タイル層の管理タブを選択し、「作成」をクリックします。
マップ・ソースのタイプを選択するように求められたら、Google MapsまたはBing Mapsを選択し、「続行」をクリックします。
タイル層を定義するデータソースを選択します。
マップ・プロバイダから取得したライセンス・キーを設定します。
「送信」をクリックして、タイル層を作成します。
サーバー側で作成した組込みマップ・タイル層は、MapViewerが提供する他のタイル層のように使用できます。外部JavaScriptライブラリをロードするために、<script>タグを追加する必要はありません。
次の例は、サーバー側に定義したBing Mapsタイル層を示しています。
mapview = new MVMapView(document.getElementById("map"), baseURL);
// The Bing tile layer is defined in data source "mvdemo".
tileLayer = new MVMapTileLayer("mvdemo.BING_MAP") ;
mapview.addMapTileLayer(tileLayer);
アプリケーションで、メソッドMVMapTileLayer.setMapTypeを起動して、マップ・タイプをマップ・プロバイダがサポートするタイプのいずれか(道路、衛星、ハイブリッドなど)に設定できます。
Google MapsやMicrosoft Bing Mapsのような一般的なオンライン・マップ・サービスは、地図にSpherical Mercator投射を使用します。Oracle Databaseリリース11.1.0.7より前の製品を使用し、Google MapsやMicrosoft Bing Mapsといったタイル層の上に独自の空間データをオーバーレイする必要がある場合は、タイル層の座標系と独自のデータ座標系間で座標系の変換を正しく処理できるように、データベースを設定する必要があります(2つの座標系が異なる場合)。
|
注意: この項のアクションを実行するには、データベースのリリースが10.2.0.1以降である必要があります。 |
Google MapsはSpherical Mercator座標系(EPSG: 3785)を使用しています。これは、Yahoo! MapsやMicrosoft Bing Mapsなどの商用APIプロバイダの間でも広く使用されています。この座標系(SRID 3785)は、Oracle Spatial and Graphリリース11.1.0.7より前の製品では提供されていませんでした。独自データをこの座標系に変換するためにMapViewerおよびOracle Spatial and Graphを有効にするには、先にこの座標系定義をOracleデータベースに追加する必要があります(まだ定義されていない場合)。
この座標系が定義されているかチェックするには、以下の文を入力します。
SELECT srid FROM mdsys.cs_srs WHERE srid=3785;
この文で行が返された場合、この項のアクションを実行する必要はありません。この文で行が返されない場合は、この項のアクションを実行して、独自の空間データをタイル層の上にオーバーレイできるようにする必要があります。
次の手順を実行します。
DBAロールを持つユーザーなど、権限のあるユーザーとしてデータベースに接続します。
次のようにcsdefinition.sqlスクリプトを実行します。($OC4J_HOMEを、MapViewerがデプロイされているOC4Jインスタンスのルート・ディレクトリと置き換え、コマンドを1行で入力します。)
Linux: $OC4J_HOME/j2ee/home/applications/mapviewer/web/WEB-INF/admin/csdefinition.sql
Windows: $OC4J_HOME\j2ee\home\applications\mapviewer\web\WEB-INF\admin\csdefinition.sql
必要に応じて、指定の座標系からSpherical Mercator座標系に変換する際に、Oracle Spatial and Graphがデータ変換をスキップするように変換ルールを作成します。このような変換ルールを作成する必要があるかどうか判断するには、8.7.1項を参照してください。
パフォーマンスを向上させるために空間データを事前に変換するか、MapViewerによって実行時にデータ変換を行ってください(「オンザフライ」)。データベースのリリースが10.2.0.4より前の場合、事前に変換するしか手段はありません。
すべてのデータをSpherical Mercator座標系に事前に変換するには、すべてのデータにSDO_CS.TRANSFORM_LAYERプロシージャを使用し、変換されたデータをマッピングに使用します。(Oracle Spatial and Graph開発者ガイドのSDO_CS.TRANSFORM_LAYERのリファレンスの項を参照してください。)
MapViewerで実行時にデータを変換する場合、マッピングに使用する前にデータを変換しないでください。
空間データは通常、WGS84やBNGなどの楕円データに基づく座標系で使用されます。この場合、データをSpherical Mercator座標系に変換する際に、Oracle Spatial and Graphはデフォルトでデータ変換を適用します。これによって、ユーザーのデータとGoogle Mapsや他のマップ・サービス・タイルとの間で、わずかな不一致や誤差が発生します。この問題を解決するには、指定の座標系からSpherical Mercator座標系に変換する際に、Oracle Spatial and Graphがデータ変換をスキップするように変換ルールを作成します。
例8-10は、csdefinition.sqlスクリプトに含まれている、こうしたトランスフォーメーション・ルールを作成するSQL文を示します。ただし、使用する空間データの座標系が例8-10に示すルールの対象でない場合は、データの座標系がこれらのルールの対象でなければ、独自のルールを作成できます。(座標系の変換ルールの作成の詳細は、Oracle Spatial and Graph開発者ガイドを参照してください。)
図8-10 csdefinition.sqlスクリプトに定義されたトランスフォーメーション・ルール
-- Create the tfm_plans, that is, the transformation rules. -- Note: This will result in an incorrect conversion since it ignores a datum -- datum between the ellipsoid and the sphere. However, the data will match -- up better on Google Maps. -- For wgs84 (8307) call sdo_cs.create_pref_concatenated_op( 83073785, 'CONCATENATED OPERATION 8307 3785', TFM_PLAN(SDO_TFM_CHAIN(8307, 1000000000, 4055, 19847, 3785)), NULL); -- For 4326, EPSG equivalent of 8307 call sdo_cs.create_pref_concatenated_op( 43263785, 'CONCATENATED_OPERATION_4326_3785', TFM_PLAN(SDO_TFM_CHAIN(4326, 1000000000, 4055, 19847, 3785)), NULL); -- For OS BNG, Oracle SRID 81989 call sdo_cs.create_pref_concatenated_op( 819893785, 'CONCATENATED OPERATION 81989 3785', TFM_PLAN(SDO_TFM_CHAIN(81989, -19916, 2000021, 1000000000, 4055, 19847, 3785)), NULL); -- For 27700, EPSG equivalent of 81989 call sdo_cs.create_pref_concatenated_op( 277003785, 'CONCATENATED_OPERATION_27700_3785', TFM_PLAN(SDO_TFM_CHAIN(27700, -19916, 4277, 1000000000, 4055, 19847, 3785)), NULL); commit;
Oracle Maps JavaScript APIでは、定義またはタイル画像がサーバー側に格納されていない場合でも、外部タイル層の動的な表示がサポートされます。基本的には、クラスMVCustomTileLayerを使用して、ESRI ArcGISタイル・サーバー、OpenStreetマップ・タイル・サーバー、その他のベンダー固有のマップ・タイル・サーバーなど、Web上にある任意の外部マップ・タイル・サーバーから直接提供されるタイル層を参照して表示できます。
これを行うには、新しいMVCustomTileLayerインスタンスの作成時に、次のことを行う必要があります。
マップ・タイル層の構成(特に座標系、境界およびズーム・レベル)を確認する。
Oracle Mapsからのタイル・リクエストを外部タイル・サーバーからのタイルURLに変換できる関数を提供する。
タイル層の構成にはJSONオブジェクトの形式が使用され、通常は次の例のような形式になります。
var mapConfig = {mapTileLayer:"custom_map", format:"PNG",
coordSys:{srid:8307,type:"GEODETIC",distConvFactor:0.0, minX:-180.0,minY:-90.0,maxX:180.0,maxY:90.0},
zoomLevels:
[{zoomLevel:0,name:"level0",tileWidth:15.286028158107968,tileHeight:15.286028158107968,tileImageWidth:256,tileImageHeight:256},
{zoomLevel:1,name:"level1",tileWidth:4.961746909541633,tileHeight:4.961746909541633,tileImageWidth:256,tileImageHeight:256},
{zoomLevel:2,name:"level2",tileWidth:1.6105512127664132,tileHeight:1.6105512127664132,tileImageWidth:256,tileImageHeight:256},
{zoomLevel:3,name:"level3",tileWidth:0.5227742142726501,tileHeight:0.5227742142726501,tileImageWidth:256,tileImageHeight:256},
{zoomLevel:4,name:"level4",tileWidth:0.16968897570090388,tileHeight:0.16968897570090388,tileImageWidth:256,tileImageHeight:256},
{zoomLevel:5,name:"level5",tileWidth:0.05507983954154727,tileHeight:0.05507983954154727,tileImageWidth:256,tileImageHeight:256},
{zoomLevel:6,name:"level6",tileWidth:0.017878538533723076,tileHeight:0.017878538533723076,tileImageWidth:256,tileImageHeight:256},
{zoomLevel:7,name:"level7",tileWidth:0.005803187729944108,tileHeight:0.005803187729944108,tileImageWidth:256,tileImageHeight:256},
{zoomLevel:8,name:"level8",tileWidth:0.0018832386690789012,tileHeight:0.0018832386690789012,tileImageWidth:256,tileImageHeight:26},
{zoomLevel:9,name:"level9",tileWidth:6.114411263243185E-4,tileHeight:6.114411263243185E-4,tileImageWidth:256,tileImageHeight:256} ]
};
Oracle Mapsからのタイル・リクエストを外部タイル・サーバーからのタイルURLに変換できる関数を提供するには、次の例のような関数を指定します。
function getMapTileURL(minx, miny, width, height, level)
{
var x = (minx-mapConfig.coordSys.minX)/mapConfig.zoomLevels[level].tileWidth ;
var y = (miny-mapConfig.coordSys.minY)/mapConfig.zoomLevels[level].tileHeight ;
return "http://localhost:8888/mapviewer/mcserver?request=gettile&format=" + mapConfig.format + "&zoomlevel="+level+"&mapcache=mvdemo.demo_map&mx=" + Math.round(x) + "&my=" + Math.round(y) ;
}
前述の例において、アプリケーションによって実装された関数getMapTileURL()は、マップ・タイル画像を外部タイル・サーバーからフェッチし、そのマップ・タイル画像の左上隅を、Oracle Mapsクライアントによって指定されたマップ位置(minx,miny)に配置する、有効なURLを提供します。各マップ・タイル画像には、指定されたサイズ(width,height)および指定されたズーム・レベル(level)が使用されます。この特定の例で実際に返されるのは、ローカルMapViewerタイル・サーバーからのgettile URLですが、この方法はMapViewer以外のどのタイル・サーバーにも適用できます。
新しいカスタム・タイル層は、組込みのマップ・タイル層であるかのように、クライアントmapViewerに追加されます。