2017-07-29

国土数値情報ベクターデータ(GML)の読込

国土数値情報ダウンロードサービスサイトで公開されているデータのうち、GML形式(JPGIS2.1準拠)のベクターデータ(点、線、面)を読み込むためのカスタムトランスフォーマー JpKsjVectorReader を FME Hub で公開しました。

今回は、このカスタムトランスフォーマーの基本的な使用方法を示すワークスペース例を掲げます。

FME Hub で公開されているカスタムトランスフォーマーは、通常のトランスフォーマーと同じ操作(Quick Add または Transformer Gallery からのドラッグ・アンド・ドロップ等)によって編集中のワークスペースに追加できます。ただし、ワークスペース編集に使用している FME Workbench のバージョンが当該カスタムトランスフォーマー作成時のバージョン以降であること、および、少なくとも初回はインターネットに接続していることが必要です。JpKsjVectorReader は FME 2017.0.1.1 で作成しました。

2017-08-02: FME Hub の JpKsjVecotorReader を更新しました。更新理由、内容については、本文後の「2017-08-02 更新について」で説明します。


FMEワークスペース例1: 国土数値情報「行政区域」データ読込 (FME 2017.0.1.1 build 17291)






Creator: 処理開始用のフィーチャーを1個作成、出力します。

JpKsjVectorReader: 次のようにパラメーターを設定することによって、国土数値情報「行政区域」データを読み込み、行政区域の範囲(面)を表すジオメトリと、その区域の主題属性を保持した "xml_fragment" 属性(地物クラスXML要素をルートとするXML断片)をもつフィーチャーを出力します。

  • KSJ Vector Dataset (GML): <国土数値情報ダウンロードサービスサイトからダウンロードした「行政区域」データ解凍後の *.xml ファイルパス、または、解凍前の *.zip ファイルパス。複数可>
  • Feature Types to Read: AdministrativeBoundary <「行政区域」データの「製品仕様書」で規定されている地物クラスのXML要素名>

JpKsjVectorReader パラメーター設定画面(行政区域)















国土数値情報の「製品仕様書」は、国土数値情報ダウンロードサービスサイトにおけるデータの種類別の説明ページ「データフォーマット(符号化)」の項で公開(PDF文書にリンク)されています。

XMLFlattener: "xml_fragment" 属性の値(地物クラスXML要素をルートとするXML断片)を平坦化して、個別の属性を抽出します。詳細は後述します。

Inspector: 変換終了後、全てのフィーチャーを FME Data Inspector で表示します。ベクタージオメトリの保存をサポートするデータフォーマットのライターをワークスペースに追加し、Inspector の代わりにライターのフィーチャータイプをここに接続すれば、そのフォーマットの「行政区域」データセットが作成できます。

国土数値情報「行政区域」データ変換結果: 平成29年度, 四国4県(徳島県, 香川県, 愛媛県, 高知県)
FME Data Inspector による表示(背景: Esri ArcGIS Online Map Service - World Light Gray Base)。




















XMLFlattener による属性の抽出

KsjVectorReader が出力するフィーチャーは、地物クラスのXML断片を "xml_fragment" 属性として持っているので、それを XMLFlattener によって平坦化することにより、下位のXML要素/属性に記述されている内容をフィーチャーの属性として抽出することができます。XMLの断片化 (fragmentation)、平坦化 (flattening) については「XMLの読込 - 断片化と平坦化」もご参照ください。

国土数値情報「行政区域」AdministrativeBoundary クラスXML要素(XML断片)の例
<?xml version="1.0" encoding="UTF-8"?>
<ksj:AdministrativeBoundary xmlns:ksj="http://nlftp.mlit.go.jp/ksj/schemas/ksj-app" xmlns:gml="http://www.opengis.net/gml/3.2" gml:id="gy0">
<ksj:bounds xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sf0"/>
<ksj:prefectureName>愛媛県</ksj:prefectureName>
<ksj:subPrefectureName/>
<ksj:countyName/>
<ksj:cityName>松山市</ksj:cityName>
<ksj:administrativeAreaCode codeSpace="AdministrativeAreaCode.xml">38201</ksj:administrativeAreaCode>
</ksj:AdministrativeBoundary>

