Я хочу розраховувати фокальну статистику для кожної комірки растру в межах окреслених критеріїв.
Передумови - у мене є три бінарні растри, кожна з яких представляє один цікавий тип рослинності. Я хотів би обчислити відсоткове покриття кожного типу рослинності в межах (наприклад, 20 км ^ 2 будь-якої клітини в моєму досліджуваному районі (сума / загальна кількість клітин в околицях). Проблема полягає в тому, що я не можу використовувати просте коло або квадратний мікрорайон навколо кожної комірки, тому що, якби я зробив, область пошуку, яка використовується для обчислення суми, включала б зони, що не входять до моєї області дослідження. Цей виняток важливий, оскільки статистика буде використовуватися як вхідні дані для моделі середовища проживання, а райони поза моєю дослідницькою територією не можуть вважатися можливими місцями існування - вони урбанізовані. Включення їх до мене дасть помилкову статистику. Отже, що яn визначається кількістю комірок, необхідних для покриття площі, що дорівнює бажаному розміру мікрорайону), які відповідають моїм критеріям. Критеріями є те, що вони не потрапляють до урбанізованої території. Я думаю, що слід використовувати якусь форму стільникових автоматів. Я ніколи не працював з CA.
Я здогадуюсь, що мені хотілося б щось на кшталт початкового коду чи точки у правильному напрямку.
ВІДПОВІДАЙТЕ НА КОМЕНТАРИ Знизу:
Скажімо, я обчислюю цю статистику для комірки на межі мого сайту дослідження. Якщо я призначу всі області поза моєю дослідницькою областю до нуля (або проігнорувати NoData), я отримаю статистику, яка представляє приблизно половину покриття, яке мене цікавить. Отже, відсоткове покриття в області ~ 10 км ^ 2 , замість 20 км ^ 2 площі. Оскільки я вивчаю розміри домашнього асортименту, це важливо. Район повинен змінити форму, оскільки саме так тварина розглядає / використовує ландшафт. Якщо їм потрібно 20 км ^ 2, вони змінять форму або свою домашню територію. Якщо я не перевіряю ігнорувати NoData, вихід клітинки буде NoData - і NoData не допоможе.
"ПРОГРЕС" АС 24.10.2014
Ось код, який я придумав поки що за допомогою Shapely і 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
На жаль, це НЕВЕРДІЛЬНО повільно.