2016-02-29

FME Server とウェブアプリケーション

前回の「地理院タイルデータの取得 - 西之島付近噴火活動 正射画像の例」「地理院タイル」のデータを取得するカスタムトランスフォーマー JpGsiTileFetcher の使用例を紹介しました。それはそれで役に立つ場合もあると思いますが、地理院タイルの最も有効な活用法は、やはりウェブマッピングアプリケーションのベースマップとして、オンラインで利用することでしょう。

Leaflet (ウェブマッピングアプリケーション開発用のオープンソース JavaScript ライブラリ) を使うと、地理院タイルなどのウェブマップタイルをアプリケーションのベースマップとして簡単に利用することができます。また、Leaflet では GeoJSON データに基づいてレイヤを作成するメソッドも定義されているので、ベクターデータを GeoJSON 形式に変換する FME ワークスペースを作成し、それをアプリケーション側からリクエストがあったときに FME Server で実行することによって、動的にレイヤを追加することなども容易です。

ここでは、FME Server を使用した2つの簡単なアプリケーション例を掲げます。どちらも地理院タイルをベースマップとし、地図の表示や操作は Leaflet ライブラリを使って JavaScript で実装しました。アプリケーションと FME Server の間のコミュニケーションには JavaScript Library for FME Server を使用しています。

FME 2016.0.1.0 build 16174


例 1. Hi-net 自動処理震源リストの取得と表示

防災科学技術研究所 Hi-net に関しては、「HTML文書の取得と変換」で Hi-net 自動震源処理リストページ (HTML) からデータを取得、変換するワークスペース例を掲げ、「Google Earth ネットワークリンク」ではその応用として、変換結果を KML ネットワークリンクとして FME Server から配信するためのワークスペース例を紹介しました。

これらの記事で紹介したワークスペースのデータ取得部分を再利用すれば、Hi-net 自動震源処理リストページに掲載されているデータを取得して GeoJSON 形式で出力するワークスペースも作成できます。

FME ワークスペース例: Hi-net 自動処理震源リスト (HTML) -> ポイント -> GeoJSON

















Hi-netParser (カスタムトランスフォーマー): 「HTML文書の取得と変換」のワークスペース例と同じ処理を行う。
VertexCreator: 緯度 (Lat), 経度 (Long) に基づいてポイントを作成する。
[GEOJSON] ライター: GeoJSON 形式で出力する。

このワークスペースを FME Server にアップロードして Data Streaming Service として実行できるように設定すると、アプリケーション側ではそれを任意のタイミングで実行し、その時点で Hi-net から取得したデータに基づいて作成した震央ポイントフィーチャーを GeoJSON 形式で受け取ることができます。

次の図は、ウェブブラウザからアクセスされたとき、および「最新の情報に更新」ボタンがクリックされたときにこのワークスペースを FME Server で実行し、FME Server から返された GeoJSON データに基づいて震源の深さとマグニチュードに応じたスタイルの円 (Circle) を表示するアプリケーションの例です。

2016年2月28日14:40 頃に取得したデータの表示例 (左: ズームレベル 5, 右: ズームレベル 8)
円の色は深さ (赤: 浅い -> 青: 深い)、半径はマグニチュードの大小 (2 mag に比例) を示す。
ベースマップ: 地理院タイル 白地図 (データID = blank)
※ローカルサーバーでのテスト結果をキャプチャしたものであり、インターネット上では公開していません。























例 2. メッシュポリゴンの作成・ダウンロード

次のワークスペースは、任意の矩形領域の南西隅と北東隅の座標、メッシュの種類、出力先のファイルフォーマットをパラメーターとして受け取り、その矩形領域をカバーする範囲の地域メッシュ区画 (メッシュポリゴン) を作成します。

FME ワークスペース例: 矩形領域 -> メッシュポリゴン -> 指定されたフォーマットおよび GeoJSON

















Creator: フィーチャーを1個作成する。
2DBoxReplacer: パラメーターで指定された南西隅、北東隅の座標に基づいて矩形領域を作成する。
JpStdGridAccumulator (FME Store): 当該矩形領域をカバーする範囲のメッシュポリゴンを作成する。
SpatialFilter: 当該矩形領域と重なる範囲のメッシュポリゴンのみに絞り込む。
[GENERIC] ライター: 指定されたフォーマットのファイルに出力する。
[GEOJSON] ライター: GeoJSON 形式で出力する。

JpStdGridAccumulator は FME Store で公開しているカスタムトランスフォーマーで、入力フィーチャーのジオメトリをカバーする範囲のメッシュポリゴンを作成します。このトランスフォマーは、3次メッシュ~10分の1 細分メッシュのメッシュポリゴンを2次メッシュ区画の単位で作成するので、SpatialFilter によって指定された矩形領域と重なる範囲のメッシュポリゴンのみに絞り込んでいます。

次の事項は、ワークスペースの Published Parameters (公開パラメーター) として実行時に指定できるようしました。
・作成するメッシュポリゴンの種類 (1次, 2次, 3次, 2分の1細分, 4分の1細分, 8分の1細分, 10分の1細分)
・メッシュポリゴンを作成する範囲 (矩形領域の南西隅、北東隅の座標)
・GENERIC ライターの出力先ファイルフォーマット

GENERIC ライターの出力先ファイルフォーマットのパラメーター化については、「出力先フォーマットのパラメーター化 - 基盤地図情報DEMの例」を参照してください。

このワークスペースを FME Server にアップロードし、Data Download Service (GENERIC ライター使用) および Data Streaming Service (GEOJSON ライター使用) として実行できるように設定すると、アプリケーション側では、メッシュの種類と範囲を指定してメッシュポリゴンを描画したり、それらを格納したファイルをダウンロードしたりすることができるようになります。

