É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:
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.
Réponses:
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:
Prenez les géométries a et b , exprimées en MultiLinestrings sur les deux lignes et images suivantes:
La différence symétrique, où les parties de a et b ne se croisent pas, est:
Et enfin, évaluez la différence entre a ou b et la différence symétrique:
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:
Notez que je n'ai pas beaucoup testé cette méthode, alors prenez-les comme des idées comme point de départ.
la source
Algorithme sans erreurs.
Premier set: Second set:
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:
Les lignes sélectionnées font votre réponse:
Le critère va être une différence entre les superficies cumulées et le total réel.
la source