shapefile→CityGML変換時の汎用属性セットの付与方法について

480 views
Skip to first unread message

OH

unread,
Jan 18, 2022, 4:13:01 AM1/18/22
to FMEユーザーフォーラム
初めて投稿させていただきます。よろしくお願いいたします。

shapefileからCityGMLに変換を行う際の汎用属性セットの付与方法についてご助言をいただきたいです。

CityGMLに汎用属性セットタグ(genericAttributeSet)を追加し、その下の階層に汎用属性タグ(genericAttribute)を追加したいです。
AttributeManagerを用いて汎用属性タグ単体の追加はできていますが、上記のような階層構造の設定を行えるトランスフォーマーはありますでしょうか?


(Safe Software社のユーザーコミュニティサイトに、正にこれをお聞きしたいという質問が投稿されていたのですが、私の勉強不足で解決に至りませんでした)


以上、よろしくお願いいたします。

Takashi Iijima

unread,
Jan 25, 2022, 4:37:19 PM1/25/22
to FMEユーザーフォーラム
XMLTemplaterトランスフォーマーを使うことにより汎用属性セット (gen:genericAttributeSet) を構成するのが良いと思います。

XMLTemplaterは、入力フィーチャーが持っている属性などを使ってテンプレート式(正確にはXMLQuery式)によってXML文書(またはその断片: フラグメント)を作成するために良く使われるトランスフォーマーです。
例えば入力フィーチャーがattr1, attr2という属性を持っていて、それを汎用属性 stringAttribute として持つ汎用属性セットは、次のような式で汎用属性セットを構成することができます。

----------
declare namespace gen="http://www.opengis.net/citygml/generics/2.0";
<gen:genericAttributeSet name="属性セット">
    <gen:stringAttribute name="属性1">
        <gen:value>{fme:get-attribute("attr1")}</gen:value>
    </gen:stringAttribute>
    <gen:stringAttribute name="属性2">
        <gen:value>{fme:get-attribute("attr2")}</gen:value>
    </gen:stringAttribute>
</gen:genericAttributeSet>
----------

名前空間接頭辞 gen: を使うには、上記のように先頭部で名前空間の宣言 (declare文) が必要であることに注意してください。
declare文の代わりに、最も外側のXML要素(gen:genericAttributeSet)で次のように宣言しても良いです。

<gen:genericAttributeSet name="属性セット" xmlns="....">

xmltemplater-parameters.png

この設定で実行すると、出力フィーチャーの _result 属性にgen:genericAttributeSetが格納されます。
以上、お試しください。

2022年1月18日火曜日 18:13:01 UTC+9 OH:

Takashi Iijima

unread,
Jan 25, 2022, 4:42:13 PM1/25/22
to FMEユーザーフォーラム
誤記訂正
正確には「XMLQuery式」 -> 「XQuery式」が正です。

2022年1月26日水曜日 6:37:19 UTC+9 Takashi Iijima:

OH

unread,
Jan 26, 2022, 1:44:46 AM1/26/22
to FMEユーザーフォーラム
ご回答をいただきありがとうございます。
ご教示いただきました方法を試しましたところ、
出力フィーチャの要素”gen:stringAttribute [name=_result]"の値に
gen:genericAttributeSetを格納することができました。

要素”gen:stringAttribute [name=_result]"の値としてではなく、
同じ階層の要素としてgen:genericAttributeSetをセットする設定やトランスフォーマーはありますでしょうか?

よろしくお願いいたします。

2022年1月26日水曜日 6:42:13 UTC+9 Takashi Iijima:

Takashi Iijima

unread,
Jan 26, 2022, 10:07:51 AM1/26/22
to FMEユーザーフォーラム
すいません、「同じ階層の要素として」というのがどういうことを意味しているのかが理解できません。
もう少し具体的に前後関係と期待する結果についてご説明いただけないでしょうか。

2022年1月26日水曜日 15:44:46 UTC+9 OH:

OH

unread,
Jan 26, 2022, 8:00:09 PM1/26/22
to FMEユーザーフォーラム

入力フィーチャーがattr1, attr2, attr3  という属性を持っていて、通常の汎用属性とする属性がattr1、汎用属性セット内の汎用属性とする属性が attr2, attr3のデータを作成したいです。
具体的には次のような構造にしたいです。

<core:cityObjectMember>
 <gen:stringAttribute name="attri1">
  <gen:value>XXX</gen:value>
 </gen:stringAttribute>
 < gen:genericAttributeSet   name="汎用属性セット">
     <gen:stringAttribute name="attri2">
         <gen:value>YYY</gen:value>
     </gen:stringAttribute>
     <gen:stringAttribute name="attri3">
         <gen:value>ZZZ</gen:value>
     </gen:stringAttribute>
 </gen:genericAttributeSet>
</core:cityObjectMember>

ご教示いただいた方法での出力フィーチャは、次のように<gen:stringAttribute name="_result">の値に汎用属性が格納されるのですが、
<core:cityObjectMember>直下の要素として< gen:genericAttributeSet   name="汎用属性セット">を出力したいです。

<core:cityObjectMember>
 <gen:stringAttribute name="attri1">
  <gen:value>XXX</gen:value>
 </gen:stringAttribute>
 <gen:stringAttribute name="_result">
  <gen:value> 
   < gen:genericAttributeSet   name="汎用属性セット">
       <gen:stringAttribute name="attri2">
           <gen:value>YYY</gen:value>
       </gen:stringAttribute>
       <gen:stringAttribute name="attri3">
           <gen:value>ZZZ</gen:value>
       </gen:stringAttribute>
   </gen:genericAttributeSet>
  </gen:value>
 </gen:stringAttribute>
</core:cityObjectMember>

以上、よろしくお願いいたします。
2022年1月27日木曜日 0:07:51 UTC+9 Takashi Iijima:

Takashi Iijima

unread,
Jan 26, 2022, 10:57:49 PM1/26/22
to FMEユーザーフォーラム
XMLTemplaterはどのような階層構造でも作成できますので、次の式により、望ましい構造のcore:cityObjectMember要素を作成することができます。
入力フィーチャーが attr1, attr2, attr3 という名前の属性を持っているものとします。

declare namespace core="http://www.opengis.net/citygml/2.0";
<core:cityObjectMember>
    <gen:stringAttribute name="attr1">

        <gen:value>{fme:get-attribute("attr1")}</gen:value>
    </gen:stringAttribute>
    <gen:genericAttributeSet name="汎用属性セット">
        <gen:stringAttribute name="attr2">

            <gen:value>{fme:get-attribute("attr2")}</gen:value>
        </gen:stringAttribute>
        <gen:stringAttribute name="attr3">
            <gen:value>{fme:get-attribute("attr3")}</gen:value>
        </gen:stringAttribute>
    </gen:genericAttributeSet>
</core:cityObjectMember>

2022年1月27日木曜日 10:00:09 UTC+9 OH:

Takashi Iijima

unread,
Jan 26, 2022, 10:59:30 PM1/26/22
to FMEユーザーフォーラム
なんか式のレイアウトが変ですね。動作確認用のワークスペース例を添付しますので、そちらもご参照ください。

2022年1月27日木曜日 12:57:49 UTC+9 Takashi Iijima:
xmltemplater-example.fmw

OH

unread,
Jan 27, 2022, 7:26:18 PM1/27/22
to FMEユーザーフォーラム

頂いたワークスペースを確認させていただきました。
この方法ですと、出力フィーチャの<gen:stringAttribute name="_result">の値に汎用属性セットが格納されるのですが、
独立した要素として汎用属性セットを出力することは可能でしょうか。



2022年1月27日木曜日 12:59:30 UTC+9 Takashi Iijima:

Takashi Iijima