下の図はこのワークスペースを利用したアプリケーションの例で、次の3つのタイミングで FME Server を使用します。

(1) ウェブブラウザからアクセスされたとき、FME Server から上記ワークスペースの公開パラメーターの定義を取得し、2つのドロップダウンリスト (メッシュの種類およびダウンロードファイルフォーマットの選択肢) を初期化する。

(2) 地図上で矩形領域 (赤) が描画されたとき、その南西隅と北東隅の座標、およびドロップダウンリストで選択されているメッシュの種類をパラメーターとして上記ワークスペースを Data Streaming Service によって実行し、FME Server から返された GeoJSON データに基づいて矩形領域をカバーする範囲のメッシュポリゴン (緑) を描画する。

(3) 「ダウンロード」ボタンがクリックされたとき、(2) と同じ座標とメッシュの種類、および、ドロップダウンリストで選択されているフォーマットをパラメーターとして上記ワークスペースを Data Download Service によって実行し、FME Server が作成したファイルのダウンロードを始める (Data Download Service によって出力されたファイルは、FME Server が自動的に zip 圧縮します)。

ベースマップ: 地理院タイル 淡色地図 (データID = pale)
※ローカルサーバーでのテスト結果をキャプチャしたものであり、インターネット上では公開していません。





















もちろん、上記例のようなウェブアプリケーションは FME を使わなくても開発することはできます。しかし、FME Server の利用を前提とすれば、システム設計においてユーザーインターフェースの部分と空間データ変換の部分を分割し、データ変換の部分は FME ワークスペースとして単独で実装することができます。それぞれ得意な技術者が分担することによって、高品質のアプリケーションを効率的に開発できるケースもあると思われます。

2016-02-25

地理院タイルデータの取得 - 西之島付近噴火活動 正射画像の例

国土地理院が公開している地理院地図 (電子国土Web) の地図画像は、「地理院タイル」と呼ばれるウェブマップタイルデータセットの一部です。地理院タイルはウェブアプリケーションユーザーインターフェースの背景画像として容易に利用できますが、地図画像以外にもさまざまな種類のデータが公開されており、それらをディスプレイ画面上に表示するだけでなく、データとして取得することもできれば、地理院タイルの活用の幅がさらに広がると思われます。

FMEでは、ウェブ上で公開されている画像データのURLが既知であれば ImageFetcher などのトランスフォーマーによって簡単に取得できますが、ウェブマップタイルとして提供されている画像を取得するには、まず、必要な地点や区域を含むタイルのURLを求めるためのプロセスが必要になります。また、タイルの画像データ本体には、地理座標系における位置やサイズに関する情報は含まれていないので、地理情報システム用のデータとして利用するには、それらを求めるためのプロセスも必要です。

それらのプロセスを含め、地理院タイルのデータを取得する処理を任意のワークスペースに簡単に組み込めるよう、カスタムトランスフォーマー JpGsiTileFetcher を作成しました。このトランスフォーマーは、入力フィーチャーのジオメトリをカバーする範囲のタイル (パラメーターで指定したデータID、ズームレベルのもの) をラスターとして取得するとともに、EPSG:3857 (Spherical Mercator) における原点座標やセルサイズをそれらに設定します。

FMEサポートサイトでこのトランスフォーマーを公開しましたので、詳細はダウンロードファイルに含まれる readme.txt およびトランスフォーマー定義ファイル (*.fmx) を参照してください。fmx ファイルは Workbench で開き、内容を調べたり編集したりすることができます。
FMEサポート > 国内データ変換のサポート (カスタムトランスフォーマー)
2016-03-08: JpGsiTileFetcher に国土地理院「ベクトルタイル提供実験」で提供されているベクターデータ (道路中心線、鉄道中心線、基盤地図情報など) を取得する機能を追加して更新しました。

ここでは、JpGsiTileFetcher の使用方法を示すため、地理院タイル「西之島付近噴火活動 正射画像」データを取得するワークスペース例を掲げます。

ウィキペディア「西之島」より引用: 西之島(にしのしま)は、小笠原諸島の島(無人島)。海底火山の活動により生じた火山島であり、付近では2015年3月現在も活発な噴火活動が見られる。

FME 2016.0.1.0 build 16174


FME ワークスペース例












[CSV] リーダー: 地理院タイル「西之島付近噴火活動 正射画像」のデータIDを記述したCSVファイルを読み込む。
2DBoxReplacer: 西之島をおおむね取り囲む矩形ポリゴンを作成する。
CoordinateSystemSetter: 矩形ポリゴンに座標系 (LL-WGS84) を設定する。
JpGsiTileFetcher: 矩形ポリゴンをカバーする範囲についてズームレベル15のタイル (画像データ) を取得する。
RasterMosaicker: データIDごとにラスターをモザイク (結合) する。

地理院タイルとして提供されているデータには、その種類を識別するためのデータIDが与えられており、データ取得先URLの構成要素のひとつとして使用されます。詳細については、国土地理院ウェブサイトの「地理院タイル仕様」および「地理院タイル一覧」を参照してください。

現在 (2016-02-25)、2013年12月以降10回の撮影日について地理院タイル「西之島付近噴火活動 正射画像」が公開されており、撮影日ごとのデータIDが割り当てられています。この例では次の6回分について、ズームレベル15の画像データを取得することにしました。データIDの先頭8桁数字は、撮影年月日 (yyyymmdd) と一致しています。
----------
20131217doh
20140216doh
20140704dol
20141204doh
20150301doh
20151209dol
----------

