Criar polígonos de Thiessen ponderados?

17

Eu tenho um shapefile de ponto e crio polígonos de Thiessen (Voronoi) programaticamente usando esta sintaxe de script:

CreateThiessenPolygons_analysis (in_features, out_feature_class, fields_to_copy) 

No entanto, cada ponto está relacionado a uma área (ou seja, o tamanho preferido de cada polígono) e desejo que os polígonos de Thiessen sejam ponderados com base nesse campo.

Isso é possível e como?

Existe algum código relevante no VBA?

Demetris
fonte

Respostas:

15

Existem várias maneiras de ponderar distâncias para a construção de polígonos de Thiessen. A idéia básica na construção delas é baseada na comparação entre a distância entre um ponto arbitrário x e dois pontos fixos de p e q ; você precisa decidir se x é "mais próximo" de p do que q ou não. Para este fim - pelo menos conceitualmente - consideramos as distâncias dp = d ( x , p ) e dq = d ( x , q ). A ponderação geralmente ocorre de duas maneiras: os pontos podem receber pesos numéricos positivos wp e wq e as próprias distâncias podem ser transformadas.

Para fazer sentido, a transformação (que vou escrever como f ) deve aumentar à medida que as distâncias aumentam; isto é, f (d ')> f (d) sempre que d'> d> = 0. Exemplos de tais transformações são f (d) = d + 1, f (d) = d ^ 2 (Lei da Gravitação de Varejo de Reilly ), f (d) = 1-1 / d (assumindo que todas as distâncias são menores que 1), f (d) = log (d), f (d) = exp (d) -1.

Diríamos então que x está "mais próximo" de p do que de q exatamente quando

f (d ( x , p )) / wp <f (d ( x , q )) / wq.

Observe a divisão pelos pesos, em vez da multiplicação: isso significa que pesos grandes tendem a "puxar" pontos a distâncias maiores. Você verá isso no exemplo em execução abaixo.

Aqui está a coisa linda e o objetivo dessa exposição um tanto abstrata: embora as regiões de Thiessen resultantes possam ter limites complexos e extremamente difíceis de calcular, eles são relativamente fáceis de calcular usando uma representação baseada em grade. Aqui está a receita:

  1. Para cada ponto de entrada p , calcule sua grade de distância euclidiana [d (p)].

  2. Use Álgebra de Mapa para aplicar fe pesos, reexpressando cada grade de distância como

    [fp] = f ([d (p)]) / wp.

    Aqui está um exemplo usando f (d) = 100 + d ^ (3/2); a escala é de 400 por 600.

    figura 1

    À medida que f (d) aumenta, o valor fica mais escuro. Evidentemente, a distância neste exemplo é em relação ao ponto vermelho central; os outros quatro pontos obtêm seus cálculos de distância separados (não mostrados). As áreas dos pontos são proporcionais aos pesos, que são 2, 10, 3, 4 e 5.

  3. Calcule o mínimo local de todas essas grades [fp]. Chame isso de [f]. Aqui está um exemplo.

    Figura 2

  4. Ao comparar [f] com cada [fp], para cada célula da grade, atribua o identificador do primeiro p para o qual [f]> = [fp]. (Isso pode ser feito em uma etapa com uma operação de posição mais baixa , por exemplo.)

    Figura 3

    (Duvido que exista um algoritmo em qualquer lugar que calcule uma solução em formato vetorial para esta função de ponderação f.)

Obviamente, se você tiver mais do que um punhado de pontos p, você escreverá isso e, se o número deles chegar a milhares, você provavelmente abandonará a tentativa como impraticável em termos computacionais (embora haja maneiras de acelerar o cálculo lado a lado).

Outro exemplo, mostrando os polígonos de Thiessen em um elipsóide, aparece em /gis//a/17377/ .

whuber
fonte
3
+1 Eu nunca percebi o quão fácil esse problema se torna ao adotar uma abordagem raster.
Kirk Kuykendall
Whuber: Processo muito sofisticado! No entanto, para focar na minha aplicação: Cada ponto do meu arquivo de entrada representa o centídico aproximado de uma parcela de terra. Crio usando essa linha de script observada acima de um arquivo de polígonos de Thiessen de vetor. A cada polígono é atribuído um espaço, ou seja, um tamanho com base no princípio de thessess polígonos, de igual distância dos limites. e esse é o fator que eu quero levar em consideração, para que os polígonos sejam proportinais a esse fator. Alguma ideia por favor?
Demetris 28/11
Não entendo suas observações, Demetris. Parece que você realmente deseja um cartograma de área em vez de uma coleção de polígonos de Thiessen. Ajudaria a explicar por que você está computando esses polígonos. Que problema eles vão resolver? Como eles serão interpretados?
whuber
Whuber: Cada um dos meus pontos de entrada no processo de polígono de Thiessen representa o centróide aproximado de um novo conjunto de parcelas terrestres. Assim, crio esses polígonos com base nesses pontos, representando a forma das parcelas de terra (parcela de um ponto e um). Posso produzir muitos conjuntos de formas aleatórias de parcelas terrestres movendo esses pontos para alimentar meu algoritmo genético. O problema é que essas formas de parcelas geradas (polígonos de Thiessen) devem ter uma área predefinida e me pergunto se é possível levar isso em consideração ao utilizar a operação de polígonos de Thiessen. Espero que isso faça sentido.
Demetris 28/11
Qual é o seu algoritmo genético tentando fazer? Ainda parece que você não precisa de polígonos de Thiessen ponderados: acredito que não existe uma ponderação possível que garanta que os polígonos atinjam áreas pré-especificadas ou mesmo áreas relativas pré-especificadas.
whuber
10

O que você deseja é um diagrama de Voronoi ponderado: http://en.wikipedia.org/wiki/Weighted_Voronoi_diagram também conhecido como mosaico circular de Dirichlet quando feito com pesos multiplicativos em um plano 2D. Alguém parece ter construído uma extensão do arcgis 9 para construí-los: http://arcscripts.esri.com/details.asp?dbid=15481 Com um guia do usuário disponível aqui http://geography.unt.edu/~pdong/software .htm e um artigo publicado em Dong, P., 2008. Gerando e atualizando diagramas de Voronoi com pesos multiplicativos para recursos de ponto, linha e polígono no GIS. Computers & Geosciences, Volume 34, Edição 4, Páginas 411-421.

Há um artigo recente sobre um algoritmo baseado em vetores (presumo que o algoritmo de P Dong seja baseado em varredura) para isso. http://www.sciencedirect.com/science/article/pii/S0098300411003037 O resumo diz que o código c # está incluído.

blord-castillo
fonte
1
Blord-castillo: Muito obrigado por todas essas informações. É muito útil e aceitarei isso como uma resposta abrangente. No entanto, meu novo problema é que desejo executar essa ferramenta dentro do meu código várias vezes, fornecendo entradas como, por exemplo, a linha de script acima. Isso é possível?
Demetris 27/11