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.
Respostas:
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 ...
fonte