Menghitung Statistik Fokus untuk Lingkungan Khusus?

18

Saya mencari untuk menghitung statistik fokus untuk setiap sel raster, dalam lingkungan kriteria tertentu.

Latar belakang - Saya memiliki tiga raster biner, masing-masing mewakili satu jenis vegetasi yang menarik. Saya ingin menghitung cakupan persen dari setiap jenis vegetasi dalam (misalnya) 20 km ^ 2 sel di daerah studi saya (jumlah / total sel di lingkungan). Masalahnya adalah bahwa saya tidak dapat menggunakan lingkungan lingkaran atau persegi sederhana di sekitar setiap sel karena, jika saya melakukannya, area pencarian yang digunakan untuk menghitung jumlah akan memasukkan area di luar area studi saya. Pengecualian ini penting karena statistik akan digunakan sebagai input untuk model habitat, dan area di luar area studi saya tidak dapat dianggap sebagai habitat yang mungkin - mereka urbanisasi. Termasuk mereka akan memberi saya statistik yang salah. Jadi, apa yang aku ditentukan oleh jumlah sel yang diperlukan untuk mencakup area yang sama dengan ukuran lingkungan yang saya inginkan) yang memenuhi kriteria saya. Kriteria adalah bahwa mereka tidak termasuk dalam wilayah urban. Saya berpikir bahwa beberapa bentuk automata seluler harus digunakan. Saya belum pernah bekerja dengan CA.

Saya kira apa yang saya suka adalah sesuatu seperti kode pemula, atau titik di arah yang benar.


JAWABKAN DENGAN KOMENTAR DI BAWAH INI:

Katakanlah saya sedang menghitung statistik ini untuk sel di batas situs studi saya. Jika saya menetapkan semua area di luar area studi saya ke nol (atau mengabaikan NoData), maka saya akan mendapatkan statistik yang mewakili kira-kira setengah dari cakupan area yang saya minati. Jadi, persentase cakupan di area ~ 10 km ^ 2 , bukannya 20 km ^ 2 area. Karena saya sedang mempelajari ukuran jangkauan rumah, ini penting. Lingkungan harus berubah bentuk, karena itulah cara hewan memandang / menggunakan lanskap. Jika mereka membutuhkan 20 km ^ 2, mereka akan mengubah bentuk atau wilayah rumah mereka. Jika saya tidak mencentang abaikan NoData, output sel akan menjadi NoData - dan NoData tidak membantu.


"KEMAJUAN" PADA 10/24/2014

Berikut adalah kode yang saya buat sejauh ini menggunakan Shapely dan 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

Sayangnya, ini sangat lambat.

CSB
sumber
1
itu masalah yang menarik. Anda dapat mengatur semua sel di luar area studi Anda ke NoData, tetapi saya tidak tahu bagaimana Anda akan mendapatkan lingkungan untuk beradaptasi dan menjaga ukuran 20 km persegi yang sama (itu harus berubah bentuk).
jbchurchill
@CSB jbchurchill benar, hal terbaik untuk dilakukan di sini adalah menetapkan nilai-nilai NoData di luar area studi Anda. Alat Focal Stats dapat memperlakukan nilai nodata tersebut dengan tepat. Lihat 'Memproses sel NoData' di sini resources.arcgis.com/en/help/main/10.1/index.html#//…
WhiteboxDev
@WhiteboxDev - Saran Anda tidak akan menyelesaikan masalah saya. Saya akan mengedit di atas dan menjelaskan mengapa itu tidak berhasil.
CSB
Pernahkah Anda melihat posting ini, yang membahas menggunakan Statistik Focal dengan radius variabel ( gis.stackexchange.com/questions/34306/… )? Ini tampaknya menjadi masalah Anda - sel-sel di tepian harus memiliki jari-jari besar dan hanya mempertimbangkan lingkungan setengah lingkaran. Tentu saja, tergantung pada ukuran sel Anda, Anda mungkin harus membuat banyak raster untuk dipilih.
floem
1
@CSB Anda akan mengalami efek tepi terlepas dari apakah Anda menggunakan NoData dan lingkungan yang menyusut atau jika Anda mengubah bentuk / penempatan lingkungan Anda untuk memastikan ukuran. Setidaknya dengan yang pertama, Anda tidak akan oversampling / merepresentasikan data hampir-tepi secara tidak transparan. Ini adalah bagian dari Masalah Unit Areal Modifikasi yang terkenal.
WhiteboxDev

Jawaban:

0

Kode di atas adalah jawaban yang akhirnya, dan tidak sempurna, saya buat untuk masalah ini. Pada akhirnya saya pikir pendekatan terbaik adalah dengan menggunakan lingkungan melingkar dan menghitung area yang memotong area "tersedia" saya. (Lingkungan melingkar akan memberikan n ~ sel terdekat pula - jadi, tidak perlu terlalu suka dengan Cellular Automata.) Jika area itu terlalu kecil, saya hanya menumbuhkan lingkaran sampai tidak.

Itu bekerja dengan baik tetapi, seperti yang saya perhatikan, itu sangat lambat. Lihat utas ini untuk saran tentang cara mempercepatnya. Memaksimalkan Performa Kode untuk Shapely . Saya mengikuti saran, yang mengarah ke utas ini Memahami Penggunaan Indeks Spasial . Saya akhirnya tidak menerapkan r-tree pada akhirnya, karena saya sebenarnya tidak pernah berakhir menggunakan kode. Saya menemukan bahwa saya dapat mendekati masalah dari sudut yang sama sekali berbeda dan menghemat banyak waktu / energi, jadi saya melakukannya. Mungkin aku akan menyelesaikannya suatu hari ...

CSB
sumber
Membaca kode Anda sepertinya ada peluang bagus menggunakan indeks spasial yang bisa mempercepat kode, seringkali secara dramatis. Melakukan persimpangan terhadap MultiPolygon seperti itu sangat lambat.
Snorfalorpagus
@Snorfalorpagus Ya, jika Anda melihat jawabannya, saya arahkan ke dua utas lainnya yang terkait dengan pertanyaan ini. Keduanya membahas menggunakan indeks spasial.
CSB