このXML断片を平坦化すると、次の表に掲げる属性が抽出されます。

国土数値情報「行政区域」フィーチャーの属性
参考: 国土数値情報(行政区域)製品仕様書 第 2.3 版(平成28年3月 国土交通省国土政策局)
属性名 内容 備考
AdministrativeBoundary.id フィーチャーID //ksj:AdministrativeBoundary/@gml:id
bounds.href 範囲(面)を表すジオメトリのID 参照先の //gml:Surface/@gml:id
prefectureName 都道府県名
subPrefectureName 支庁・振興局名 北海道の支庁・振興局の名称
countyName 郡・政令都市名
cityName 市区町村名
administrativeAreaCode 行政区域コード JIS X 0401, JIS X 0402
注: 大正9年時点のデータは、上記の他に次の2つの属性を持ちます。
  • formationDate.TimeInstant.timePosition (成立年月日)
  • disappearanceDate.TimeInstant.timePosition (消滅年月日)

上記のような平坦化を行うための XMLFlattener のパラメーター設定は、次のとおりです。
  • XML Source Type: Attribute with XML document
  • XML Attribute: xml_fragment
  • Elements to Match: AdministrativeBoundary
  • Attributes to Expose: <平坦化によって抽出される属性のうち、Workbench のインターフェース上に現す必要があるものの名前。上の表の全ての属性名を現す必要はなく、後続のトランスフォーマー等で利用したい属性だけで構いません>

XMLFlattener パラメーター設定画面




















FMEワークスペース例2: 国土数値情報「河川」データ読込 (FME 2017.0.1.1 build 17291)










JpKsjVectorReader: 国土数値情報「河川」データでは、1つのデータセット(ファイル)に2つの地物クラス: Stream (流路) と RiverNode (河川端点) のデータが記述されています。どちらも同時に読み込む場合には、JpKsjVectorReader の Feature Types to Read パラメーターに、空白類文字(半角スパース、タブ、または改行)区切りでそれらを列挙します。

JpKsjVectorReader パラメーター設定画面(河川)















FeatureTypeFilter: 地物クラス名(Stream, RiverNode) はフィーチャータイプ名("fme_feature_type" 属性の値)として扱われるので、JpKsjVectorReader が出力するフィーチャーは、FeatureTypeFilter によって地物クラス(フィーチャータイプ)別のデータフローに振り分けることができます。

XMLFlattener: その後、前述の行政区域と同様に XMLFlattener で属性を抽出します。

国土数値情報「河川」データ変換結果: 四国4県(徳島県, 香川県, 愛媛県, 高知県)流路のみ表示
FME Data Inspector による表示(背景: Esri ArgGIS Online Map Service - World Light Gray Base)。



















XMLFlattener による属性の抽出方法は、行政区域の場合と同じです。以下、Stream, RiverNode クラスのXML断片(例)と、それを平坦化することによって得られる属性の一覧表を掲げます。

国土数値情報「河川」 Stream (流路) クラスXML要素(XML断片)の例
<?xml version="1.0" encoding="UTF-8"?>
<ksj:Stream xmlns:ksj="http://nlftp.mlit.go.jp/ksj/schemas/ksj-app" xmlns:gml="http://www.opengis.net/gml/3.2" gml:id="r-3700001">
<ksj:waterSystemCode codeSpace="WaterSystemTypeCode.xml">880807</ksj:waterSystemCode>
<ksj:location xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#c-3700001"/>
<ksj:riverCode codeSpace="RiverTypeCode.xml">8808070000</ksj:riverCode>
<ksj:sectionType>0</ksj:sectionType>
<ksj:riverName>宮川</ksj:riverName>
<ksj:originalDataType>2</ksj:originalDataType>
<ksj:flowDirection>1</ksj:flowDirection>
<ksj:startRiverNode xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#t-3701506"/>
<ksj:endRiverNode xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#t-3701551"/>
<ksj:startStreamNode xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#t-3701506"/>
<ksj:endStreamNode xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#t-3701504"/>
</ksj:Stream>

