Algoritmo di partizione comune sfocato meno grossolano


9

Date due diverse partizioni di una forma (per l'argomento, due diverse divisioni amministrative di un paese), come posso trovare una nuova partizione in cui si adattano entrambe le partizioni, consentendo (e ottimizzando) qualche errore?

Ad esempio, ignorando l'errore, voglio un algoritmo che faccia questo:

Versione non fuzzy

Forse aiuta a esprimerlo in termini prestabiliti. Utilizzando la seguente numerazione:

Posso esprimere le partizioni sopra come:

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

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

e l'algoritmo per produrre un punto B sembra semplice (qualcosa di simile, se due elementi sono in una partizione insieme in A (B) uniscono le partizioni in cui si trovano in B (A) - ripeti fino a quando A e B sono uguali).

Ma ora immagina che alcune di queste righe siano leggermente diverse tra le due partizioni, quindi questa risposta perfetta non è possibile, e invece voglio che la risposta ottimale sia soggetta a minimizzare alcuni criteri di errore.

Prendi un nuovo esempio:

Qui nella colonna di sinistra abbiamo due partizioni senza linee comuni (a parte il bordo esterno stesso). L'unica soluzione possibile del tipo sopra è quella banale, la colonna di destra. Ma se consentiamo soluzioni "fuzzy", allora la colonna di mezzo potrebbe essere ammissibile, con il 5% della superficie totale contestata (cioè assegnata a una sottozona diversa in ogni partizione grezza). Quindi potremmo descrivere la colonna di mezzo come rappresentante la "partizione comune meno grossolana con errore <= 5%".

Se la risposta effettiva è quindi la partizione nella riga superiore, nella colonna centrale o nella riga centrale, nella colonna centrale - o qualcosa nel mezzo, è meno importante.


Non capisco la tua operazione. Sembra che tu stia cercando un ingrossamento comune di due partizioni. Senza criteri aggiuntivi, tuttavia, di solito ci saranno molte soluzioni. Ad esempio, poiché il grossolanità (piuttosto che la raffinatezza) sembra essere il tuo obiettivo, perché fermarsi dove hai fatto? Perché non disegnare semplicemente il quadrato di delimitazione comune?
whuber

1
Grazie, l'ho etichettato erroneamente. Quello che penso di voler dire è la migliore partizione comune, o forse "meno grossolana".
EconAndrew,

In tal caso il risultato sarebbe molto diverso da quello che hai disegnato. Sarebbe 4 x 4 scacchiera di quadrati. Da questo esempio non sono stato in grado di dedurre la regola che si desidera seguire. Forse stai cercando di mantenere tutti i bordi comuni a tutte le funzionalità di input? Qual è il problema reale che stai cercando di risolvere? Potresti fornire un esempio concreto per aiutarci a capire quale dovrebbe essere la tua domanda ?
whuber

Ho elaborato molto - forse questo mi aiuterà. È vero che nel caso fuzzy non posso specificare con precisione la mia domanda, ma penso nel caso esatto che so esattamente cosa intendo (anche se non lo sto esprimendo bene).
EconAndrew,

Grazie per quegli sforzi (+1). In termini di notazione insiemistica, le partizioni di una regione formano un insieme parzialmente ordinato : partizione A è un raffinamento di B e B è un involgarimento di A , quando ogni set in A è un sottoinsieme di uno in B . L'operazione di appare conciliano di essere la più bella ingrossamento comuni di A e B . Un modo per affrontare la tua versione fuzzy sarebbe quello di sfruttare le capacità del GIS per rimuovere i ciondoli e le schegge per correggere piccole discrepanze tra i due livelli e quindi eseguire l'operazione non fuzzy.
whuber

Risposte:


2

Puoi farlo valutando la differenza del confine di un poligono con la differenza simmetrica tra i loro confini, o espressa simbolicamente come:

Difference(a, SymDifference(a, b))

Prendere geometrie a e b , espresso in multistringhe nel corso dei prossimi due linee e immagini:

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

un' B

La differenza simmetrica, in cui porzioni di un e B non si intersecano, è:

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

E infine, valutare la differenza tra a o b e la differenza simmetrica:

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

È possibile implementare questa logica in GEOS (Shapely, PostGIS, ecc.), JTS e altri. Si noti che se le geometrie di input sono poligoni, è necessario estrarne i confini e il risultato può essere poligonizzato. Ad esempio, mostrato con PostGIS, prendi due MultiPolygon e ottieni un risultato 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)))

Si noti che ho non testato questo metodo, in modo da prendere questi come le idee come punto di partenza.


Potresti essere esplicito su come questo algoritmo o gestisce la versione fuzzy del problema richiesto, oppure come potrebbe essere adattato a quella versione?
whuber

0

Algoritmo privo di errori.

Primo set: inserisci qui la descrizione dell'immagine Secondo set: inserisci qui la descrizione dell'immagine

Unisci 2 set e ordina in ordine decrescente per area. Seleziona le righe nella tabella (top => down) fino a raggiungere il totale delle aree = area totale (16 in questo caso):

inserisci qui la descrizione dell'immagine

Le righe selezionate danno la tua risposta:

inserisci qui la descrizione dell'immagine

I criteri saranno una differenza tra le aree accumulate e il totale effettivo.


Sembra che funzionerà correttamente solo in circostanze molto speciali. Come garantite che vi ritroverete con una partizione esaustiva e non sovrapposta della regione comune?
whuber

Corretta. Passaggi aggiuntivi a) set di dati di unione in termini di strumento Unione Arcgis b) prendere il primo più grande dalla tabella unita e controllare la frazione di altri all'interno c) rimuovere gli altri con una soglia maggiore della frazione, ad esempio il 90%. Com'è?
FelixIP,

Non lo so, perché non ho ancora capito quale sia la vera domanda.
whuber

Componi l'area usando i blocchi più grandi possibili. Questa è la mia comprensione della domanda
FelixIP,

La soluzione è quella di utilizzare un singolo blocco (l'unione di tutti)!
whuber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.