このワークスペースは、テキストファイルに記述したこれらのデータIDを CSV リーダーによって読み込み、西之島を含む範囲 (2DBoxReplacer で矩形ポリゴンとして作成) について、データIDごとに地理院タイル「西之島付近噴火活動 正射画像」データの取得 (JpGsiTileFetcher) とモザイク処理 (RasterMosaicker) を行うことによって、撮影日ごとの画像データを作成します。

ワークスペース例で示した範囲にはライターを含めていませんが、RGBカラー画像の格納をサポートするラスターデータフォーマット用のライターを追加すれば、作成した画像データをファイルに出力することができます。


結果: 地理院タイル「西之島付近噴火活動 正射画像」 6撮影日分 (データID=20131217doh, 20140216doh, 20140704dol, 20141204doh, 20150301doh, 20151209dol) に基づいて作成
撮影日 (データID) ごとに4または9タイルをモザイクした画像を左上から右下に向けて日付順で並べました。縮尺はすべて同じです。時間の経過とともに陸地が拡大している様子がよく分かります。

























西之島の噴火活動に関して、地理院タイルでは画像データだけでなく、「西之島付近噴火活動 標高タイル」 (ズームレベル15) も提供されています。標高タイルは、タイル1区画を 256 x 256 に分割した各セルの標高値をカンマ区切りで列挙したテキストデータですが、JpGsiTileFetcher は、それを1バンド64ビット浮動小数点数のDEM (Digital Elevation Model: 数値標高モデル) ラスターに変換してから出力します。

下図左は「西之島付近噴火活動 標高タイル(2015年12月9日)」を取得した結果 (DEMラスター)、同右はそれをさらに点群 (ポイントクラウド) に変換した結果を FME Data Inspector で表示したものです。右の点群データは、標高差を強調するために標高値を2倍にしています。

地理院タイル「西之島付近噴火活動 標高タイル(2015年12月9日)」 (データID=20151209dd5) に基づいて作成
















次の図は、JpGsiTileFetcher によって取得した「西之島付近噴火活動 標高タイル(2015年12月9日)」DEMラスターを TIN (不規則三角網) サーフィスに変換し、同じワークスペース内でもうひとつの JpGsiTileFetcher によって取得した「西之島付近噴火活動 正射画像(2015年12月9日撮影)」をテクスチャとしてマッピングした結果です。変換結果は FME Data Inspector でも確認できますが、この図は VRML 2.0 (VRML97) ファイルに出力してから Cortona3D Viewer で表示したものです。

地理院タイル「西之島付近噴火活動 標高タイル(2015年12月9日)」 (データID=20151209dd5) および「西之島付近噴火活動 正射画像(2015年12月9日撮影)」 (データID=20151209dol) に基づいて作成

















2016-02-21

データベースの空間検索機能の利用 - 国土数値情報 (医療機関)

FME のワークスペースでは、ジオメトリ間の空間的な関係に基づくデータの抽出 (いわゆる「空間検索」) を行うために SpatialRelator や SpatialFilter などのトランスフォーマーを使うことができます。
しかし、トランスフォーマーによる検索は、ソースデータに含まれる全てのフィーチャーを読み込んでから条件に該当するものを抽出する仕組みであるため、例えばウェブアプリケーションのインターフェースを通じてユーザーが検索範囲を指定するたびにその範囲に含まれるフィーチャーを抽出する場合など、異なる条件によって繰り返し行われることが想定される検索処理については、あまり効率が良い方法とは言えません。そのような場合には、空間データをサポートするデータベースにソースデータを格納しておき、データベースの空間検索機能を利用することが妥当と考えられます。

ここでは、国土数値情報 (医療機関) で提供される点データを PostGIS データベースに格納したうえで、パラメーターとして指定された矩形領域に含まれる医療機関のデータをデータベースから抽出し、GeoJSON 形式に変換するワークスペース例を掲げます。

データベースからのデータ抽出と GeoJSON への変換は、ウェブアプリケーションからのリクエストがあったタイミングで FME Server が Data Streaming サービスとして実行し、結果をアプリケーションに返すという使い方を想定します。
また、出力先のデータフォーマットやスキーマはアプリケーション側の仕様に応じて決定すべきものです。この例では、Google Maps JavaScript API を使用したアプリケーションで利用することを想定し、それに適している GeoJSON としました。

FME 2016.0.1.0 build 16174


FMEワークスペース例1: 国土数値情報 (医療機関) XML -> PostGISデータベース
まず、国土数値情報 (医療機関) XML データを PostGIS データベースに格納するためのワークスペースを作成、実行します。出力先の PostGIS データベースが FME Server からアクセスできる場所にあるものであれば、このワークスペースは FME Desktop で実行しても構いません。












[XML] リーダー: gml:Point要素 (GML形式のジオメトリ) と ksj:MedicalInstitution要素 (属性) の読込
FeatureMerger: Point要素の id 属性をキーとして、属性を結合
StringConcatenator: 診療科目 (3属性) を全角空白区切りで結合した文字列を作成
StringReplacer: 複数の診療科目間の区切り文字 (全角空白) をカンマに置換
AttributeTrimmer: 診療科目連結文字列末尾の余分なカンマを削除
GeometryReplacer: Point要素 (GML) に基づいてジオメトリ (ポイント) を作成
AttributeKeeper: 必要な属性のみを残す (必須ではないが分かり易くするため)
[POSTGIS] ライター: KSJ_MedicalInstitution データベースの institutions テーブルにデータを格納