国土数値情報「河川」 Stream (流路) フィーチャーの属性
参考: 国土数値情報(河川)製品仕様書 第 3.1 版(平成24年3月 国土交通省国土政策局)
属性名 内容 備考
Stream.id フィーチャーID //ksj:Stream/@gml:id
waterSystemCode 水系域コード
location.href 場所(線)を表すジオメトリのID 参照先の //gml:Curve/@gml:id
riverCode 河川コード
sectionType 区間種別コード
riverName 河川名
originalDataType 原点資料種別コード
flowDirection 流下方向判定
startRiverNode.href 河川始点 河川の始点に該当する河川端点フィーチャーのID
endRiverNode.href 河川終点 河川の終点に該当する河川端点フィーチャーのID
startStreamNode.href 流路始点 流路の始点に該当する河川端点フィーチャーのID
endStreamNode.href 流路終点 流路の終点に該当する河川端点フィーチャーのID


国土数値情報「河川」 RiverNode (河川端点) クラスXML要素(XML断片)の例
<?xml version="1.0" encoding="UTF-8"?>
<ksj:RiverNode xmlns:ksj="http://nlftp.mlit.go.jp/ksj/schemas/ksj-app" xmlns:gml="http://www.opengis.net/gml/3.2" gml:id="t-3601133">
<ksj:waterSystemCode codeSpace="WaterSystemTypeCode.xml">880807</ksj:waterSystemCode>
<ksj:position xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#p-3601133"/>
<ksj:elevation>289</ksj:elevation>
</ksj:RiverNode>

国土数値情報「河川」 RiverNode (河川端点) フィーチャーの属性
参考: 国土数値情報(河川)製品仕様書 第 3.1 版(平成24年3月 国土交通省国土政策局)
属性名 内容 備考
RiverNode.id フィーチャーID //ksj:RiverNode/@gml:id
waterSystemCode 水系域コード
position.href 地点を表すジオメトリのID 参照先の //gml:Point/@gml:id
elevation 標高


地物クラスのXML要素名(フィーチャータイプ名)やその下位のXML要素/属性名は「製品仕様書」で規定されていますが、階層構造を持っている属性については全ての子孫要素名や構造が分からない場合があり、また、あってはならないことなのですが、現実には「製品仕様書」で規定されている符号化規則と実際のデータの記述形式が矛盾している場合もあります。

そのため、 JpKsjVectorReader や XMLFlattener のパラメーターの設定にあたっては、「製品仕様書」を調べるだけでなく、データ本体をテキストエディタで開く等により、実際のデータに記述されているXML要素/属性名や階層構造も確認することをお勧めします。

「製品仕様書」とデータの記述形式の間の矛盾に関しては、データの不具合と思われるケースと「製品仕様書」の誤記と思われるケースの両方がありますが、FMEはデータしか読みませんので、前者(データの不具合)であったとしても、データが修正されない限りは、データの記述形式の方に合わせてワークスペースを構成する必要があります。

ただし、以下に掲げるデータ不具合の修復については、JpKsjVectorReader が自動的に行います。
  1. gml:Point 要素下位の gml:position は gml:pos とみなす(GMLスキーマでは、座標を記述するXML要素名は "gml:pos" が正)。
  2. gml:OrientableCurve/gml:baseCurve/@xlink:href の値と一致するIDをもつ gml:Curve 要素が見つからなかった場合、サフィクス _* を削除したIDによってリトライする。
今後、新たに自動修復可能なデータの不具合を発見したときは、修復機能を追加して JpKsjVectorReader を更新する方針です。


2017-08-02 更新について

国土数値情報(GML形式)のXML文書では、ジオメトリを記述するGML要素(gml:Point, gml:Curve, gml:Surface) と地物クラスXML要素 (例えば、行政区域であれば ksj:AdministrativeBoundary) は同一の階層レベルで記述されており、地物クラスXML要素に属する特定の子要素の xlink:href 属性によって、地物のジオメトリを表すGML要素を参照する仕組みとなっています。

例えば、次の行政区域XML要素は、bounds 要素 xlink:href 属性の値 "#sf0" によって、同一文書内の他の場所に記述されている特定の gml:Surface 要素を参照し、そのジオメトリと結合することができます。

