Algorithme de partition commune le moins grossier flou

9

Étant donné deux partitions différentes d'une forme (pour les besoins de l'argument, deux divisions administratives différentes d'un pays), comment puis-je trouver une nouvelle partition dans laquelle ces deux partitions s'insèrent, permettant (et optimisant) une erreur?

Par exemple, en ignorant l'erreur, je veux un algorithme qui fait ceci:

Version non floue

Peut-être que cela aide à exprimer cela en termes fixes. En utilisant la numérotation suivante:

Je peux exprimer les partitions ci-dessus comme:

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}}

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

et l'algorithme pour produire un point B semble simple (quelque chose comme, si deux éléments sont dans une partition ensemble dans A (B) fusionnent les partitions dans lesquelles ils sont dans B (A) - répétez jusqu'à ce que A et B soient égaux).

Mais imaginez maintenant que certaines de ces lignes sont légèrement différentes entre les deux partitions, de sorte que cette réponse parfaite n'est pas possible, et à la place, je veux la réponse optimale sous réserve de minimiser certains critères d'erreur.

Prenons un nouvel exemple:

Ici, dans la colonne de gauche, nous avons deux partitions sans lignes communes (à l'exception de la bordure extérieure elle-même). La seule solution possible du type ci-dessus est la plus triviale, la colonne de droite. Mais si nous autorisons des solutions "floues", alors la colonne du milieu peut être autorisée, avec par exemple 5% de la superficie totale contestée (c'est-à-dire allouée à une sous-zone différente dans chaque partition grossière). Nous pourrions donc décrire la colonne du milieu comme représentant la "partition commune la moins grossière avec une erreur <= 5%".

Que la réponse réelle soit alors la partition dans la rangée du haut, la colonne du milieu ou la rangée du milieu, la colonne du milieu - ou quelque chose entre les deux, est moins importante.

EconAndrew
la source
Je ne comprends pas ton fonctionnement. Il semble que vous recherchiez un grossissement commun de deux partitions. Sans critères supplémentaires, cependant, il y aura généralement de nombreuses solutions. Par exemple, puisque le grossissement (plutôt que le raffinement) semble être votre objectif, pourquoi vous arrêter là où vous en étiez? Pourquoi ne pas simplement dessiner le carré de délimitation commun?
whuber
1
Merci, j'ai mal étiqueté cela. Ce que je pense que je veux dire, c'est la plus belle partition commune, ou peut-être "moins grossière".
EconAndrew
Dans ce cas, le résultat serait très différent de ce que vous avez dessiné. Ce serait un échiquier de carrés 4 x 4. De cet exemple, je n'ai pas pu déduire la règle que vous souhaitez suivre. Peut-être que vous essayez de garder tous les bords communs à toutes les fonctionnalités d'entrée? Quel est le problème réel que vous essayez de résoudre? Pourriez-vous fournir un exemple concret pour nous aider à comprendre quelle devrait être votre question ?
whuber
J'ai beaucoup élaboré - peut-être que cela aidera. Il est vrai que dans le cas flou je ne peux pas spécifier précisément ma question, mais je pense que dans le cas précis je sais précisément ce que je veux dire (même si je ne l'exprime pas bien).
EconAndrew
Merci pour ces efforts (+1). En termes de votre notation ensembliste, les partitions d'une région forment un ensemble ordonné : partition A est un raffinement de B et B est un coarsening de A , où chaque jeu dans A est un sous - ensemble d'un en B . Votre opération de combinaison semble être la plus belle commune de coarsening A et B . Une façon d'aborder votre version floue serait d'exploiter les capacités du SIG pour supprimer les bris et les éclats afin de corriger les petites divergences entre les deux couches, puis d'effectuer l'opération non floue.
whuber

Réponses:

2

Vous pouvez le faire en évaluant la différence entre la limite d'un polygone et la différence symétrique entre leurs limites, ou exprimée symboliquement comme:

Difference(a, SymDifference(a, b))

Prenez les géométries a et b , exprimées en MultiLinestrings sur les deux lignes et images suivantes:

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))

une b

La différence symétrique, où les parties de a et b ne se croisent pas, est:

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

Et enfin, évaluez la différence entre a ou b et la différence symétrique:

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

Vous pouvez implémenter cette logique dans GEOS (Shapely, PostGIS, etc.), JTS et autres. Notez que si les géométries en entrée sont des polygones, leurs limites doivent être extraites et le résultat peut être polygonisé. Par exemple, illustré avec PostGIS, prenez deux MultiPolygons et obtenez un résultat 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)))

Notez que je n'ai pas beaucoup testé cette méthode, alors prenez-les comme des idées comme point de départ.

Mike T
la source
Pourriez-vous être explicite sur la façon dont cet algorithme gère la version floue du problème posé, ou bien comment il pourrait être adapté à cette version?
whuber
0

Algorithme sans erreurs.

Premier set: entrez la description de l'image ici Second set: entrez la description de l'image ici

Fusionnez 2 ensembles et triez par ordre décroissant par zone. Sélectionnez les lignes dans le tableau (haut => bas) jusqu'à ce que le total des zones = la surface totale (16 dans ce cas) atteint:

entrez la description de l'image ici

Les lignes sélectionnées font votre réponse:

entrez la description de l'image ici

Le critère va être une différence entre les superficies cumulées et le total réel.

FelixIP
la source
Il semble que cela ne fonctionnera correctement que dans des circonstances très spéciales. Comment garantissez-vous que vous vous retrouverez avec une partition exhaustive et sans chevauchement de la région commune?
whuber
Correct. Étapes supplémentaires a) ensembles de données d'union en termes d'arcis Union tool b) prendre le plus grand du tableau fusionné et vérifier la fraction des autres à l'intérieur c) supprimer les autres avec une fraction de seuil supérieur, par exemple 90%. Comment est-ce?
FelixIP
Je ne sais pas, parce que je n'ai pas encore compris ce que la question pose vraiment.
whuber
Composez la zone en utilisant les plus grands blocs possibles. Ceci est ma compréhension de la question
FelixIP
La solution à cela est d'utiliser un seul bloc (l'union de tous)!
whuber