国土数値情報 (医療機関) XML データでは、gml:Point 要素にポイントジオメトリ、ksj:MedicalInstitution 要素に医療機関の属性が記述されており、gml:Point 要素の id 属性をキーとして医療機関の属性が関連づけられます。XML リーダーではそれらのXML要素をフィーチャータイプとして読み込み、FeatureMreger でポイントの id をキーとして結合しました。

ksj:MedicalInstitution 要素の子要素として診療科目を記述している要素があり、診療科目が複数ある場合は全角空白区切りで列挙され、さらに、診療科目が多数ある場合 (全角空白区切りで列挙したときに Shift JIS コードで254バイトを超える場合) は最大で3つのXML要素に分けて記述されています。XMLドキュメントをパースする際には個別の診療科目ごとにXML要素があった方が都合が良いのですが、国土数値情報はXMLデータと同時に Esri Shapefile 形式のデータも配布しているため、Shapefile データのスキーマに準じたものと推測されます。

それはさておき、PostGIS データベースの text 型フィールドならば格納できる文字数は実用上無制限なので、このワークスペース例では、全ての診療科目をカンマ区切りで列挙した文字列に変換したうえで、services フィールドに格納することとしました。StringConcatenator, StringReplacer, AttributeTrimmerは、カンマ区切りの診療科目文字列を作成するためのものです。
注: データベースの設計としては診療科目は別のテーブルに格納した方が望ましいかも知れませんが、ワークスペースを簡潔にするためにここでは1テーブルに全ての属性を格納しています。

国土数値情報の点データは GML の gml:Point 要素で記述されているので、GeometryReplacer (Geometry Encoding: GML) によってそのXML要素からポイントを作成することができます。

国土数値情報 (医療機関) では各医療機関を医療法に基づいて次の3種類に分類しており、それらはコード1~3で識別されます。この区分による検索を行うことも想定し、データベースの inst_class フィールドにコードを格納しました。
1: 病院
2: (一般)診療所
3: 歯科診療所


FMEワークスペース例2: PostGISデータベース -> GeoJSON
次に、PostGISデータベースから指定された領域に含まれる医療機関データを抽出して GeoJSON形式に変換するワークスペースを作成し、FME Server にアップロードして Data Streaming サービスで実行するための設定をします。














[POSTGIS]リーダー: PostGISデータベースから検索条件に該当する医療機関フィーチャーを抽出する。
Creator: フィーチャーを1個作成する。
FeatureMerger: Creator が作成したフィーチャーを無条件で医療機関フィーチャーに結合する。
[GEOJSON]ライター: データベースから抽出された医療機関フィーチャーを GeoJSON 形式で出力する。
[TEXTLINE]ライター: 検索条件に該当する医療機関がひとつもないことを示す JSON オブジェクトを出力する。

基本的には、POSTGIS リーダーによって抽出された医療機関フィーチャーを単純に GeoJSON 形式で出力しているだけですが、アプリケーションからのリクエストに応じて結果を返すことを想定する場合には、指定された検索条件に該当する医療機関がひとつもなかったときに何を返すかを定義しておく必要があります。

このワークスペース例では、Creator によってひとつフィーチャーを作成し、POSTGIS リーダーから読み込まれた医療機関フィーチャーに無条件に結合しています。こうしておくと、検索条件に該当する医療機関フィーチャーがひとつもなかった場合に Creator で作成されたフィーチャーが FeatureMerger の Unreferenced ポートから出力されるので、そのときに限り特定の JSON オブジェクト (例えば {"id": "no_data"}) を TEXTLINE ライターで出力することによって、アプリケーション側ではそれが返されたときのアクション (メッセージボックスを表示するなど) を定義することができます。

PostGIS データベースの検索機能を利用するには、検索条件とする値をワークスペースが受け取るための公開パラメーターを定義するとともに、POSTGIS リーダーにそれらを渡すための設定が必要です。それについては後述します。


結果: 地理的な範囲を指定して医療機関を検索するウェブアプリケーション例
医療機関の種類を選択し、Google Maps 上で矩形領域を描画すると、その種類・範囲を検索条件としてワークスペース例2を実行し、結果 (ポイント) を表示します。Google Maps JavaScript APIJavaScript Library for FME Server を使用しました。
注: ローカルサーバーでのテスト結果をキャプチャしたものであり、インターネット上では公開していません。




















ワークスペース例2: PostGIS データベースの検索機能を利用するための設定

空間データをサポートするデータベース用のリーダーには Envelope (データを抽出する範囲) を指定するためのパラメーターがあり、また、空間/非空間ともにデータベース用のリーダーフィーチャータイプにはフィールド値によるデータの抽出条件を指定するための WHERE Clause パラメーター (SQL 文の WHERE 句に相当する) があります。検索条件としてこれらのパラメーターに値を設定してワークスペースを実行した場合は、データベースの検索機能を利用して比較的効率よく検索条件に該当するデータを抽出することができます。

これらのパラメーターに設定すべき値をアプリケーション側から受け取るためのインターフェースとしてワークスペースの Published Parameters (公開パラメーター) を定義することにより、アプリケーション側で検索条件を指定できるようになります。

(1) 公開パラメーターの定義
この例では、Published Parameters (公開パラメーター) を次のように定義しました。
MINX, MINY, MAXX, MAXY: データを抽出する範囲の矩形領域を規定する座標値
INST_CLASS_CSV: 抽出すべき医療機関の種類を示すカンマ区切りのコード













(2) POSTGIS リーダーパラメーター (Search Envelope)
POSTGIS リーダーのデータ抽出範囲を指定するためのパラメーター (Minimum X/Y, Maximum X/Y) を、上記の公開パラメーターにリンクします。






















