Sto cercando di calcolare le statistiche focali per ogni cella di un raster, all'interno di un quartiere di criteri specifici.
Sfondo - Ho tre raster binari, ognuno dei quali rappresenta un singolo tipo di vegetazione di interesse. Vorrei calcolare la percentuale di copertura di ciascun tipo di vegetazione entro (ad es.) 20 km ^ 2 da qualsiasi cella nella mia area di studio (somma / celle totali nel vicinato). Il problema è che non posso usare un semplice cerchio o un vicinato quadrato intorno a ciascuna cella perché, se lo facessi, l'area di ricerca utilizzata per calcolare la somma incorporerebbe aree al di fuori della mia area di studio. Questa eccezione è importante perché le statistiche verranno utilizzate come input per un modello di habitat e le aree al di fuori della mia area di studio non possono essere considerate habitat possibili: sono urbanizzate. Includerli mi darebbe statistiche errate. Quindi, cosa io 'n determinato dal numero di celle richieste per coprire un'area uguale alla mia dimensione di vicinato desiderata) che soddisfano i miei criteri. Il criterio è che non rientrano in un'area urbanizzata. Sto pensando che dovrebbe essere usata una qualche forma di automi cellulari. Non ho mai lavorato con CA però.
Immagino che mi piacerebbe qualcosa come il codice di avviamento o un punto nella giusta direzione.
RISPOSTA A COMMENTO QUI SOTTO:
Diciamo che sto calcolando questa statistica per una cella al limite del mio sito di studio. Se assegno tutte le aree al di fuori della mia area di studio (o ignoro NoData), allora otterrò una statistica che rappresenta circa la metà della copertura areale che mi interessa. Quindi, percentuale di copertura in un'area di ~ 10 km ^ 2 , invece di 20 km ^ 2 area. Dal momento che sto studiando le dimensioni della gamma di casa questo è importante. Il quartiere deve cambiare forma, poiché è così che l'animale vede / usa il paesaggio. Se hanno bisogno di 20 km ^ 2, cambieranno la forma o il loro territorio di origine. Se non seleziono Ignora NoData, l'output della cella sarà NoData e NoData non è di aiuto.
"PROGRESSO" AL 24/10/2014
Ecco il codice che ho trovato finora 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
Sfortunatamente, è INCREDIBILMENTE lento.