<?xml version="1.0" encoding="UTF-8"?>
<ksj:AdministrativeBoundary xmlns:ksj="http://nlftp.mlit.go.jp/ksj/schemas/ksj-app" xmlns:gml="http://www.opengis.net/gml/3.2" gml:id="gy0">
<ksj:bounds xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sf0"/>
<ksj:prefectureName>愛媛県</ksj:prefectureName>
<ksj:subPrefectureName/>
<ksj:countyName/>
<ksj:cityName>松山市</ksj:cityName>
<ksj:administrativeAreaCode codeSpace="AdministrativeAreaCode.xml">38201</ksj:administrativeAreaCode>
</ksj:AdministrativeBoundary>

国土数値情報では、GML形式のデータの公開開始以来、多くのデータで、xlink:href 属性によってGML要素を参照するためのXML要素の名前として
  • position (gml:Point を参照)
  • location (gml:Curve を参照)
  • bounds (gml:Surface を参照)
が使われてきました。このことについての関連文書はない(あったとしても現在は公開されていない)ものの、事実上の共通仕様であると考えることができました。

そのため、当初の JpKsjVectorReader では、上記3種の要素名 + 既知の例外 are (gml:Surface を参照) のみをサポートし、もしその他の例外があった場合には、発見した時点で拡充していく方針としていました。

しかし、近年のデータをいくつか調べたところ、例外的な要素名が予想以上の頻度で見つかりました(例: 都市公園データでは loc で gml:Point を参照、バスルートデータでは brt で gml:Curve を参照)。最近は、場当たり的にジオメトリ参照用のXML要素名が決定されているように見受けられます。

ジオメトリ参照用のXML要素名としてどんな名前が現れるか予測不能であるだけでなく、例外的な名前が現れる頻度も高いと思われることから、発見した時点で拡充していくという方針を改め、今回の更新によって、ワークスペースの作成者が、読み込もうとするデータで実際に使われているジオメトリ参照用のXML要素の名前を指定できるよう、以下のパラメーターを追加しました。

パラメーター名設定内容初期設定値
Elements to Refer Point点ジオメトリ参照用のXML要素の名前position
Elements to Refer Curve線ジオメトリ参照用のXML要素の名前location
Elements to Refer Surface面ジオメトリ参照用のXML要素の名前bounds

ジオメトリ参照用のXML要素名は、データの種類別に「製品仕様書」(符号化規則)で規定されています。また、データ本体(XML文書)をテキストエディタ等で開き、内容を直接確認することもできます。

例えば、点ジオメトリ参照用のXML要素名が loc であるデータを読み込む場合は、Elements to Refer Point パラメーターに loc を設定してください。

これらのパラメーターには、空白類文字(半角スペース、タブ、改行)で区切ることにより、それぞれ複数のXML要素名を同時に指定することもできます。例えば、複数の異なる種類のデータを連続して読み込む場合で、ジオメトリ参照用のXML要素の標準的な名前(初期設定値: position, location, bounds)と既知の例外的な名前(loc, brt, are)が全て現れるのであれば、次の図ように設定します。





















また、これらのパラメーターのうち、読み込もうとするデータ内には存在しないことが明らかなジオメトリの種類(点、線、または面)に対応するものの設定は省略できます。ただし、これらの3パラメーターの設定を全て省略した場合は、このトランスフォーマーはデータを読み込まず、入力フィーチャーを <Rejected> ポートから出力します。

2017-07-18

歩行空間ネットワークのジオメトリ作成

G空間情報センターで公開されている「歩行空間ネットワークデータ」(CSV形式)に基づいて、ネットワークのノードを表すポイントと、ノード間のリンクを表すラインを作成するFMEワークスペース例を紹介します。

ソース 1:(東京都)台東区データ「ノード情報.csv」
1行1ノードで、ノードID (ユニークな識別子)、緯度、経度、高さ、その他の属性が記述されています。緯度、経度は特殊な書式(緯度: DD.MM.SS.SS, 経度: DDD.MM.SS.SS)で記述されているので、ジオメトリ(ポイント)を作成するには、それぞれ十進度に変換する必要があります。「高さ」は標高ではなく、屋内の場合は階層数を示す値(中間階は *.5)、屋外の場合は0です。