(3) POSTGIS リーダーフィーチャータイプパラメーター (WHERE Clause)
医療機関の種類 (カンマ区切りのコード) を受け取るパラメーターは、リーダーフィーチャータイプの WHERE Clause から参照します。この設定は Navigator ウィンドウでもできます。


















ワークスペースで以上のような設定をしておけば、アプリケーション側でユーザーが指定した検索条件を FME Server JavaSctipt API のメソッドを通じてワークスペースに渡して実行することができるようになります。

2016-02-18

出力先フォーマットのパラメーター化 - 基盤地図情報DEMの例

多くの場合、FME によるデータ変換結果の出力先フォーマットはワークスペースの作成時に決定されますが、Generic (Any Format) ライターを使うと、ワークスペースを実行するときのパラメーターとして出力先フォーマットを選ぶこともできるようになります。
ここでは、基盤地図情報数値標高モデル (DEM) をラスターに変換した結果を任意のフォーマットで出力するワークスペース例を掲げます。

FME 2016.0.1.0 build 16174

FME ワークスペース例




















[JP_FGD_DEM] リーダー (カスタムフォーマット): 基盤地図情報DEM (XML形式) をラスターに変換する。
[GENERIC] ライター: Output Format パラメーターで指定されたフォーマットで出力する。

JP_FGD_DEM は FME Store で公開しているカスタムフォーマットで、基盤地図情報DEM (XML形式) をファイル単位でラスターデータに変換してから出力します。カスタムフォーマットは、任意のワークスペースにおいてリーダーと同じ方法で追加、使用できます。

リーダーフィーチャータイプでフォーマット属性 "fme_basename" (拡張子を除くファイル名が格納される) を公開し、ライターフィーチャータイプのフィーチャータイプ名としてそれを選択することにより、拡張子を除いて、変換後のラスターデータファイル名は元の XML ファイル名と同じになります。

Generic (Any Format) ライター (GENERIC) をワークスペースに追加する際には、パラメーターとしてデフォルトの出力先フォーマットを選択します。この例では、GeoTIFF をデフォルトとしました。













この設定でライターを追加すると、ユーザーパラメーター GENERIC_OUTPUT_FORMAT_GENERIC が自動的に作成されるとともに、GENERIC ライターの Output Format パラメーターがそれとリンクします。ワークスペースを実行するときには、このパラメーターによって出力先のフォーマットを指定することができます。

結果: 次の3種類のフォーマットについてそれぞれ実行した結果 (Windows エクスプローラーでのファイル表示)
Esri ASCII Grid: *.asc
ERDAS IMAGINE: *.img
GeoTIFF (Georeferenced Tagged Image File Format): *.tif


















結果: FME Data Inspector による変換後データの表示 (どのフォーマットでも同じ)
基盤地図情報 10mメッシュDEM 2次メッシュ4区画: 513903, 513904, 513913, 513914
三宅島をカバーする範囲


















出力先フォーマット選択用のパラメーターの改良

GENERIC ライターの Output Format パラメーターでは、FME が出力をサポートする全てのフォーマットが選択できます。しかし、この例では、ラスターをサポートしないフォーマットを選択して実行することには意味がありませんし、もし、選択したフォーマットがラスターをサポートしない場合は、実行時に予期しないエラーが生じることもあります。

ワークスペースの作成者、または、内容を熟知しているユーザーだけが実行するのであればこのままでも構いませんが、不特定多数のユーザーが利用することを前提とする場合には、これは望ましくありません。このワークスペースがサポートする出力先フォーマットの種類を決めておき、ユーザーがその中から選択できるようにしておくべきでしょう。

そのためには、選択式の公開パラメーター (Published Parameter) を追加し、ライターの Output Format パラメーターのリンク先をそれに変更します。例えば:


Choice with Alias タイプのパラメーターは、ユーザーに対して表示する選択肢 (Display Name) と、それに対応するパラメーターの値 (Value) のペアを複数定義することができます。

出力先フォーマット選択の場合には、選択肢の構成を編集する画面右下の Import > Writer Format(s) で Writer Gallery (チェックボックス付き) を開き、ひとつ以上のフォーマットを選択してそれらの全称と略称 (識別子) のペアを、選択肢とパラメーターの値のペアとしてインポートすることができます。この例では3つのフォーマット - GeoTIFF, ERDAS IMAGINE, Esri ASCII Grid をインポートしました。

インポートした後、選択肢 (Display Name) の表現や順序は変更しても差し支えありませんが、パラメーターの値 (Value) は FME がフォーマットを識別するために使用するものなので、変更しないでください。

そして、GENERIC ライターの Output Format パラメータのリンク先をこのパラメーターに変更します。このとき、ライター追加時に作成された GENERIC_OUTPUT_FORMAT_GENERIC パラメーターは自動的に削除されます。

























このパラメーターの設定画面では、前述の3種類のフォーマットのうちひとつが選択できるようになります。








FME Server によるデータ変換・ダウンロード

FME Desktop のユーザーであれば、このワークスペースによって基盤地図情報DEMデータ (*.xml) を3種類のフォーマットのラスターデータに変換することができます。さらに、このワークスペースを FME Server にアップロードして Data Download サービスとして実行可能な設定をすると、FME のライセンスを持たない人でも、このワークスペースによるデータ変換を行えるようになります。

FME Server のウェブインターフェースにおけるワークスペースの実行画面は次のようになり、実行結果は zip 圧縮形式でダウンロードできます。

FME Server ウェブインターフェース (ワークスペース実行画面): Microsoft Internet Explorer での表示例
ユーザーのディスクシステムから基盤地図情報DEMデータファイル (*.xml, 複数可) をドラッグ&ドロップまたは選択することによってアップロードし、出力データフォーマットを選択して実行すると、変換結果 (選択したフォーマットのラスターデータファイルを圧縮した zip ファイル) がダウンロードできる。









































