ファジー最小粗共通分割アルゴリズム


9

形状の2つの異なるパーティション(引数として、国の2つの異なる行政区画)が与えられた場合、これらのパーティションの両方が適合する新しいパーティションを見つけて、いくつかのエラーを許容(および最適化)するにはどうすればよいですか?

たとえば、エラーを無視して、これを行うアルゴリズムが必要です。

非ファジーバージョン

おそらく、これを一定の条件で表現すると役立ちます。次の番号を使用します。

上記のパーティションは次のように表現できます。

A = {{1}、{2}、{3,4,7,8}、{5}、{6}、{9,10,13,14}、{11}、{12}、{15} 、{16}}

B = {{1,2,5,6}、{3}、{4}、{7}、{8}、{9}、{10}、{13}、{14}、{11,15} 、{12、16}}

ドットB = {{1,2,5,6}、{3,4,7,8}、{9,10,13,14}、{11,15}、{12,16}}

そして、AドットBを生成するアルゴリズムは単純に見えます(2つの要素がA(B)で一緒にパーティションにある場合、B(A)にあるパーティションをマージします-AとBが等しくなるまで繰り返します)。

しかし、これらの行の一部が2つのパーティション間でわずかに異なるため、この完全な答えは不可能であると想像してください。代わりに、いくつかのエラー基準を最小限に抑えて最適な答えを求めています。

新しい例を見てみましょう:

ここの左側の列には、共通の線のない2つのパーティションがあります(外側の境界自体は別です)。上記の種類の唯一の可能な解決策は、ささいな解決策、右の列です。しかし、「ファジー」ソリューションを許可する場合、中央の列は許容される可能性があり、たとえば、総面積の5%が競合します(つまり、粗いパーティションごとに異なるサブエリアに割り当てられます)。したがって、真ん中の列は、「エラーが5%以下の最も粗い共通パーティション」を表すものとして説明できます。

実際の答えが一番上の行、中央の列、または中央の行、中央の列、またはその中間のパーティションであるかどうかは、それほど重要ではありません。


操作がわかりません。2つのパーティションの一般的な粗大化を探しているようです。ただし、追加の基準がなければ、通常は多くの解決策があります。たとえば、(細かくするのではなく)粗くすることが目標のように見えるので、なぜあなたがしたところをやめるのですか?なぜ共通の境界正方形を描画しないのですか?
whuber

1
ありがとう、私はこれに誤ったラベルを付けました。私が言っていることは、最も細かい共通パーティション、またはおそらく「最も粗くない」です。
EconAndrew 2015

その場合、結果はあなたが描いたものとは非常に異なって見えます。それは正方形の4 x 4のチェス盤です。この1つの例から、あなたが従おうとしているルールを推測することができませんでした。たぶん、すべての入力フィーチャにすべてのエッジを共通にしようとしているのでしょうか?あなたが解決しようとしている実際の問題は何ですか?あなたの質問がどうあるべきかを理解するのに役立つ具体的な例を提供できますか?
whuber

私は多くのことを詳しく説明しました-多分これは役立つでしょう。あいまいなケースでは質問を正確に指定できないことは事実ですが、正確なケースでは私が何を意味するのかを正確に知っていると思います(たとえ私がそれをうまく表現していなくても)。
EconAndrew 2015

努力していただきありがとうございます(+1)。お使いの集合論的表記法の観点では、地域の形式のパーティション半順序集合は:パーティションAはある洗練B、及びBはある粗大化A内のすべてのセットするとき、Aは 1つのサブセットであるB。結合の操作は、ABの最も一般的な粗視化のようです。ファジーバージョンに取り組む1つの方法は、GISの機能を利用してダングルとスリーバーを削除し、2つのレイヤー間の小さな不一致を修正してから、非ファジー操作を実行することです。
whuber

回答:


2

これを行うには、ポリゴンの境界とそれらの境界の対称的な違いとの差を評価するか、記号で次のように表現します。

Difference(a, SymDifference(a, b))

ジオメトリabを取り、次の2つのラインと画像のマルチラインストリングとして表現します。

MULTILINESTRING((0 300,50 300,50 250,0 250,0 300),(50 300,100 300,100 250,50 250,50 300),(0 250,50 250,50 200,0 200,0 250),(50 250,100 250,100 200,50 200,50 250),(100 300,200 300,200 200,100 200,100 300),(0 200,100 200,100 100,0 100,0 200),(100 200,150 200,150 150,100 150,100 200),(150 200,200 200,200 150,150 150,150 200),(100 150,150 150,150 100,100 100,100 150),(150 150,200 150,200 100,150 100,150 150))
MULTILINESTRING((0 300,100 300,100 200,0 200,0 300),(100 300,150 300,150 250,100 250,100 300),(150 300,200 300,200 250,150 250,150 300),(100 250,150 250,150 200,100 200,100 250),(150 250,200 250,200 200,150 200,150 250),(0 200,50 200,50 150,0 150,0 200),(50 200,100 200,100 150,50 150,50 200),(0 150,50 150,50 100,0 100,0 150),(50 150,100 150,100 100,50 100,50 150),(100 200,150 200,150 100,100 100,100 200),(150 200,200 200,200 100,150 100,150 200))

