Algoritmo difuso de partición común menos grueso

9

Dadas dos particiones diferentes de una forma (por el bien del argumento, dos divisiones administrativas diferentes de un país), ¿cómo puedo encontrar una nueva partición en la que encajen ambas particiones, permitiendo (y optimizando) algún error?

Por ejemplo, ignorando el error, quiero un algoritmo que haga esto:

Versión no difusa

Quizás sea útil expresar esto en términos establecidos. Usando la siguiente numeración:

Puedo expresar las particiones anteriores como:

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

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

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

y el algoritmo para producir un punto B parece sencillo (algo así como, si dos elementos están en una partición juntos en A (B) fusionan las particiones en las que están en B (A), repita hasta que A y B sean iguales).

Pero ahora imagine que algunas de estas líneas son ligeramente diferentes entre las dos particiones, por lo que esta respuesta perfecta no es posible y, en cambio, quiero que la respuesta óptima esté sujeta a minimizar algún criterio de error.

Tome un nuevo ejemplo:

Aquí en la columna izquierda tenemos dos particiones sin líneas comunes (aparte del borde exterior en sí). La única solución posible del tipo anterior es la trivial, la columna derecha. Pero si permitimos soluciones "difusas", entonces la columna central puede ser permisible, con un 5% del área total en disputa (es decir, asignada a una subárea diferente en cada partición gruesa). Por lo tanto, podríamos describir la columna central como la representación de la "partición común menos gruesa con <= 5% de error".

Si la respuesta real es entonces la partición en la fila superior, la columna central o la fila central, la columna central, o algo intermedio, es menos importante.

EconAndrew
fuente
No entiendo tu operación. Parece que está buscando un engrosamiento común de dos particiones. Sin embargo, sin criterios adicionales, generalmente habrá muchas soluciones. Por ejemplo, dado que el engrosamiento (en lugar del refinamiento) parece ser su objetivo, ¿por qué detenerse donde lo hizo? ¿Por qué no simplemente dibujar el cuadrado delimitador común?
whuber
1
Gracias, he etiquetado mal esto. Lo que creo que quiero decir es la mejor partición común, o quizás "menos grosera".
EconAndrew
En ese caso, el resultado se vería muy diferente de lo que ha dibujado. Sería un tablero de ajedrez de 4 x 4 de cuadrados. A partir de este ejemplo, no he podido deducir la regla que desea seguir. ¿Quizás intente mantener todos los bordes comunes a todas las características de entrada? ¿Cuál es el problema real que estás tratando de resolver? ¿Podría darnos un ejemplo concreto para ayudarnos a comprender cuál debería ser su pregunta ?
whuber
He elaborado mucho, tal vez esto ayude. Es cierto que en el caso difuso no puedo especificar con precisión mi pregunta, pero creo que en el caso exacto sé exactamente lo que quiero decir (incluso si no lo estoy expresando bien).
EconAndrew
Gracias por esos esfuerzos (+1). En términos de su notación de la teoría de conjuntos, las particiones de una región forman un conjunto parcialmente ordenado : partición A es un refinamiento de B , y B es un engrosamiento de A , cuando cada conjunto en una es un subconjunto de una en B . Su funcionamiento de la combinación aparece como el mejor engrosamiento común de A y B . Una forma de abordar su versión difusa sería explotar las capacidades del SIG para eliminar colgantes y astillas para corregir pequeñas discrepancias entre las dos capas y luego realizar la operación no difusa.
whuber

Respuestas:

2

Puede hacer esto evaluando la diferencia del límite de un polígono con la diferencia simétrica entre sus límites, o expresada simbólicamente como:

Difference(a, SymDifference(a, b))

Tome geometrías un y b , expresado como multilíneas en los próximos dos líneas e imágenes:

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

una si

La diferencia simétrica, donde las porciones de a y b no se cruzan, es:

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

Y, por último, evaluar la diferencia entre cualquiera de una o B y la diferencia simétrica:

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

Puede implementar esta lógica en GEOS (Shapely, PostGIS, etc.), JTS y otros. Tenga en cuenta que si las geometrías de entrada son polígonos, entonces sus límites deben ser extraídos y el resultado puede ser poligonalizado. Por ejemplo, mostrado con PostGIS, tome dos MultiPolygons y obtenga un resultado 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)))

Tenga en cuenta que he no extensamente probado este método, a fin de tomar estos como las ideas como punto de partida.

Mike T
fuente
¿Podría ser explícito acerca de cómo este algoritmo maneja la versión difusa del problema que se le está preguntando, o cómo se podría adaptar a esa versión?
whuber
0

Algoritmo libre de errores.

Primer set: ingrese la descripción de la imagen aquí Segundo set: ingrese la descripción de la imagen aquí

Combina 2 conjuntos y ordena en orden descendente por área. Seleccione filas en la tabla (arriba => abajo) hasta alcanzar el total de áreas = área total (16 en este caso):

ingrese la descripción de la imagen aquí

Las filas seleccionadas hacen su respuesta:

ingrese la descripción de la imagen aquí

El criterio será una diferencia entre las áreas acumuladas y el total real.

FelixIP
fuente
Parece que funcionará correctamente solo en circunstancias muy especiales. ¿Cómo garantiza que terminará con una partición exhaustiva y no superpuesta de la región común?
whuber
Correcto. Pasos adicionales a) conjuntos de datos de unión en términos de arcgis Herramienta de unión b) tomar el primero más grande de la tabla combinada y verificar la fracción de otros dentro de c) eliminar otros con un umbral de fracción mayor, por ejemplo, 90%. ¿Cómo es esto?
FelixIP
No lo sé, porque todavía no he descubierto cuál es la pregunta realmente.
whuber
Componga el área usando los bloques más grandes posibles. Esta es mi comprensión de la pregunta
FelixIP
¡La solución a eso es usar un solo bloque (la unión de todos)!
whuber