このウェブインターフェースは FME Server をインストールした後すぐに使えるようになりますが、他のウェブサイトでも JavaScript などによってパラメーターの設定やリクエスト発行等の仕組みを実装すれば、FME Server にアクセスしてワークスペースを実行することができます (FME Server 側で、他のドメインからのアクセスを許可するための設定をする必要はあります)。

上記例では、ユーザーが基盤地図情報DEMデータファイル (*.xml) を用意して FME Server にアップロードしなければなりませんが、ソースデータはデータベースにストックしておき、ユーザーからのリクエストがあったときにデータベースから必要な部分を抽出して指定されたフォーマットに変換し、ユーザーはその結果をダウンロードする、という仕組みも可能です。

Data Download サービスは FME Server の基本機能のひとつであり、かつ、ポピュラーな FME の利用形態でもあります。欧米では、公的機関のウェブサイトで提供されているデータダウンロードサービスのバックエンドとして FME Server を利用している例が見られます。

2016-02-13

e-Stat 統計表情報ウェブページの自動作成 (FME Server)

政府統計の総合窓口 (e-Stat) では統計表情報や統計データなどを取得するための API が公開されており、これを利用することによって、政府統計を活用したアプリケーションを開発することができます。
e-Stat API は、HTTP プロトコル (GET メソッド) によって XML または JSON 形式のテキストデータを配信するものなので、FME の HTTPCaller トランスフォーマーによってそれを取得し、目的に応じて必要な内容を抽出したり加工したりすることができます。

ここでは、平成22年国勢調査結果として公開されている統計表の情報を e-Stat API によって取得し、HTML テーブル (table要素) に変換するワークスペース例を掲げます。このワークスペースを FME Server にアップロードし、それを実行するためのスクリプト (JavaScript) を記述した html ファイルをウェブ上で公開すれば、ユーザーがそのページにアクセスしたときにワークスペースを自動的に実行し、その結果をユーザーのウェブブラウザ画面上に表示させることができます。

注: e-Stat API を利用したアプリケーションを開発するには、利用登録をするとともに、アプリケーションIDを取得する必要があります。e-Stat API の仕様や利用登録については次のサイトを参照してください。
政府統計の総合窓口(e-Stat) - API機能

FME 2016.0.1.0 build 16174

FME ワークスペース例













Creator: 処理の開始
HTTPCaller: e-Stat API によって平成22年国勢調査の統計表情報 (XML) を取得

1. 統計表リスト HTML テーブル作成 (上のブックマーク)
XMLFragmenter: XML の TABLE_INF 要素 (統計表の情報) ごとに次の属性を抽出
・STATISTICS_NAME: 統計表の提供統計名及び提供分類名 (以下「分類名」)
・TABLE_INF.id: 統計表ID (TABLE_INF要素のid属性)
・TITLE.no: 表番号 (TITLE要素のno属性)
・TITLE: 統計表の表題 (以下「統計表名」)
TextEncoder x 2: 分類名と統計表名に含まれる <, >, " などをHTMLエンティティに変換
StringConcatenator: 統計表ごとにHTML形式のテーブル行要素 tr を作成
AttributeKeeper: 必要な属性のみを残す (必須ではないが分かり易くするため)
Aggregator: STATISTICS_NAME (分類名) ごとに集約して行要素 tr をリスト _list{}.tr に格納
XMLTemplater: 分類名表示用の h3 要素、その分類に属する tr 要素を含む table 要素を作成

2. エラーメッセージ作成 (下のブックマーク)
XMLFragmenter: XML の RESULT 要素から処理結果情報を抽出
Tester: 処理結果が 0 (正常終了、かつ、該当データあり) 以外のものを選択
StringConcatenator: メッセージ表示用のHTML要素を作成

注: HTTP リクエストに失敗したときに HTTPCaller <Rejected> ポートから出力されるフィーチャー (エラーに関する情報を属性として持つ) を使ったエラーメッセージも作成するべきですが、煩雑さを避けて上記例では省きました。

Text File ライター: 結果をテキスト形式で出力
デスクトップ環境で実行したときはファイルに出力、FME Server の Data Streaming Service で実行したときはストリーミングされます。


結果: 平成22年国勢調査 統計表リスト (12分類356表) のウェブブラウザによる表示
FME Server は Tomcat をバンドルしており、それをウェブサーバーとして使うことができますが、他のサーバーで稼働するアプリケーションから FME Server に接続して利用することもできます (FME Server 側で、他のドメインからのアクセスを許可するための設定が必要)。この例では Apache 2.4 を使いました。ただし、ローカルネットワーク内でのテスト結果であり、インターネットウェブには公開していません。
























HTTPCaller では、e-Stat API の仕様に基づいてリクエスト先の URL やパラメーターを設定します。特定の年の国勢調査の統計表情報を取得するには、次のパラメーターが必須です。
・appId: アプリケーションID。e-Stat API の利用登録をしてから取得
・statsCode: 政府統計コード。国勢調査は 00200521
・surveyYears: 調査年月。平成22年国勢調査ならば 2010

ワークスペース例では、これらをワークスペースのユーザーパラメーターとして定義し、HTTPCaller の Query String Parameters セクションでそれらにリンクしています。図の "$(APP_ID)" などは、ユーザーパラメーターにリンクしている状態を示しています。

レスポンスとして得られた XML ドキュメントは Response Body Attribute (レスポンス本体の属性) パラメーターで指定した名前 (デフォルトでは "_response_body") の属性に格納され、後続のトランスフォーマーによって必要な変換を行うことができます。



