ソース 2:(東京都)台東区データ「リンクの情報.csv」
1行1リンクで、リンクID (ユニークな識別子)、起点ノードID、終点ノードID、その他の属性が記述されています。位置情報は記述されていないので、ジオメトリ(ライン)を作成するには、起点/終点ノードIDと一致するノードIDを持つノード情報を参照する必要があります。













変換結果: (東京都)台東区データ - 浅草寺付近のノード (ポイント) とリンク (ライン)
FME Data Inspector による表示。背景は地理院地図「標準地図」です。



















FMEワークスペース例 (FME 2017.0.1.1 build 17291)

1. ノードのジオメトリ(ポイント)作成












ノードの座標(緯度、経度)と「高さ」に基づいて VertexCreator によって3Dポイントジオメトリ (Z=「高さ」) を作成することができますが、ソースデータに記述されている座標の書式が特殊(緯度: DD.MM.SS.SS, 経度: DDD.MM.SS.SS)であるため、事前に十進度に変換する必要があります、この例では、StringSearcher (2個) と AttributeManager を使ってそれを行いました。

StringSearcher x 2: 次の正規表現によって、緯度/経度文字列から度、分、秒の3数値を抽出して _lat{}.part (緯度), _lon{}.part (経度) リストに格納します。

正規表現: ^(\d+)\.(\d+)\.(.+)$

注: 日本語版Windowsでは、バックスラッシュ \ を半角¥記号に読み替えてください。


リストの要素格納される値
_lat{0}.part緯度
_lat{1}.part
_lat{2}.part
_lon{0}.part経度
_lon{1}.part
_lon{2}.part

StringSearcher パラメーター設定画面 (左: 緯度, 右: 経度)















AttributeManager: 緯度、経度の値として次の式を Arithmetic Editor (数式エディタ) で入力することにより、実行時に、それらの値が式の計算結果(十進度)で置き換えられます。

緯度: @Value(_lat{0}.part)+@Value(_lat{1}.part)/60.0+@Value(_lat{2}.part)/3600.0
経度: @Value(_lon{0}.part)+@Value(_lon{1}.part)/60.0+@Value(_lon{2}.part)/3600.0

注: "@Value(属性名)" は、実行時に属性の値を抽出するための式であり、エディタ左側のペインの Feature Attributes セクションに表示されている属性名のダブルクリック、あるいは、ドラッグ・アンド・ドロップによって編集中の式に挿入することができます。リストの個別の要素({ } 内でインデクスを指定したもの)は、属性名として取り扱われます。

注: DecimalDegreesCalculator トランスフォーマーによって、度、分、秒から十進度への換算を行うこともできます。

AttributeManager パラメーター設定画面














VertexCreator: 十進度に変換済みの緯度、経度、および高さに基づいて3Dポイントジオメトリを作成します。


2. リンクのジオメトリ(ライン)作成
リンク情報フィーチャーは多数の属性を持っていますが、下図では、説明上必要な属性のみを現しています。

















FeatureMerger: CSVリーダーで読み込んだリンク情報フィーチャーに、その「起点ノードID」と一致する「ノードID」を持つノードフィーチャー(属性とジオメトリ=起点ノードのポイント)を結合します。

FeatureMerger_2: 起点ノード結合後のリンク情報フィーチャーに、その「終点ノードID」と一致する「ノードID」を持つノードフィーチャー(属性のみ)を結合します。

VertexCreator_2: 終点ノード結合後のリンク情報フィーチャーのジオメトリ(起点ノードのポイント)に、終点ノードのポイントを追加し、リンクのジオメトリ(起点ノードと終点ノードを結ぶライン)に変換します。

FeatureMerger は、Supplier フィーチャーの属性のみを Requestor フィーチャーに結合するために使うことが多く、Feature Merge Type パラメーターの初期設定は "Attributes Only" (属性のみ) となっていますが、それを "Attributes and Geometry" (属性とジオメトリ) に変更することにより、属性とあわせてジオメトリも結合できるようになります(結合先の Requestor フィーチャーがジオメトリを持っていた場合には、Supplier のジオメトリに置き換えられます)。