a b

abの部分が交差しない対称的な違いは次のとおりです。

MULTILINESTRING((50 300,50 250),(50 250,0 250),(100 250,50 250),(50 250,50 200),(150 150,100 150),(200 150,150 150),(150 300,150 250),(150 250,100 250),(200 250,150 250),(150 250,150 200),(50 200,50 150),(50 150,0 150),(100 150,50 150),(50 150,50 100))

symdiff

そして最後に、aまたはbと対称差の差を評価します。

MULTILINESTRING((0 300,50 300),(0 250,0 300),(50 300,100 300),(100 300,100 250),(50 200,0 200),(0 200,0 250),(100 250,100 200),(100 200,50 200),(100 300,150 300),(150 300,200 300,200 250),(200 250,200 200),(200 200,150 200),(150 200,100 200),(100 200,100 150),(100 150,100 100),(100 100,50 100),(50 100,0 100,0 150),(0 150,0 200),(150 200,150 150),(200 200,200 150),(150 150,150 100),(150 100,100 100),(200 150,200 100,150 100))

diff_symdiff

このロジックは、GEOS(Shapely、PostGISなど)、JTSなどで実装できます。入力ジオメトリがポリゴンである場合、その境界を抽出する必要があり、結果をポリゴン化できることに注意してください。たとえば、PostGISで示されているように、2つのMultiPolygonを取り、MultiPolygonの結果を取得します。

SELECT
  ST_AsText(ST_CollectionHomogenize(ST_Polygonize(
    ST_Difference(ST_Boundary(A), ST_SymDifference(ST_Boundary(A), ST_Boundary(B)))
  ))) AS result
FROM (
  SELECT 'MULTIPOLYGON(((0 300,50 300,50 250,0 250,0 300)),((50 300,100 300,100 250,50 250,50 300)),((0 250,50 250,50 200,0 200,0 250)),((50 250,100 250,100 200,50 200,50 250)),((100 300,200 300,200 200,100 200,100 300)),((0 200,100 200,100 100,0 100,0 200)),((100 200,150 200,150 150,100 150,100 200)),((150 200,200 200,200 150,150 150,150 200)),((100 150,150 150,150 100,100 100,100 150)),((150 150,200 150,200 100,150 100,150 150)))'::geometry AS a,
    'MULTIPOLYGON(((0 300,100 300,100 200,0 200,0 300)),((100 300,150 300,150 250,100 250,100 300)),((150 300,200 300,200 250,150 250,150 300)),((100 250,150 250,150 200,100 200,100 250)),((150 250,200 250,200 200,150 200,150 250)),((0 200,50 200,50 150,0 150,0 200)),((50 200,100 200,100 150,50 150,50 200)),((0 150,50 150,50 100,0 100,0 150)),((50 150,100 150,100 100,50 100,50 150)),((100 200,150 200,150 100,100 100,100 200)),((150 200,200 200,200 100,150 100,150 200)))'::geometry AS b
) AS f;
                               result
--------------------------------------------------------------------------------
MULTIPOLYGON(((0 300,50 300,100 300,100 250,100 200,50 200,0 200,0 250,0 300)),((100 250,100 300,150 300,200 300,200 250,200 200,150 200,100 200,100 250)),((0 200,50 200,100 200,100 150,100 100,50 100,0 100,0 150,0 200)),((150 200,200 200,200 150,200 100,150 100,150 150,150 200)),((100 200,150 200,150 150,150 100,100 100,100 150,100 200)))

私はこの方法を広範囲にテストしていないことに注意してください。したがって、これらをアイデアとして出発点として考えてください。


このアルゴリズムが、質問されている問題のあいまいなバージョンをどのように処理するか、それともそのバージョンにどのように適応できるかについて明確にできますか?
whuber

0

エラーのないアルゴリズム。

最初のセット: ここに画像の説明を入力してください 2番目のセット: ここに画像の説明を入力してください

2つのセットをマージし、エリアで降順に並べ替えます。領域の合計=合計領域(この場合は16)に達するまで、テーブルの行を選択します(上=>下)。

ここに画像の説明を入力してください

選択した行があなたの答えになります:

ここに画像の説明を入力してください

基準は、累積面積と実際の合計との差になります。


これは、非常に特殊な状況でのみ正しく機能するようです。どのようにして、共通領域の重複しない網羅的なパーティションになることを保証しますか?
whuber

正しい。追加の手順a)アークジスユニオンツールに関するユニオンデータセットb)マージされたテーブルから最初に最大のものを取得し、他の部分の割合をチェックc)割合が大きいしきい値(90%など)を持つ他のものを削除します。これはどのように?
FelixIP 2015

質問の内容がまだわからないので、わかりません。
whuber

最大の可能なブロックを使用して領域を構成します。これは質問の私の理解である
FelixIP

その解決策は、単一のブロック(それらすべての和集合)を使用することです!
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.