Ich möchte Fokusstatistiken für jede Zelle eines Rasters in der Nähe eines bestimmten Kriteriums berechnen.
Hintergrund - Ich habe drei binäre Raster, die jeweils einen bestimmten Vegetationstyp repräsentieren. Ich möchte die prozentuale Abdeckung jedes Vegetationstyps innerhalb von (z. B.) 20 km ^ 2 einer Zelle in meinem Untersuchungsgebiet (Summe / Gesamtzahl der Zellen in der Nachbarschaft) berechnen. Das Problem ist, dass ich keinen einfachen Kreis oder ein Quadrat um jede Zelle herum verwenden kann, da der Suchbereich, der zur Berechnung der Summe verwendet wird, Bereiche außerhalb meines Untersuchungsbereichs enthält. Diese Ausnahme ist wichtig, da die Statistiken als Eingaben für ein Lebensraummodell verwendet werden und die Gebiete außerhalb meines Untersuchungsgebiets nicht als möglicher Lebensraum angesehen werden können - sie sind urbanisiert. Wenn ich sie mit einbeziehe, würde das zu falschen Statistiken führen. Also, was ichn wird durch die Anzahl der Zellen bestimmt, die erforderlich sind, um eine Fläche abzudecken, die meiner gewünschten Nachbarschaftsgröße entspricht und meinen Kriterien entspricht. Das Kriterium ist, dass sie nicht in ein städtisches Gebiet fallen. Ich denke, dass irgendeine Form von zellularen Automaten verwendet werden sollte. Ich habe allerdings noch nie mit CA gearbeitet.
Ich denke, was ich möchte, ist so etwas wie Starter-Code oder ein Punkt in die richtige Richtung.
Antwort auf Kommentar unten:
Angenommen, ich berechne diese Statistik für eine Zelle an der Grenze meines Untersuchungsgebiets. Wenn ich alle Bereiche außerhalb meines Untersuchungsgebiets auf Null setze (oder NoData ignoriere), erhalte ich eine Statistik, die ungefähr die Hälfte der für mich interessanten Flächendeckung darstellt. Prozentuale Deckung in einem Gebiet von ~ 10 km ^ 2 , statt 20 km ^ 2 Fläche. Da ich Haushaltsgrößen studiere, ist dies wichtig. Die Nachbarschaft muss ihre Form ändern, denn so sieht / nutzt das Tier die Landschaft. Wenn sie 20 km2 brauchen, ändern sie die Form oder ihr Heimatgebiet. Wenn ich das Ignorieren von NoData nicht aktiviere, ist die Zellenausgabe NoData - und NoData ist keine Hilfe.
"PROGRESS" AB 24.10.2014
Hier ist der Code, den ich bisher mit Shapely und Fiona entwickelt habe:
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
Leider ist es unglaublich langsam.