Calcolo delle statistiche focali per i quartieri speciali?


18

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.


1
questo è un problema interessante. Potresti impostare tutte le celle al di fuori della tua area di studio su NoData, ma non so come riuscirai mai a far adattare un quartiere e mantenere la stessa dimensione di 20 km quadrati (dovrebbe cambiare forma).
jbchurchill,

@CSB jbchurchill ha ragione, la cosa migliore da fare qui è assegnare valori NoData al di fuori dell'area di studio. Lo strumento Statistiche focali può trattare questi valori di nodati in modo appropriato. Vedi "Elaborazione delle celle di NoData" qui resources.arcgis.com/en/help/main/10.1/index.html#//…
WhiteboxDev

@WhiteboxDev - Il tuo suggerimento non risolverà il mio problema. Modificherò quanto sopra e spiegherò perché non funzionerà.
CSB

Hai visto questo post, che discute sull'uso delle statistiche focali con raggio variabile ( gis.stackexchange.com/questions/34306/… )? Questo sembra essere il tuo problema: le celle sul bordo dovrebbero avere un raggio ampio e considerare solo un quartiere semicircolare. Naturalmente, a seconda della dimensione della tua cella, potresti dover creare molti, molti raster tra cui scegliere.
floema

1
@CSB Incontrerai effetti marginali indipendentemente dal fatto che tu utilizzi NoData e un quartiere ristretto o se cambi forma / posizionamento del tuo quartiere per assicurarti le dimensioni. Almeno con il primo, non dovrai sovracampionare / rappresentare i dati near-edge in modo non trasparente. Questo fa parte del famigerato problema areale modificabile dell'unità.
WhiteboxDev

Risposte:


0

Il codice sopra è l'eventuale, e imperfetta, risposta che mi è venuta in mente per questo problema. Alla fine ho pensato che l'approccio migliore fosse usare un quartiere circolare e calcolare l'area che interseca la mia area "disponibile". (Un quartiere circolare darebbe comunque le celle n ~ più vicine - quindi, non c'è bisogno di essere troppo fantasiosi con gli automi cellulari.) Se l'area era troppo piccola, avrei solo fatto crescere il cerchio fino a quando non lo era.

Funzionava bene ma, come ho notato, era molto lento. Vedi questo thread per suggerimenti su come accelerarlo. Massimizzare le prestazioni del codice per Shapely . Ho seguito i suggerimenti, che hanno portato a questa discussione Comprensione dell'uso degli indici spaziali . Alla fine non ho applicato un r-tree, perché in realtà non ho mai usato il codice. Ho scoperto che avrei potuto affrontare il problema da una prospettiva completamente diversa e risparmiare un sacco di tempo / energia, così ho fatto. Forse lo finirò un giorno ...


Leggendo il codice sembra che ci sia una buona possibilità che l'uso di un indice spaziale possa accelerare il codice, spesso in modo drammatico. Fare intersezioni contro un multipoligono del genere è molto lento.
Snorfalorpagus,

@Snorfalorpagus Sì, se guardi la risposta, indico altri due thread correlati a questa domanda. Entrambi discutono usando un indice spaziale.
CSB
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.