XMLFragmenter では、Elements to Match パラメーターに TABLE_INF を指定することで、統計表情報 XML ドキュメントから TABLE_INF 要素を抽出し、Flatten (平坦化) Option を有効にすることで、その要素以下のXML要素・属性の値をフィーチャー属性として取得することができます (参考: XMLの読込 - 断片化と平坦化)。e-Stat API で提供される XML ドキュメントのスキーマについては、前掲の e-Stat API サイトを参照してください。

StringConcatenator でHTML tr 要素 (テーブルの行) を作成するための文字列式は次のとおりです。4番目の列 (td 要素) の内容は、[ダウンロード] ボタンを表示し、それがクリックされたときに統計表IDを引数として download 関数を実行するためのもので、アプリケーション側でその関数が実装されることを想定しています。
コメント <!-- ... --> は説明用に書き加えたもので、実際にはこのHTMLが人の目に触れることはないので不要です。
<tr>
<td>@Value(TABLE_INF.id)</td> <!-- 統計表ID -->
<td>@Value(TITLE.no)</td> <!-- 表番号 -->
<td>@Value(TITLE)</td> <!-- 統計表の表題 -->
<td><input type="button" onclick="download('@Value(TABLE_INF.id)');" value="ダウンロード" /></td>
</tr>

XMLTemplater で分類名ごとの HTML 要素を作成するためのテンプレートは次のとおりです。HTML は、基本的には XML のサブセットなので、このように XML 関係のトランスフォーマーが活用できる場合があります。
<div>
<h3>{fme:get-attribute("STATISTICS_NAME")}</h3>
<table>
<tr><th>統計表ID</th><th>番号</th><th>統計表名</th><th></th></tr>
{fme:get-xml-list-attribute("_list{}.tr")}
</table>
</div>


このワークスペースを FME Server にアップロードすれば、JavaScript Library for FME Server を使ってワークスペースを実行するための JavaScript スクリプトを記述したウェブページから実行し、結果 (HTML要素) を取得してページに追加することができます。各行の右端にみえる [ダウンロード] ボタンの onclick イベントには download 関数 (引数=統計表ID) を割り当てているので、JavaScript ともうひとつの FME ワークスペースで処理を実装することにより、実際に統計表をダウンロードするように拡張することも可能です。

実際のところ、国勢調査の各統計表は API を使わなくても e-Stat サイトからダウンロードできるので、統計表リストのウェブページを作成すること自体には大きな意味はありません。分かり易い例として取り上げたまでです。

この例は、FME Server がウェブアプリケーションのバックエンド (ユーザーから見えないところでデータ処理を行う要素) としても利用できるということを示しています。Google Maps などの API も併用すれば、地理情報を扱うウェブアプリケーションの開発も可能です。

本格的なウェブアプリケーションを開発するには、ユーザーインターフェースをはじめとするフロントエンドの部分のプログラミングやデザインに手間がかかることは避けられませんが、データ処理を中心とするバックエンドの部分は FME にまかせることによって、システム全体の開発・運用にかかるコストを削減できるケースもあると思われます。

2016-02-08

Google Earth ネットワークリンク (FME Server)

Google Earth は、ディスクに保存されている KML ファイルだけでなく、「ネットワークリンク」によってウェブサーバーから直接 KML データを読み込んで表示することもできます。
FME Server の機能のひとつとして、ワークスペースの実行結果として作成される KML データをストリーミングする仕組み (KML Network Link Service) があり、これを使うと、FME Server が公開するワークスペースの URL をネットワークリンクのリンク先として指定するだけで、Google Earth から FME Server にアクセスして変換結果が利用できるようになります。

ここでは、「HTML文書の取得と変換」に掲載した
防災科学技術研究所ウェブサイトから「Hi-net自動処理震源リスト」 (HTML) を取得し、任意のフォーマットでの出力が可能なテーブルに変換する
ワークスペースを再利用し、得られたフィーチャーに基づいて震源の位置を示すポイントデータを作成したうえで、KML 形式のファイルに出力するワークスペース例を掲げます。これを FME Server にアップロードし、KML Network Link Service として実行可能な設定をすると、Google Earth のネットワークリンクとして利用できます。

FME 2016.0.1.0 build 16174


FME ワークスペース例











Hi-netParser (カスタムトランスフォーマー): 「HTML文書の取得と変換」のワークスペース例と同じ処理を行う。
VertexCreator: 緯度 (Lat), 経度 (Long) に基づいてポイントを作成する。
CoordinateSystemSetter: 座標系を定義する。
StringFormatter x 2: 数値の書式 (小数部桁数) を整える。
KMLStyler: アイコンの色 (震源の深さ) とサイズ (マグニチュードの大小) を設定する。
OGCKML ライター: KML 形式で出力する。


結果: Hi-net自動処理震源リストに基づく震源分布 (2016年2月7日~8日15:00 頃の間に発生した地震)
FME Server (KML Network Link Service) の実行結果 = Google Earth のネットワークリンク
アイコン (円) の色は震源の深さ (赤:浅い-->青:深い)、サイズはマグニチュードの大小を表す。






















あらためて日本は地震の多い国だということが分かりますね。



「HTML文書の取得と変換」のワークスペースと同じ部分はひとつのカスタムトランスフォーマー (左端の緑色のトランスフォーマー) にしました。複数のプロジェクトや業務でも利用できそうなデータフローをこのようにカスタムトランスフォーマーとしてまとめておくと、再利用が容易になります。