また、Accumulation Mode パラメーターを "Prefix Supplier" に設定することにより、Supplier フィーチャーの属性名に "Prefix" で指定した接頭辞(プレフィクス)を付加してから結合することができます。この例では、起点ノードを結合するときに「起点」、終点ノードを結合するときに「終点」を接頭辞として付加しました。


歩行空間ネットワークデータのノードは「高さ」(標高ではなく、階層数を示す値)を持っているので、上記ワークスペース例のように、リンクのジオメトリを3Dライン (Z=「高さ」) として作成することにより、起点と終点の座標(緯度、経度)が等しく、「高さ」が異なる鉛直のリンク(例: エレベーター)も表現できます。

しかし、今回使用した台東区データでは、起点と終点の座標が等しく、「高さ」も等しいリンクが10箇所ありました。このデータを業務で利用しようとするならば、「高さ」も含めて起点と終点が一致するリンクが何を意味するのか追求しなければなりませんが、FMEケーススタディとしてはここまでとします。

2017-07-13

複数のExcel単票から一覧表への変換

ここ数年、ウェブ上で公開される統計データの種類と量は急速に拡大してきました。製本された統計表を購入したり図書館で閲覧したりしなければならなかった頃を思うと、隔世の感を覚えます。

主要な政府統計は e-Stat (政府統計の総合窓口) で検索、閲覧、ダウンロードできますが、ダウンロードできるデータのうちExcel形式のものは、主に印刷物の形態で統計表を公開していた時代の名残なのでしょうか、印刷用に体裁が整えられているために、そのままではデータとして利用するのが難しいことがあります。

「神エクセル」というネットスラングがあるそうですが、その伝で言えば、e-Statで提供されているExcelデータにはかなり神がかっているものもあり、作成者も利用者も無用な労力=コストの支出を強いられているように思います。「働き方改革」が求められている昨今ですが、統計表に限らず、あらゆる文書について過度に体裁を整えるのを止めるだけでも、労働生産性の向上にかなり寄与できるのではないでしょうか。

また、印刷製本が必要だとしても、そのために体裁を整える作業はプロの印刷業者に任せれば良いことであって、その点では素人の公務員が手間ひまをかけるのは、非常にもったいないことであるとも思います。

閑話休題。印刷用の体裁にこだわるあまり、データとしては利用しにくいExcelワークシートでも、その「こだわり方」に規則性があるならば、FMEによって単純なテーブルに変換するのは容易かも知れません。

例えば、e-Statで公開されている「電力需要調査」(資源エネルギー庁)統計表 "kekka.xls" には、1四半期あたり1ワークシートの単票により、平成12年第2四半期から平成23年第1四半期までの44期分の調査結果 (ただし「高圧」は平成16年第2四半期以降) が収録されています (2017-07-13現在)。

ソース: e-Stat 電力需要調査結果「単票」 (1ブック, 44期分44ワークシート)
見るからに印刷用の様式です。ブック全体では、特別高圧: 9セル x 44期 (シート)  = 396セル, 高圧: 9セル x 28期 = 252セルにデータが記入されています。

















およそ10年分のデータが公開されているので、時系列での変動状況を知りたくなります。需要家別、項目別にデータを時系列で整理した一覧表があれば、項目ごとの変動状況を折れ線グラフ等で表現することはExcelの機能を使って簡単にでき、一目で変動状況が把握できますが、44ワークシートから必要なデータをひとつずつコピー・アンド・ペーストして一覧表を作成しなければならないとなると、気が滅入ります。

しかし、幸いなことに、44ワークシートは全て同じ様式で、データ項目ごとの記述先のセルの位置は決まっており、また、調査年・四半期が識別できるようにワークシート名の書式も統一されています。これならば、FMEによって、全てのデータ項目について時系列で整理した一覧表を一気に作成することができます。

ここでは、特別高圧、高圧の別に、全四半期の調査結果を時系列で整理した一覧表(Excelワークシート)に変換するワークスペース例を掲げます。結果は、次のようなテーブルになります。

