WeeklyAlteryxTips#44 ラインオブジェクトの厳密な比較について

Alteryx

Alteryxは空間分析が非常に簡単に行えます。また、処理の自動タスク化というのも非常に簡単です(そもそもAlteryxでワークフローを作った瞬間に自動タスク化は完了し、他のGISツールのように専用の自動化言語で自動化を行う必要はありません)。それだけではなく、Pythonなどの言語を使って行うような非常に高度な処理も可能です。

今回は、ラインオブジェクトが一致するかどうか、の判定について見ていきたいと思います。

IF文を使った一致判定について

空間オブジェクトも、IF文を使えば一致しているかどうかの比較ができます。基本的には形状が同じであれば一致していると判断したいところです。

今回は、あるポリラインから、逆順にポイントを打ったポリラインを作って比較してみましょう。以下のようなワークフローで簡単にポイントの順序を入れ替えたポリラインが作成できます。

閲覧ツールを使うと、詳細データを確認できます。確かに開始点、終了点が異なることがわかります。

地図上ではまったく同じようにプロットされています。

これを比較してみます。

IF [SpatialObj]=[SpatialObj_Reverse] THEN "True" ELSE "False" ENDIF

単純なIF文です。結果としては、

同じオブジェクトとして認識されました。

しかしながら、向きが違うラインはちゃんと違うものとして判断したい、ということもあるかと思います。このような場合にはST_MD5関数が使えます。

ST_MD5関数を使った比較

ST_MD5関数は空間オブジェクトのMD5ハッシュ値を取得する関数です。この関数を用い、MD5ハッシュ値を取得し比較すればオッケーです。

実際に先ほど同じものとして判定された2つのポリラインに対してMD5ハッシュ値を取得してみましょう。

確かに異なります!ですので、これで比較すれば異なるものとして認識できそうです。

ちなみに、MD5ハッシュは衝突困難性に問題があり現在ではあまり使われなくなっていますので、全く同じハッシュになる可能性が、、、ないとは言えないかもしれません。

テキスト型にして比較

さらに、空間オブジェクト型は中身はGeoJSON形式のテキストでしかないので、セレクトツールにてV_Stringなどのテキスト型に強制的に変更することができます。

これをそのままIF文で比較することもできます。

ポリゴンは?

いままでずっとポリラインについて言及してきましたが、ポリゴンではどうなるのでしょうか?

開始点を変えたポリゴンを作ろうとしましたが、中身は全く同じになり、当然MD5ハッシュも同じになってしまいました。開始点の決め方が決まっているようで、どのように作っても基本的に同じ形状であれば、同じ中身になっているようです(ちなみに、右回りなのか、左回りなのか、というところも、基本的にポリゴンの内部外側は右回りと決まっています。これはESRI社のShapeFileの決まり事です。ポリゴン内の穴の部分は、左回りになります(ポリゴンの外側になるので)すみません、なんか筆が滑って書いてしまったようで、ポリゴンの外側は右回り、穴の部分は左回りとなります)。

ということで、ポリゴンは普通にIF文で比較すれば事足りる、ということになります。

まとめ

  • ポリラインは内部的に持つポイントデータの順番に決まりがないようで、同じ形状に見えても中身のポイントの接続の順番が異なるケースがあります。これを比較する場合、IF文であれば見た目の形状レベルで判定が可能ですが、内部的なポイントの順番も考慮する場合はST_MD5関数もしくはテキストに変換して比較を実施してください
  • ポリゴンについては、どのような作り方をしても、常に同じように作成されるため、IF文による比較で問題有りません(ポイントも同じポイントは常に同じ単一の緯度経度ですね)。
  • マルチポイント、マルチポリゴン(1レコード内に複数のポリゴン、ポイントを格納している場合)は、どのような作り方をしても同じように作成されるためIF文での比較で問題ありませんが、マルチラインの場合はポリラインの場合と同じような比較方法となります。

サンプルワークフローダウンロード

次回

まだ簡単なTipsシリーズが続く予定です。

コメント

タイトルとURLをコピーしました