unread,
Jan 27, 2022, 8:04:00 PM1/27/22
to FMEユーザーフォーラム
もしかして、CityGMLライターでCityGMLデータセットを作成するときに汎用属性セットを追加しようとされていますか?
もしそうだとすると、前提条件が全く異なります。

CityGMLライターは汎用属性セットgen:genricAttributeSet、およびgen:stringAttribute以外の型の汎用属性の出力をサポートしていません。
汎用属性セットを含むCityGMLデータセットを作成したいときは、一旦、汎用属性セットのないCityGMLデータを作り、その後、XMLの操作によって汎用属性セットを適切な場所に追加してXMLを更新するというワークフローが考えられます。

2022年1月28日金曜日 9:26:18 UTC+9 OH:

OH

unread,
Jan 27, 2022, 8:40:18 PM1/27/22
to FMEユーザーフォーラム
>CityGMLライターでCityGMLデータセットを作成するときに汎用属性セットを追加しようとされていますか?
はい。そのようにしたいと考えておりました。
CityGMLライターでは汎用属性セットの出力をサポートしていないのですね。承知いたしました。

これまで、ご提示いただいたような方法で処理を2回に分けてデータを作成していたのですが、
1回の処理でデータを作成する方法がないかと思い、投稿させていただきました次第です。


諸々のご助言を頂きありがとうございました。理解が深まり大変助かりました。
今後ともよろしくお願い申し上げます。

2022年1月28日金曜日 10:04:00 UTC+9 Takashi Iijima:

Takashi Iijima

unread,
Jan 27, 2022, 8:48:44 PM1/27/22
to FMEユーザーフォーラム
プロセスとしては2段階ですが、それをひとつのワークスペースとして実装することはできると思います。

2022年1月28日金曜日 10:40:18 UTC+9 OH:

OH

unread,
Jan 27, 2022, 9:12:40 PM1/27/22
to FMEユーザーフォーラム
ライターで出力したCityGMLに対し、XMLの操作ができるのでしょうか?
ライター出力後のデータを同じFMW内で操作することはできないと思い込んでおりましたので、方法がありましたら是非教えていただきたいです。


2022年1月28日金曜日 10:48:44 UTC+9 Takashi Iijima:

Takashi Iijima

unread,
Jan 27, 2022, 9:41:02 PM1/27/22
to FMEユーザーフォーラム
FeatureWriterトランスフォーマーを使うと、通常のライターと同じ機能をワークフローの途中に組み込むことができます。
このケースでは、FeatureWriterで一旦属性のないCityGMLデータセットを出力し、それが終わってからXMLの操作によって属性を追加するというワークスペースが考えられます。

ただ、それが良いことなのかどうかは、品質管理の側面からも検討する必要はあると思います。
昨年度の例では、属性まで含めた完成形にしてから品質検査というアプローチが多かったと思いますが、特に属性の部分で検査が十分にできていないデータがたくさんありました。
品質検査を確実にするために、次のようなプロセスで行うのが望ましいということもあると思います。

(1) 建物形状だけのCityGMLの作成
(2) 属性だけのXMLの作成
(3) それらの個別の検査
(4) (1), (3) を合成して完成


2022年1月28日金曜日 11:12:40 UTC+9 OH:

OH

unread,
Jan 30, 2022, 10:08:12 PM1/30/22
to FMEユーザーフォーラム
FeatureWriterトランスフォーマーにつきましてご教示いただきありがとうございます。
早速試してみたいと思います。

属性を含めた品質検査につきましてはこちらでも課題として捉えており、
現状は完成したCityGMLに対しプログラムを用いて属性の整合確認をするようにしております。
先に属性だけのXMLを作成・検査した後に合体する手順も参考にさせていただき、より確実に検査を実施できるデータの作成方法を検討したいと思います。


2022年1月28日金曜日 11:41:02 UTC+9 Takashi Iijima:
Reply all
Reply to author
Forward
0 new messages