FMEでは、Fragmentation (断片化) と Flattening (平坦化) という2つの手法によって任意のXML文書からデータを抽出、変換することができます。
FME 2015.1.1.0 build 15515
=====
基盤地図情報「基本項目」等高線, 標高点データを Shapefile 形式に変換する。
ソースデータ:
基盤地図情報ダウンロードサービスサイトからダウンロードした「基本項目」等高線, 標高点データ (GML形式)
ダウンロードファイル名:
等高線: FG-GML-aaaaaa-Cntr-bbbbbbbb-cccc.xml
標高点: FG-GML-aaaaaa-ElevPt-bbbbbbbb-cccc.xml
aaaaaa は2次メッシュコード, bbbbbbbb は年月日, cccc は枝番
=====
FMEワークスペース例
[XML] リーダー: 基盤地図情報「基本項目」等高線、標高点データを読み込む。
GeometryReplacer: ジオメトリを記述しているXML文書の断片 (GML形式) に基づきジオメトリを作成する。
[SHAPE] ライター: Shapefile 形式のファイルに出力する。
注: 基盤地図情報の応用スキーマは FME に組み込まれており、基本項目は [GML] リーダーで読み込むことができますが、このワークスペース例では、断片化、平坦化の仕組みを示すために汎用の [XML] リーダーを使いました。
結果: FME Data Inspector による表示
次の簡単なXML文書を例として、Fragmentation (断片化) と Flattening (平坦化) について説明します。
<?xml version="1.0"?>
<dataset>
<Feature id="1">
<name>abc</name>
<position>
<x>139.878794000</x>
<y>35.764632528</y>
</position>
</Feature>
<Feature id="2">
<name>xyz</name>
<position>
<x>139.875861750</x>
<y>35.759115861</y>
</position>
</Feature>
</dataset>
Fragmentation (断片化): 特定の名前のXML要素を抽出し、それをルート要素とするXML文書を作成する。
上記例を Feature 要素について断片化すると、次の2つのXML文書が作成されます。断片化によって作成された個別のXML文書を fragment (断片) と呼びます。
<?xml version="1.0"?>
<Feature id="1">
<name>abc</name>
<position>
<x>139.878794000</x>
<y>35.764632528</y>
</position>
</Feature>
<?xml version="1.0"?>
<Feature id="2">
<name>xyz</name>
<position>
<x>139.875861750</x>
<y>35.759115861</y>
</position>
</Feature>
平坦化後の属性名は、XMLドキュメントツリーにおける上位から下位の順で、XML要素名・属性名をドット "." 区切りで連結した文字列となります。上記例を Feature 要素について断片化した後、さらに平坦化すると次のようなテーブルが得られます。
[XML] リーダーの基本的な機能は、パラメーターで指定された要素についてXML文書を断片化し、個々の断片をフィーチャーとして読み込むことです。さらにオプションとして、断片化した要素の平坦化や、断片内の下位のXML要素の断片化ができます。
ワークスペース例では、リーダーをワークスペースに追加する際、Add Reader 画面 Format フィールドで XML を選択した後、次のようにパラメーターを設定しました。
[XML] リーダーパラメーター設定画面
Configuration Type: Feature Paths (デフォルト)
[XML] リーダーの構成方法として他に xfMap, XRS ファイルによる方法もありますが、Feature Paths が推奨されています。
Elements to Match:
断片化するXML要素名を指定します。複数あるときはスペースまたは改行区切りで列挙します。
この例では、個々の等高線、標高点のデータが記述されているXML要素名 (等高線: Cntr, 標高点: ElevPt) を指定しました。
Flatten Options: Options ボタンクリック => XML Flatten Options 画面 (右上)
断片化したXML要素を平坦化する場合に Enable Flattening チェックボックスをチェックします。
=====
注: FME 2016 以降では、デフォルトで Enable Flattening チェックボックスがチェックされています。
=====
Descendant Options: Options ボタンクリック => XML Descendant Options 画面 (右下)
Elements to Match で指定したXML要素の下位のXML要素も断片化する場合に、そのXML要素名を指定します。複数あるときはスペースまたは改行区切りで列挙します。
この例では、GML形式でジオメトリが記述されているXML要素 (等高線: Curve, 標高点: Point) を断片化し、後述するように、それらに基づいて GeometryReplacer によってジオメトリを作成することとしました。
注: この例のように Elements to Match パラメーターで指定したXML要素 (Cntr, ElevPt) の下位にGML要素 (Curve, Point) がある場合は、上位の断片 (後述の "xml_fragment") に基づいて GeometryReplacer によってジオメトリを作成することもできますが、ここでは Descendant Options の働きを示すために Curve, Point 要素を断片化しました。
以上の設定をした後、Add Reader 画面 Dataset フィールドで基盤地図情報「基本項目」等高線、標高点データファイルを選択してリーダーを追加すると、キャンバスには Elements to Match で指定したXML要素名と同じ名前のフィーチャータイプが現れます。
XML リーダーフィーチャータイプ (左: 等高線, 右: 標高点)
平坦化オプションを指定したので、これらのフィーチャータイプの属性リストには下位のXML要素・属性に対応する属性が追加されました (Cntr.id, alti, など)。
"xml_fragment" 属性には、断片化されたXML文書 (Cntr, ElevPt をルート要素とする) が格納されます。
Descendant Options によって抽出される下位のXML要素の断片は "xml_fragment_<XML要素名>{}" という名前のリスト属性に格納されます。この例では次のとおりです。
等高線: xml_fragment_Curve{}
標高点: xml_fragment_Point{}
スキーマによっては同じ名前の下位XML要素が複数あることもあるので、下位の断片はそれらを要素とするリスト属性として抽出されます。この例ではリストの要素数は常に1です (各フィーチャーはジオメトリ要素をひとつずつ持つ)。
次に基盤地図情報「基本項目」等高線、標高点XML文書を抜粋して掲載します。[XML] リーダーによる断片化、平坦化の結果 (キャンバス上のフィーチャータイプ及びその属性リスト) と見比べて下さい。
青色の部分は Descendant Options の設定によって断片化される下位要素 (GML形式でジオメトリが記述されている部分) です。
----------
(基盤地図情報 等高線XML)
<?xml version="1.0" encoding="utf-8"?>
<Dataset xsi:schemaLocation="http://fgd.gsi.go.jp/spec/2008/FGD_GMLSchema FGD_GMLSchema.xsd"
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://fgd.gsi.go.jp/spec/2008/FGD_GMLSchema"
gml:id="Dataset1">
<gml:description>基盤地図情報メタデータ ID=fmdid:14-1001</gml:description>
<gml:name>基盤地図情報ダウンロードデータ(GML版)</gml:name>
<Cntr gml:id="K3_5035512870_1">
<fid>50355-12870-s-12800</fid>
<lfSpanFr gml:id="K3_5035512870_1-1">
<gml:timePosition>2014-09-01</gml:timePosition>
</lfSpanFr>
<devDate gml:id="K3_5035512870_1-2">
<gml:timePosition>2014-10-16</gml:timePosition>
</devDate>
<orgGILvl>25000</orgGILvl>
<loc>
<gml:Curve gml:id="K3_5035512870_1-g" srsName="fguuid:jgd2011.bl">
<gml:segments>
<gml:LineStringSegment>
<gml:posList>
35.752999472 139.875000000
35.752998472 139.875004472
(中略)
35.750000000 139.878976306
</gml:posList>
</gml:LineStringSegment>
</gml:segments>
</gml:Curve>
</loc>
<type>一般等高線</type>
<alti>2.5</alti>
</Cntr>
(以下 Cntr 要素の繰り返し)
</Dataset>
----------
(基盤地図情報 標高点XML)
<?xml version="1.0" encoding="utf-8"?>
<Dataset xsi:schemaLocation="http://fgd.gsi.go.jp/spec/2008/FGD_GMLSchema FGD_GMLSchema.xsd"
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://fgd.gsi.go.jp/spec/2008/FGD_GMLSchema"
gml:id="Dataset1">
<gml:description>基盤地図情報メタデータ ID=fmdid:14-1001</gml:description>
<gml:name>基盤地図情報ダウンロードデータ(GML版)</gml:name>
<ElevPt gml:id="K2_5035512873_1">
<fid>50355-12873-i-9</fid>
<lfSpanFr gml:id="K2_5035512873_1-1">
<gml:timePosition>2013-08-14</gml:timePosition>
</lfSpanFr>
<devDate gml:id="K2_5035512873_1-2">
<gml:timePosition>2014-10-16</gml:timePosition>
</devDate>
<orgGILvl>25000</orgGILvl>
<vis>表示</vis>
<pos>
<gml:Point gml:id="K2_5035512873_1-g" srsName="fguuid:jgd2011.bl">
<gml:pos>35.764632528 139.878794000</gml:pos>
</gml:Point>
</pos>
<type>標高点(測点)</type>
<alti>3</alti>
</ElevPt>
(以下 ElevPt 要素の繰り返し)
</Dataset>
----------
Descendant Options によって断片化した下位XML要素 (等高線: Curve, 標高点: Point) はGML形式なので、それに基づいて GeometryReplacer によってジオメトリを作成することができます。
GeometryReplacer パラメーター設定画面 (左: 等高線, 右: 標高点)
Fragmentation (断片化)、Flattening (平坦化) は XMLFragmenter, XMLFlattener トランスフォーマーによってデータフローの途中で行うこともできます。
XMLは汎用フォーマットであり、用途に応じて具体的なデータ構造 (スキーマ) が異なりますが、どのようなスキーマであってもこれらの仕組みを使うことにより、データを抽出、変換するためのワークスペースを作成することができます。
補足:
[XML] リーダーで平坦化をすると、デフォルトではフィーチャータイプとしたXML要素の全ての下位XML要素・属性がフィーチャー属性として抽出されますが、必要がない属性も多数含まれることがあります。
データフローのどこでも AttributeRemover/AttributeKeeper によって不要な属性は削除できますが、[XML] リーダーの Flatten Options では、初めから属性として抽出しない (無視する) 下位XML要素を指定することもできます。
Flatten Options の設定は、リーダーをワークスペースに追加した後でも、Navigator ウィンドウからパラメーター設定画面を開いて行うことができます。
XML Flatten Options 画面で Ignore Specific Sub-Elements (特定の下位要素を無視する) チェックボックスをチェックしたうえで、Sub-Elements To Ignore (無視する下位要素) フィールドに、フィーチャー属性として抽出しない下位XML要素名を列挙します。
-----
devDate fid lfSpanFr loc orgGILvl pos vis
-----
パラメーター設定画面をOKで閉じれば、これらのXML要素 (その下位要素を含む) はフィーチャー属性として抽出されなくなります。
ただし、パラメーターの設定を変更しただけでは、キャンバス画面上のリーダーフィーチャータイプは更新されず、その属性リストには抽出されない属性名も表示されたままです。
Workbench メニュー: Readers > Update Feature Types によって、パラメーターの設定内容を画面上のリーダーフィーチャータイプのインターフェースにも反映させることができます。
FMEワークスペース例: リーダーフィーチャータイプ更新後
0 件のコメント:
コメントを投稿