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.
Jawaban:
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 ...
sumber