SQL Server 2014 Express Reporting Services で空間マップを作成する
公開されているShapeデータをSQL Serverにジオメトリーデータとして取り込み、人口などの統計データをマッピングして、Reporting Servicesにより主題図を作成してみる。
作成のポイントはShapeファイルの入手だと思う。2012年くらいに一度作ったきりで、Shapeファイルの入手先URLがなくなっていたり、IE11でダウンロードできなかったり。Shapeファイルの入手に一番手間取ったかな。
私は統計学やGISに関する知識はないので、その辺のところはあしからず。
完成イメージ
お品書き
- SQL Server 2014 Express
データベースエンジン。無償で入手できます。感謝。
インストール方法は Windows 8.1 Pro 64bit に SQL Server 2014 Express をインストール を参照。 - Report Builder 2014
SQL Server のレポートを作るツール。
インストール方法は SQL Server 2014 Report Builder 2014 をインストールする を参照。 - Shapeファイル
地図の図形(市区町村の形とか)や属性(町の名前とか)のデータ。ジオメトリーデータに変換してSQL Serverにインポートする。世界測地系と日本測地系があり、それぞれ平面直角座標系と緯度経度というのがあり、それらが混在するとうまく合成できない。ここでは世界測地系の緯度経度を統一して利用する。
入手方法は後述。 - Shape2SQL
ShapeファイルをSQL Server のジオメトリーデータに変換してインポートするツール。
入手先や使用方法は Shape2SQLを使ってShapeデータをジオメトリーとしてSQL Serverにインポートする を参照。
Shapeファイルを入手する
※世界測地系緯度経度形式で統一する。
渋谷区の街区境界線Shapeファイル
地図で見る統計(統計GIS) 政府統計の総合窓口 GJ01000001
http://www.e-stat.go.jp/SG1/estat/toukeiChiri.do?method=init
上記への行き方は
トップページ > 地図や図表で見る > 地図で見る統計(統計GIS)
↓
2014/10/5現在IE11ではダウンロードできなので、SH-08EのChromでダウンロードした。
「平成22年度国税調査(小地域)2010/10/1」を選び、男女別人口総数及び世帯数をチェックし、「統計表各種ダウンロードへ」をクリックする。
境界データにある「世界測地系緯度経度・Shape形式」をダウンロードする。
A002005212010DDSWC13113.zip がダウンロードされる。それを解凍する。解凍すると下記の4つのファイルがあり、渋谷区の街区境界線Shapeファイルは「h22ka13113.shp」である。このShapeファイルには、属性情報として街区名、人口、世帯数等の数値情報も含まれる。
- h22ka13113.dbf
- h22ka13113.prj
- h22ka13113.shp
- h22ka13113.shx
中学校区境界、小学校区境界、学校、福祉施設、バス停、行政区域のShapeファイル
国土数値情報ダウンロードサービス
http://nlftp.mlit.go.jp/ksj/
JPGIS2.1から下図赤枠をクリックし、それぞれ東京都のShapeファイルをダウンロードする。
ダウンロードしたら解凍する。なお、何のShapeファイルかわからなくなってしまうので、ダウンロードしたzipファイル名の後ろに識別できる値を入れておくといいかも。
ShapeファイルをSQL Server にインポートする
ダウンロードしたShapeファイルをSQL Serverのデータベースにインポートする方法は、ShapeShape2SQLを使ってShapeデータをジオメトリーとしてSQL Serverにインポートする を参照。
インポート時にテーブルが自動生成されるが、テーブル名はShapeファイルと同じに設定されているので、これだと何のデータであるかわからなくなるから、元にしたShapeファイル名とデータ種類が分かるようなテーブル名にするといいと思う。
渋谷区街区境界線
インポートしてできたテーブル「渋谷区街区_h22ka13113」をSELECTしてみる。平成22年度国勢調査の人口動態データなので、人口や世帯数も含まれている。現在無償で入手できる最も粒度が細かい平面のShapeファイルは、この街区だと思う。番地や号までの粒度があるといいのになあと・・・
(注意!空間結果のズレ)
e-STATから入手できる世界測地系のShapeファイルは、平面直角座標系と緯度経度の2つある。国土数値情報から入手できる世界測地系のShapeファイルは、緯度経度だけなので、平面直角座標系をインポートしてしまうと座標が合わず Management Studio での空間結果ではズレが生じる。
e-STATでは日本測地系緯度経度も公開されているが、世界測地系緯度経度とはやはりずれてしまう。
小学校学区域と小学校
(小学校学区域)
国土数値情報のデータは都道府県単位なので、東京都全域の小学校学区域がインポートされた。
WHERE [A27_005] = '13113' で渋谷区の学区域だけに絞りんでみる。
(小学校)
渋谷区立の小学校に絞り込んだが、小学校は点データなので、よくわからない。
そこで、小学校学区域と重ねてみる。とても小さな点だが、小学校とその学区域が重なった。
渋谷区街区と小学校を重ねてみる。
中学校区域
中学校のは学区域データはあるが、中学校の点データは入手できなかった。
渋谷区全体
行政区域から渋谷区を抽出。
WHERE [N03_007] = '13113'
属性情報(行政区域名など)が文字化けしている。
福祉施設
渋谷区の福祉施設を抽出。福祉施設も点でよくわからないので渋谷区全体と重ねてみる。
レポートビルダーでマップを作成する
レポートビルダーでMAPを作成する
新規をクリックする。
名前に「DS_GIS」を入れて「ビルド」をクリックする。
サーバ名を入れる。これから作るMAPレポートのアクセスユーザにデータベース「GIS」選択権を付与する前提なので「Windows認証を使用する」にチェックする。
接続できた。作業しているアカウントにアクセス権がないと接続できない。
マップの空間データを含むクエリを選ぶ。ここではストアドプロシージャ「getShibuyaMap」を選んだ。これくらいの内容でストアドプロシージャは大げさだが、後にもう少し複雑なデータ取得に拡張しようと思うので、ストアドプロシージャにした。
USE [GIS]
GO
/****** Object: StoredProcedure [dbo].[getShibuyaMap] Script Date: 2014/10/06 23:00:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[getShibuyaMap]
AS
BEGIN
SET NOCOUNT ON;
SELECT
'渋谷区街区' as データ区分
,*
FROM [dbo].[渋谷区街区_h22ka13113]
END
GO
ストアドプロシージャ「getShibuyaMap」の実行結果に含まれる空間データから、MAPが描画される。
大きさを拡大し、Bing Maps のレイヤーを埋め込むにチェック。
人口数をバブルで表現するので、バブルマップを選ぶ。
分析データセットを選ぶ。ここでは人口が含まれるクエリが含まれる「DataSet1」を選ぶ。DataSet1はマップの空間データと人口数、世帯数を含むストアドプロシージャ「getShibuyaMap」のこと。空間データと別のクエリを指定することもできる。
ページの大きさを調整、マップの大きさを調整(赤枠)、タイトルを入れたりフォントを変更。
プレビューしてみる。
ちょっと小さいので大きくしよう。
適当にキャンバスを大きくする。
プレビューするとこんな感じ。
Bing Maps の表示を切替可能なように変更する
Bing Mapsなし、道路、航空写真、ハイブリッドを選べるようにする。
まず切替用のパラメータを作成する
パラメータ名(名前)をBingMapsにし、プロンプト(利用者に見せるタイトル)も同じBingMapsにする。
選択肢を設定する。ラベルは利用者に見せる値、値はレポートが実際に受け取る値。
規定値をRoad(道路)にする
パラメータの値が変更されたら再表示するようにする。
パラメータの値に応じてBing Mapsの表示を切り替えるようにする
Bing MapsはTitleLayer1にあるので、タイトルのプロパティを選ぶ。
Bing Mapsの既定を「道路」にして作成していたので「道路」が選ばれている。パラメータの値に応じて切り替えるので fx をクリックして式を埋め込む。
=Switch(Parameters!BingMaps.Value = "Road","Road",Parameters!BingMaps.Value = "Aerial","Aerial",Parameters!BingMaps.Value = "Hybrid","Hybrid",Parameters!BingMaps.Value = "No","Road")
定数としてRoad(道路)、Aerial(航空写真)、Hybrid(Hybrid)があることがわかる。前述の選択肢はここの定数を確認して設定した。
種類が「<式>」に変わった。
次に、「なし」を選んだ時にBing Mapsを非表示にする設定。
=IIf(Parameters!BingMaps.Value = "No","Hidden","Visible")
以上でBing Mapsの表示切替設定はおわり。
プレビューするとBing Mapsの表示切替が可能になっている。ただし、プレビューなので選択肢切替と同時に表示が切り替わらない。
レポートを保存する
レポートサーバにアップロードし公開する
作成したRDLファイルをアップロードし、アクセス権を付与することでブラウザで閲覧できる状態、つまり公開ということになる。
レポートサーバにGIS用のフォルダを作成する
フォルダ「GIS」ができた。この中にSQL Serverへ接続するためのデータソースやレポートオブジェクトであるRDLファイルを置くことにする。
共有データソースを作成
MAP用のデータベースは「GIS」とした。レポートにデータソースを埋め込んだが、データベース「GIS」に接続するためのデータソースをレポートサーバ上に配置して、異なるレポート間でデータソースを共有するようにするので、レポートサーバ上にデータソースを配置する。
以上でデータソースの作成はおわり。
レポートアップロードする
レポートマネージャを開き、GISフォルダに移動する。
ファイルのアップロードをクリック。
作成済のRDLを選ぶ。
アップロードされた。
レポートへのアクセス権を付与する
管理を選ぶ
「アイテムのセキュリティを編集」をクリック
フォルダの既定値はローカルの Administrators だけにアクセス権が付与されているけど、それを無視してこのRDLに独自のアクセス権を付与する?かどうか聞かれるので、OK。
「新しいロールの割り当て」をクリック。
ユーザ名かグループ名を入れる。
新たにアクセスできるユーザが一人増えた。
レポートのデータソースを埋め込みからレポートサーバ上の共有データソースに変更する
アップロードしたRDLのデータソースは埋め込まれているので、サーバ上の共有データソースに切り替える。
「共有データソース」を選び「参照」をクリック。
先ほど作成した「DS_GIS」を選んでOK。
必ず「適用」をクリック。適用しないと反映されない。
レポートサーバで確認するとレポートがある。
ブラウザで開いてみる
うちの環境では、URLは下記のとおり。アクセス権を付与されていれば、IEは管理者として実行する必要なし。
ttp://sn78sh7/ReportServer/Pages/ReportViewer.aspx?%2fGIS%2f%e5%b9%b3%e6%88%9022%e5%b9%b4%e5%ba%a6%e5%9b%bd%e7%a8%8e%e8%aa%bf%e6%9f%bb%e8%a1%97%e5%8c%ba%e5%88%a5%e6%b8%8b%e8%b0%b7%e5%8c%ba%e4%ba%ba%e5%8f%a3%e4%b8%96%e5%b8%af%e6%95%b0&rs:Command=Render
既定でBing Mapsは道路。
航空写真を選ぶ。おや、自動でレポートが再表示されない。右にあるレポートを表示しないと切り替わらかった。原因は後日調べる。タイトル(BingMaps)が変わっただけだから、再描画不要判定された?
ハイブリッドを選択。
なし を選択。
PDFにエクスポートしてみる。
ちょっと時間かかる。
ダウンロードしたPDF。あれれ、一部か欠けてる。データ取得でタイムオーバー?
もう一回エクスポートしてみる。さっきよりよくなった。
以上、Shapeファイルを取り込んで、SQL Server のReporting Services 上でマップを作成する方法の紹介おわり。
次回は、ダウンロードした学校等のShapeファイルを、今回作成したMAPにレイヤーとして追加したり、分析データを追加したりといったことを書いてみようと思う。
コメント
コメントを投稿