Algoritmo de partição comum menos grosseiro difuso

9

Dadas duas partições diferentes de uma forma (por razões de argumento, duas divisões administrativas diferentes de um país), como posso encontrar uma nova partição na qual essas duas partições se encaixam, permitindo (e otimizando) algum erro?

Por exemplo, ignorando o erro, quero um algoritmo que faça isso:

Versão não difusa

Talvez ajude a expressar isso em termos definidos. Usando a seguinte numeração:

Eu posso expressar as partições acima como:

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

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

e o algoritmo para produzir A ponto B parece direto (algo como, se dois elementos estão em uma partição juntos em A (B) mesclam as partições em que estão em B (A) - repita até A e B serem iguais).

Mas agora imagine que algumas dessas linhas sejam ligeiramente diferentes entre as duas partições, de modo que essa resposta perfeita não seja possível e, em vez disso, quero que a resposta ideal seja sujeita a minimizar algum critério de erro.

Veja um novo exemplo:

Aqui na coluna da esquerda, temos duas partições sem linhas comuns (além da própria borda externa). A única solução possível do tipo acima é a trivial, a coluna da direita. Porém, se permitirmos soluções "difusas", a coluna do meio poderá ser permitida, com 5% da área total sendo contestada (ou seja, alocada para uma subárea diferente em cada partição grosseira). Portanto, podemos descrever a coluna do meio como representando a "partição comum menos grossa com <= 5% de erro".

Se a resposta real é a partição na linha superior, coluna do meio ou linha do meio, coluna do meio - ou algo intermediário, é menos importante.

EconAndrew
fonte
Eu não entendo sua operação. Parece que você está procurando um aumento comum de duas partições. Sem critérios adicionais, porém, geralmente haverá muitas soluções. Por exemplo, uma vez que o aumento do objetivo (em vez do aprimoramento) parece ser o seu objetivo, por que parar onde você parou? Por que não apenas desenhar o quadrado delimitador comum?
whuber
11
Obrigado, eu escrevi isso errado. O que eu acho que quero dizer é a melhor partição comum, ou talvez "menos grossa".
EconAndrew 23/07
Nesse caso, o resultado seria muito diferente do que você desenhou. Seria 4 x 4 tabuleiro de xadrez de quadrados. Neste exemplo, não consegui deduzir a regra que você deseja seguir. Talvez você esteja tentando manter todas as arestas comuns a todos os recursos de entrada? Qual é o problema real que você está tentando resolver? Você poderia fornecer um exemplo concreto para nos ajudar a entender qual deveria ser sua pergunta ?
whuber
Eu elaborei muito - talvez isso ajude. É verdade que, no caso difuso, não posso especificar com precisão a minha pergunta, mas acho que, no caso exato, sei exatamente o que quero dizer (mesmo que não esteja expressando bem).
EconAndrew 23/07
Obrigado por esses esforços (+1). Em termos da sua notação set-theoretic, divisórias de uma região formar um conjunto parcialmente ordenado : partição Um é um refinamento de B e B é um engrossamento de A , quando cada conjunto em A é um subconjunto de um em B . Sua operação de aparece combinando a ser o melhor coarsening comum de A e B . Uma maneira de lidar com sua versão difusa seria explorar os recursos do GIS para remover oscilações e lascas, para corrigir pequenas discrepâncias entre as duas camadas e executar a operação não difusa.
whuber

Respostas:

2

Você pode fazer isso avaliando a diferença entre o limite de um polígono e a diferença simétrica entre seus limites, ou simbolicamente expressa como:

Difference(a, SymDifference(a, b))

Tome geometrias a e b , expressas como multilinha durante os próximos dois linhas e imagens:

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

uma b

A diferença simétrica, em que porções de um e b não se intersectam, é:

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, finalmente, avalie a diferença entre a ou be a diferença 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

Você pode implementar essa lógica no GEOS (Shapely, PostGIS etc.), JTS e outros. Observe que, se as geometrias de entrada são polígonos, seus limites precisam ser extraídos e o resultado pode ser poligonalizado. Por exemplo, mostrado no PostGIS, pegue dois MultiPolygons e obtenha um 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)))

Observe que eu não testei extensivamente esse método; portanto, tome-as como idéias como ponto de partida.

Mike T
fonte
Você poderia ser explícito sobre como esse algoritmo lida com a versão difusa do problema que está sendo perguntado ou como ele pode ser adaptado a essa versão?
whuber
0

Algoritmo livre de erros.

Primeiro set: insira a descrição da imagem aqui Segundo set: insira a descrição da imagem aqui

Mesclar 2 conjuntos e classificar em ordem decrescente por área. Selecione as linhas na tabela (de cima => para baixo) até o total de áreas = a área total (16 neste caso) atingir:

insira a descrição da imagem aqui

As linhas selecionadas fazem sua resposta:

insira a descrição da imagem aqui

O critério será uma diferença entre as áreas acumuladas e o total real.

FelixIP
fonte
Parece que ele funcionará corretamente apenas em circunstâncias muito especiais. Como você garante que terá uma partição exaustiva e não sobreposta da região comum?
whuber
Corrigir. Etapas adicionais a) conjuntos de dados da união em termos da ferramenta Union do arcgis b) obtêm o primeiro maior da tabela mesclada e verificam a fração dos outros dentro c) removem outros com um limite maior da fração, por exemplo, 90%. Como é isso?
FelixIP
Não sei, porque ainda não descobri o que a pergunta realmente está perguntando.
whuber
Crie a área usando os maiores blocos possíveis. Este é o meu entendimento da questão
FelixIP
A solução para isso é usar um único bloco (a união de todos eles)!
whuber