既存のワークスペースのデータフローをカスタムトランスフォーマーとして再利用したこと以外には、このワークスペース例ではとりわけ珍しいことはしていません。出力先データセットのフォーマットを KML にすれば、FME Server の KML Network Link Service によって、変換結果をネットワークリンクとして提供できるということがポイントです。

この例では、FME Server がデータを蓄積したり管理したりする必要はありません。クライアント (Google Earth) からのリクエストがあったときにワークスペースを実行することによって外部 (防災科学技術研究所) のウェブサーバーからデータを取得して KML データに変換し、それをストリーミングします。

FME Server は HTTP 以外にもさまざまなプロトコルをサポートしており、ネットワークを介してあちこちに分散しているデータソースにアクセスし、ワークスペースを実行することによって目的に応じたスキーマ、フォーマットに変換することができます。上記ワークスペース例は、そのような能力の一端を示したものでもあります。

複数のシステムによって蓄積、更新されているデータを統合して運用する必要が生じた場合、既存のシステムを大幅に改良する、あるいは、統合するためのシステムを新たに開発するというアプローチではなく、FME Server を活用することによって、より低コスト、短期間で実現できる場合もあると思います。

FME Server にも無償評価版がありますので、ご興味のある方は是非お試しください。
FME Server 60-Day Free Trial

FME Server で実行するためのワークスペースを作成したりサーバーにアップロードしたりするには、FME Desktop (Workbench) も必要です。
Try FME Desktop

2016-02-03

GISからCADへの変換 - 基盤地図情報 (基本項目) 等高線

FME のユースケースの中でも、GIS と CAD の間のデータ変換は比較的多いものと思われます。
FME によるデータ変換の過程では、どのフォーマットについても共通のジオメトリモデルが適用されるので、空間データ自体の変換にあたってはフォーマットの違いを意識する必要はありません。しかし、図形の表現方法に関しては、データフローの中でユーザーがなんらかの処理を定義しなければならない場合があります。
ここでは、基盤地図情報 (基本項目) 等高線を 3D ラインに変換し、AutoCAD DWG 形式で出力する例を掲げます。

FME 2015.1.3.2 build 15575

ソースデータ
基盤地図情報ダウンロードサイトよりダウンロードした2次メッシュコード 513903, 513904, 513913, 513914 の4区画 (三宅島をカバーする範囲) の等高線データ
GML 形式 (ファイル名拡張子: .xml), ファイル名中に "Cntr" が含まれる。

FME ワークスペース例











GML リーダー: 基盤地図情報 (基本項目) 等高線データ (ライン) を読み込む。
3DForcer: 各ラインに標高 ("alti" 属性の値) を z 座標値として与えて 3D ラインに変換する。
Reprojector: JGD2011 平面直角座標第IX系に投影変換する。
DWGStyler: DWG 用の描画スタイル (この例ではラインの色) を設定する。
ACAD ライター: Autodesk AutoCAD DWG 形式のファイル (レイヤ名: Contour) に出力する。

結果: 三宅島の等高線 - AutoCAD DWG 形式, Autodesk DWG TrueView 2014 による 3D 表示
基盤地図情報 (基本項目) 等高線 2次メッシュ 513903, 513904, 513913, 513914 の4区画に基づき作成

















基盤地図情報 (基本項目) のデータは GML に準拠した XML ドキュメントです。FME には基盤地図情報の応用スキーマファイルが標準でバンドルされているので、GML リーダーで特別なパラメーター設定をせずにジオメトリと属性を読み込むことができます。ただし、基盤地図情報 (基本項目) に記述されているジオメトリは 2D なので、ワークスペース例では 3DForcer によって各ラインの z 座標値に標高 (alti 属性の値) を設定して 3D ラインに変換しました。

GIS では通常、空間データを格納するデータセットには、画面表示や印刷における図形の表現方法 (色、ハッチスタイルなど) に関する情報は含まれていないのに対して、CAD では、表現方法に関する情報も空間データと同じデータセットに格納されます (メジャーなデータフォーマットについての一般論であって、あらゆる GIS, CAD フォーマットがそうであるとは限りません)。

そのため、GIS データセットから CAD データセットへの変換処理においては、必要に応じて図形の表現方法が定義できなければならず、逆に CAD データセットから GIS データセットへの変換処理においては、図形の表現方法に関する情報のうち残したいものをフィーチャーの属性として抽出できる仕組みが必要です。

FME では、図形の表現方法に関してデータに記録されている情報をフォーマット属性 (Format Attributes) と呼ばれる属性のセットとして取り扱うことによって、それらを実現しています。

フォーマット属性の名前は、色などの多くのフォーマットに共通するものには接頭辞 "fme_" がつき、フォーマットによって異なる内容のものにはフォーマット固有の接頭辞 (例えば AutoCAD の場合は "autocad_") がつきます。FME はそれらのフォーマット属性を介して、図形の表現方法を定義/抽出することができます。

フォーマット属性は AttributeCreator 等で追加したり修正したりすることができますが、よく使われるフォーマットについては *** Styler という名前で、そのフォーマット用に表現方法を定義 (フォーマット属性を設定) するためのトランスフォーマーも用意されています。

ワークスペース例で使用した DWGStyler は AutoCAD DWG 形式用のトランスフォーマーで、ユーザーがパラメーターとして設定した色等の情報を fme_* 属性または autocad_* 属性に格納し、ACAD ライターは、それらの属性値に応じて適切な表現方法を適用したデータを出力先の DWG ファイルに出力します。

GIS と CAD の間のデータ変換では、図形の表現方法の定義/抽出がポイントになるかも知れません。行うべきことは個々の CAD フォーマットによって異なる部分がありますが、それらは各フォーマット (リーダー/ライター) のヘルプで調べることができます。