変換結果: 電力需要調査結果「一覧表」 (1ブック, 2ワークシート:「特別高圧」「高圧」)
書式(フォントの種類・サイズ、数値の桁区切り・小数部桁数、列幅、罫線)は、変換後にExcelによって設定しました。この程度の書式設定ならば、1~2分もあれば誰にでもできることであり、仮に公開するとしても、これで十分であると考えます。
















FMEワークスペース例 (FME 2017.0.1.1 build 17291)

【ステップ1】





















[XLSXR] (Excel) リーダー: 電力需要調査結果Excelブック "kekka.xls" の全てのワークシートから、それぞれ 5~10 行目を読み込みます。それを行うためのパラメーターの設定は、次の [1]~[3] のとおりです。

[1] Excelリーダーをワークスペースに追加するとき、リーダーのパラメーター設定画面でワークシートをひとつ(図の例では「H12.4~6」)だけ選択し、フィールド名の行 (Field Names Row) の指定を解除します。これにより、Excelの列名 A, B, C, ... が各列のセルの値を格納する属性の名前となります。

ここで全てのワークシートを選択することもできますが、そうすると、全ワークシートについて、ひとつずつ Field Names Row の指定を解除しなくてはなりません。それは手間なので、ここではひとつのワークシートだけで設定を行い、後述するように、リーダーをワークスペースに追加した後で、全ワークシートを選択し直すことにしました。







































[2] 上記のパラメーター設定によってリーダーをワークスペースに追加した後、キャンバスに現れたフィーチャータイプで次の設定をします。

  • Merge Feature Type をチェック(任意のフィーチャータイプ名=ワークシート名を受け入れる)
  • Table セクションの Start Row, End Row で読込開始、終了行番号を指定
  • Format Attributes (フォーマット属性) タブで "fme_feature_type" (フィーチャータイプ名=ワークシート名を格納する属性) と "xlsx_row_id" (行番号を格納する属性) を現す (Expose)



























[3] そして、リーダーの Feature Types to Read (読み込むフィーチャータイプ) パラメーターで全てのフィーチャータイプ(ワークシート)を選択します。以上の設定により、実行時には、全てのワークシートの 5~10行目 が読み込まれることになります。

















TestFilter: 行番号 ("xlsx_row_id" の値) に応じて、フィーチャー(レコード)を「産業用」(5, 8行)、「業務用」(6, 9行)、「計」(7, 10行)に振り分けます。

AttributeRenamer x 3: TestFileter による振り分け先に応じて、C(販売電力量)、D(販売額)、E(単価)の属性名を変更します。

Aggregator: "fme_feature_type"(フィーチャータイプ名=入力ワークシート名=調査期)と "A"(需要家: 「特別高圧」または「高圧」)の組み合わせが同じフィーチャーを集約します。

ここまでで、需要家(出力先ワークシート)別に、調査期(出力先行)単位で [産業用, 業務用, 計] x [販売電力量, 販売額, 単価] 9項目のデータを属性として持つフィーチャーに変換されました。


【ステップ2】
















StringSearcher: "fme_feautre_type"(フィーチャータイプ名=入力ワークシート名)から「和暦年」と「四半期開始月」(1, 4, 7, 10)を抽出します。

AttributeManager: 入力ワークシート名から抽出した「和暦年」と「四半期開始月」に基づき、「西暦年」と「四半期番号」(1, 2, 3, 4)を求めるとともに、以後の処理では使わない属性を削除します。

AttributeManager パラメーター設定画面






































Sorter: フィーチャーの出力順を調査期(年、四半期番号)の昇順にします。

[XLSXW] (Excel) ライター: 需要家(属性A:「特別高圧」と「高圧」)別のワークシートに振り分けてフィーチャーを出力します。「年-四半期」列には、AttributeManager で作成した「西暦年」と「四半期番号」の値を含む文字列 "<yyyy>-Q<n>" (yyyy: 年, n: 四半期番号)を作成して出力しました。

ワークスペースの実行結果は、冒頭に示した変換結果: 電力需要調査結果「一覧表」のとおりです。