Berechnung der Brennpunktstatistik für besondere Wohngegenden?


18

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.


1
das ist ein interessantes problem. Sie könnten alle Zellen außerhalb Ihres Untersuchungsgebiets auf NoData setzen, aber ich weiß nicht, wie Sie jemals eine Nachbarschaft dazu bringen werden, sich anzupassen und die gleiche Größe von 20 km² beizubehalten (dies müsste die Form ändern).
jbchurchill

@CSB jbchurchill ist richtig. Das Beste, was Sie hier tun können, ist, NoData-Werte außerhalb Ihres Untersuchungsgebiets zuzuweisen. Das Focal Stats-Tool kann diese Knotenwerte entsprechend behandeln. Siehe 'Zellen von NoData verarbeiten' hier resources.arcgis.com/de/help/main/10.1/index.html#//…
WhiteboxDev

@ WhiteboxDev - Ihr Vorschlag wird mein Problem nicht lösen. Ich bearbeite das Obige und erkläre, warum das nicht funktioniert.
CSB

Haben Sie diesen Beitrag gesehen, in dem die Verwendung von Focal Statistics mit variablem Radius ( gis.stackexchange.com/questions/34306/… ) erläutert wird ? Dies scheint Ihr Problem zu sein - Zellen am Rand sollten einen großen Radius haben und nur eine halbkreisförmige Nachbarschaft berücksichtigen. Natürlich müssen Sie abhängig von Ihrer Zellengröße möglicherweise viele, viele Raster erstellen, aus denen Sie auswählen können.
Phloem

1
@CSB Es treten Randeffekte auf, unabhängig davon, ob Sie NoData und ein verkleinertes Viertel verwenden oder ob Sie die Form / Position Ihres Viertels ändern, um die Größe sicherzustellen. Zumindest mit dem ersteren werden Sie keine randnahen Daten auf nicht transparente Weise überabtasten / darstellen. Dies ist Teil des berüchtigten Problems der Modifizierbaren Flächeneinheit.
WhiteboxDev

Antworten:


0

Der obige Code ist die endgültige und unvollständige Antwort, die ich für dieses Problem gefunden habe. Am Ende dachte ich, der beste Ansatz wäre, eine kreisförmige Nachbarschaft zu verwenden und die Fläche zu berechnen, die meine "verfügbare" Fläche schneidet. (Eine kreisförmige Nachbarschaft würde ohnehin die n am nächsten gelegenen Zellen ergeben - mit Cellular Automata müssen Sie also nicht allzu ausgefallen sein.) Wenn die Fläche zu klein war, vergrößerte ich den Kreis nur, bis dies nicht mehr der Fall war.

Es hat gut funktioniert, aber, wie ich bemerkte, war es sehr langsam. In diesem Thread finden Sie Vorschläge zur Beschleunigung. Maximierung der Code-Leistung für Shapely . Ich bin den Vorschlägen gefolgt, die zu diesem Thread " Grundlegendes zur Verwendung von räumlichen Indizes" geführt haben . Am Ende habe ich keinen R-Tree angelegt, weil ich den Code eigentlich nie benutzt habe. Ich fand heraus, dass ich das Problem von einem ganz anderen Standpunkt aus angehen und mir viel Zeit und Energie sparen konnte, also tat ich es. Vielleicht beende ich es eines Tages ...


Wenn Sie Ihren Code lesen, besteht eine gute Chance, dass ein räumlicher Index den Code beschleunigt, was häufig dramatisch ist. Das Ausführen von Kreuzungen mit einem solchen MultiPolygon ist sehr langsam.
Snorfalorpagus

@Snorfalorpagus Ja, wenn Sie sich die Antwort ansehen, dann verweise ich auf zwei weitere Themen, die sich auf diese Frage beziehen. Beide diskutieren die Verwendung eines räumlichen Index.
CSB
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.