Я рассчитываю рассчитать фокальную статистику для каждой ячейки растра в окрестности указанного критерия.
Справочная информация - у меня есть три бинарных растра, каждый из которых представляет один интересующий тип растительности. Я хотел бы рассчитать процент покрытия каждого типа растительности в пределах (например) 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
К сожалению, это невероятно медленно.
Ответы:
Приведенный выше код является возможным и несовершенным ответом, который я нашел для этой проблемы. В конце я подумал, что лучше всего использовать круговую окрестность и вычислить площадь, пересекающую мою «доступную» область. (Круглая окрестность в любом случае дала бы n ближайших ячеек - так что не нужно слишком увлекаться клеточными автоматами.) Если площадь была слишком маленькой, я просто увеличивал круг, пока его не было.
Это работало хорошо, но, как я заметил, это было очень медленно. Посмотрите эту ветку для предложений о том, как ускорить его. Максимизация производительности кода для Shapely . Я последовал советам, которые привели к этой теме. Понимание использования пространственных индексов . Я не стал применять r-дерево в конце концов, потому что я никогда не использовал код. Я обнаружил, что могу подойти к проблеме с совершенно другой точки зрения и сэкономить много времени и энергии, поэтому я и сделал. Может быть, я закончу это однажды ...
источник