ActiveReports for .NETにはグラフィカルな帳票を表現できるコントロールとして、帳票上に地図を表示するMapコントロールがあります。
Mapコントロールの基本的な使い方については開発者のための実装系Webマガジン「CodeZine」の連載の中で紹介していますので、こちらもご覧ください。
※古いバージョンをもとに書かれた記事になりますが、現行バージョンでも有効な内容です。
また、12.0Jでは地図上の地点をマーカーでプロットする際に使用するデータとして単純なテキストの緯度/経度データが使用できるようになり、より使いやすくなっています。
今回はより使いやすくなったMapコントロールを使用して、地図を使ったインタラクティブなレポートを作る方法を解説したいと思います。
Mapコントロールへ地図を表示する
Mapコントロールで使用する地図データは、大きく分けて以下の2つの方式で取得します。
- Web上の地図サービスのタイルサーバーを使用する
- シェープファイル(.shp)形式の地図データを使用する
シェープファイルは有料のものだけでなく、国土交通省などで無料で配布しているものもありますが、必要な範囲の地図を使うにはデータの加工が必要だったりするのでご注意ください。
今回はGoogle MapなどWeb上の地図サービスのタイルサーバーを使用する方法を紹介したいと思います。
まず、ページレポートかRDLレポートにMapコントロールを配置します。テンプレートは「空のマップ」を選択してください。
配置したMapコントロールを選択した状態でクリックすると、下方に「右クリックして新しいレイヤーを追加します」と出るので、これを右クリックし、「タイルレイヤーの追加」を選択します。
ダイアログが開くので、「全般」ページの「ソース」に「TileServer」と設定します。
「プロバイダ」は、地図データを取得するタイルプロバイダを指定します。利用可能なタイルプロバイダは以下です。
- Bing
- Cloud Made
- Map Quest Tiles Provider
- OpenStreetMap
OpenStreetMapを除くタイルプロバイダを使用するには、アカウントの登録やキーの取得が必要になります。また実際に利用する場合は、各タイルプロバイダーの利用規約に従う必要がありますのでご注意ください。
今回はキーの取得等が不要で気軽に試せるOpenStreetMapを使いたいと思います。
OpenStreetMapでは地図データはクリエイティブコモンズの「CC BY-SA 2.0」ライセンスで提供されています。このため、クレジットの表記と、著作権表示ページへのリンク等が必要になります。
「プロバイダ」に「OpenStreetMap」を選択すると、世界地図がデフォルトで表示されます。
ここから必要な範囲の地図を表示するには、ビューペイン右方にあるコントローラを使い、移動と拡大・縮小を行います。
デフォルトの設定ではあまり拡大できませんが、MapのViewport
プロパティのMaximumZoom
の値を大きくすることで、市街地レベルまで表示できるようズーム値を調整できます。
以下は仙台駅の周辺図を表示した例です。
なお、タイルサーバーから地図を表示するためには、デザイン時だけではなく、実行時でもインターネットの接続環境が必要です。
地図上にデータをプロットする
単純に地図を表示するだけでなく、データと連携させることでより表現力を高められます。
例えばMapコントロールに「ポイントレイヤー」を追加すれば、地図上にデータをプロットして可視化することができます。従来はプロットするデータとして、データベース上にあるデータなどを使用する場合は、「Microsoft SQL Serverの空間データ型」を使う必要がありましたが、12.0Jで単純なテキストの緯度/経度のデータを設定することができるようになりました。
ActiveReportsはJSON形式やXML形式のデータにも対応しているので、Google Maps APIをはじめとしたWeb APIとの連携も容易にできるようになりました。製品サイトでは「AEDオープンデータプラットフォーム」を使用してAEDの位置を地図上に表示するデモを公開していますのでこちらもご覧ください。
ActiveReports for .NET Webアプリケーションサンプル:AED設置場所
今回はWeb APIは使わず、自前で用意したデータから位置情報を取得したいと思います。
架空の会社の支社情報をまとめたデータソースを用意し、データセットとして取り込みます。
支店データに、緯度(latitude)と経度(longitude)の要素が含まれていることに注意してください。(要素名はこの通りでなくてもかまいません)
次にMapにタイルレイヤーと同じ要領で、ポイントレイヤー(Point Layer)を追加します。
ポイントレイヤーの追加時に、「レイヤーデータの設定」ダイアログが表示されます。ここで以下のように設定します。
項目名 | 設定値 |
---|---|
空間データのソース | データセットの空間フィールド |
データセット | 前述の位置情報データを含むデータセット |
フィールド名 | =MapPoint( Fields!(緯度データフィールド名).Value , Fields!(経度データフィールド名).Value ) |
短縮名では以下のように=MapPoint([緯度データフィールド名],[経度データフィールド名])
と表示されます。この「MapPoint関数」を使うことにより、単純なテキストの緯度/経度データを地図上にプロットできるようになります。
追加されたポイントレイヤーを右クリックして「編集」を選び、マーカーの形、サイズ、色などを設定します。マーカーを数値データに関連付けて、大きさを変更するようなことも可能です。
このように位置情報とポイントレイヤーを関連付けると、表示位置を調整しなくてもタイルレイヤーが適切な範囲の地図を表示してくれます。
地図にドリルスルーリンクを設定する
先ほど追加したポイントレイヤーのマーカーにドリルスルーリンクを追加し、詳細情報を表示する子レポートへのリンクを追加することができます。
例えば、地図上の企業の支社の位置にプロットされたマーカーをクリックすると、その支社の詳細な売上データが表示されデータ分析できる、というようなBIツールような使い方もできます。
まず、リンク先の子レポートを用意しましょう。先ほどの支社情報データを表示する単純なレポートをページレポートで作成します。
このレポートと地図を結びつける作業をします。ポイントレイヤーを右クリックし「レイヤーデータ」を選択して設定ダイアログを開きます。
「分析データ領域の空間フィールド」ページを開き、使用するレポートのデータセットを選択します。
「一致させるフィールド」には、子レポートに渡したいフィールドを設定します。たとえばofficeID
を渡したいとしたら、追加を押して、空間フィールドと分析フィールドのどちらにもofficeID
を設定します。
ダイアログを閉じて、もう一回ポイントレイヤーを右クリックし、「編集」を選択し、ダイアログから「ナビゲーション」ページを開きます。
子レポートを開くために、「レポートに移動」にチェックを入れ、「レポートの実行に以下のパラメータを使用」でパラメータを追加し、「名前」には子レポート側で使いたいパラメータ名、「値」には渡したい値を入れます。ここではofficeID
フィールドを入れます。
次は子レポート側に、親レポートから受け取るデータの設定をします。
先ほどの「レポートの実行に以下のパラメータを使用」で使用した名称のパラメータ(ここではReportParameter1
)を追加します。パラメータのプロパティは「非表示」にチェックを入れます。
パラメータを使ってデータソースを制限する方法はいくつかありますが、ここでは「フィルタ」を使います。
作成した子レポートのページ設定ダイアログから「フィルタ」を開き、「officeIDフィールドがパラメータの値と同じだったとき」のフィルタを設定します。
地図上の支社の位置にプロットされたマーカーをクリックすると、その支社の詳細情報が記載されたドリルスルーレポートが表示されます。
おわりに
お客様からの問い合わせ内容などをみても、Mapコントロールは用途が限定されています。しかし、地図が必要なときは欠かせないコントロールで、MapPoint関数によって使い勝手も向上しました。レポートに位置情報を関連付けて表現力を向上してみてはいかがでしょうか。
また、ActiveReportsにはMapコントロール以外にもグラフィカルに帳票を表現するためのコントロールや機能が多数用意されています。製品サイトでActiveReportsで作成できる帳票をデモアプリケーションとして試すことができるので、ぜひ一度ご覧ください!