Cálculo de estatísticas focais para vizinhança especial?


18

Estou procurando calcular estatísticas focais para cada célula de uma varredura, dentro de uma vizinhança de um critério especificado.

Antecedentes - Eu tenho três rasters binários, cada um representando um único tipo de vegetação de interesse. Eu gostaria de calcular a porcentagem de cobertura de cada tipo de vegetação dentro de (por exemplo) 20 km ^ 2 de qualquer célula da minha área de estudo (soma / total de células na vizinhança). O problema é que não posso usar um círculo simples ou vizinhança quadrada em torno de cada célula porque, se o fizesse, a área de pesquisa usada para calcular a soma incorporaria áreas fora da minha área de estudo. Essa exceção é importante porque as estatísticas serão usadas como insumos para um modelo de habitat e as áreas fora da minha área de estudo não podem ser consideradas como habitat possível - elas são urbanizadas. Incluí-los me daria estatísticas erradas. Então, o que eu 'n determinado pelo número de células necessárias para cobrir uma área igual ao tamanho da vizinhança desejado) que atenda aos meus critérios. Os critérios são que eles não se enquadram em uma área urbanizada. Estou pensando que alguma forma de autômato celular deve ser usada. Eu nunca trabalhei com a CA, no entanto.

Eu acho que o que eu gostaria é algo como código inicial, ou um ponto na direção certa.


RESPOSTA AO COMENTÁRIO ABAIXO:

Digamos que eu esteja calculando essa estatística para uma célula no limite do meu site de estudo. Se eu atribuir todas as áreas fora da minha área de estudo a zero (ou ignorar NoData), receberei uma estatística que representa aproximadamente metade da cobertura regional em que estou interessado. Portanto, porcentagem de cobertura em uma área de ~ 10 km ^ 2 , em vez de 20 km ^ 2 de área. Como estou estudando os tamanhos da faixa doméstica, isso é importante. O bairro precisa mudar de forma, pois é assim que o animal vê / usa a paisagem. Se eles precisarem de 20 km ^ 2, eles mudarão a forma ou o território de origem. Se eu não marcar Ignorar NoData, a saída da célula será NoData - e NoData não ajuda.


"PROGRESSO" EM 24/10/2014

Aqui está o código que eu criei até agora usando Shapely e Fiona:

import numpy as np
import pprint
import shapely
from shapely.geometry import*
import fiona
from fiona import collection
import math

traps = fiona.open('C:/Users/Curtis/Documents/ArcGIS/GIS_Data/occurrence/ss_occ.shp', 'r')

study_area = fiona.open('C:/Users/Curtis/Documents/ArcGIS/GIS_Data/Study_Area.shp', 'r')
for i in study_area: #for every record in 'study_area'
        sa = shape(i['geometry']) #make a variable called 'sa' that is a polygon

grassland = fiona.open('C:/Users/Curtis/Documents/ArcGIS/GIS_Data/land_cover/polys_for_aa/class3_aa.shp', 'r')
pol = grassland.next()
gl = MultiPolygon([shape(pol['geometry']) for pol in grassland])

areaKM2 = 20
with traps as input:
    r = (math.sqrt(areaKM2/math.pi))*1000
    for point in input:
        pt = shape(point['geometry'])
        pt_buff = pt.buffer(r)
        avail_area = pt_buff.intersection(sa).area
        # works to here
        while avail_area < areaKM2:
            r += 10
            pt_buff = pt.buffer(r)
            avail_area = pt_buff.intersection(sa).area

        perc_cov = pt_buff.intersection(gl).area//areaKM2
        print perc_cov

Infelizmente, é incrivelmente lento.


1
esse é um problema interessante. Você pode definir todas as células fora da sua área de estudo como NoData, mas eu não sei como você conseguirá que um bairro se adapte e mantenha o mesmo tamanho de 20 km2 (isso teria que mudar de forma).
jbchurchill

A @CSB jbchurchill está certa, a melhor coisa a fazer aqui é atribuir valores NoData fora da sua área de estudo. A ferramenta Estatísticas focais pode tratar esses valores de nodata adequadamente. Consulte 'Processando células do NoData' aqui resources.arcgis.com/en/help/main/10.1/index.html#//…
WhiteboxDev

@WhiteboxDev - Sua sugestão não resolverá meu problema. Vou editar o que foi dito acima e explicar por que isso não funciona.
CSB 16/10

Você já viu este post, que discute o uso de estatísticas focais com um raio variável ( gis.stackexchange.com/questions/34306/… )? Esse parece ser o seu problema - as células na borda devem ter um raio grande e considerar apenas uma vizinhança semicircular. Obviamente, dependendo do tamanho da sua célula, você pode ter que criar muitas e muitas opções para escolher.
Phloem #:

1
@CSB Você terá efeitos de borda independentemente de usar NoData e uma vizinhança reduzida ou alterar a forma / localização da sua vizinhança para garantir o tamanho. Pelo menos com o primeiro, você não fará uma amostragem excessiva / representação de dados da borda próxima de maneira não transparente. Isso faz parte do infame problema da unidade local modificável.
WhiteboxDev

Respostas:


0

O código acima é a resposta eventual e imperfeita que surgiu para esse problema. No final, pensei que a melhor abordagem era usar uma vizinhança circular e calcular a área que cruzava minha área "disponível". (Uma vizinhança circular daria as n ~ células mais próximas de qualquer maneira - portanto, não é preciso ficar muito chique com o Cellular Automata.) Se a área era muito pequena, eu apenas cresci o círculo até que não fosse.

Funcionou bem, mas, como observei, era muito lento. Veja este tópico para obter sugestões sobre como acelerar. Maximizando o desempenho do código para o Shapely . Segui as sugestões, que levaram a este tópico Noções básicas sobre o uso de índices espaciais . Eu não acabei aplicando uma árvore r no final, porque na verdade nunca acabei usando o código. Eu descobri que poderia abordar o problema de um ângulo completamente diferente e economizar muito tempo / energia, então o fiz. Talvez eu termine um dia ...


Lendo seu código, parece que há uma boa chance de usar um índice espacial para acelerar o código, geralmente de forma dramática. Fazer interseções contra um MultiPolygon assim é muito lento.
Snorfalorpagus

@ Snorfalorpagus Sim, se você olhar para a resposta, aponto para outros dois tópicos relacionados a essa pergunta. Ambos discutem o uso de um índice espacial.
CSB
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.