Расчет фокальной статистики для особых районов?


18

Я рассчитываю рассчитать фокальную статистику для каждой ячейки растра в окрестности указанного критерия.

Справочная информация - у меня есть три бинарных растра, каждый из которых представляет один интересующий тип растительности. Я хотел бы рассчитать процент покрытия каждого типа растительности в пределах (например) 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

К сожалению, это невероятно медленно.


1
это интересная проблема. Вы можете установить для всех ячеек за пределами учебной зоны значение NoData, но я не знаю, как вы когда-нибудь добьетесь, чтобы окрестности адаптировались и сохраняли тот же размер 20 кв. Км (это должно было бы изменить форму).
jbchurchill

@CSB jbchurchill прав, лучшее, что можно сделать здесь, это назначить значения NoData за пределами вашей учебной области. Инструмент Focal Stats может соответствующим образом обрабатывать эти значения узлов. См. «Обработка ячеек NoData» здесь resources.arcgis.com/en/help/main/10.1/index.html#//…
WhiteboxDev

@WhiteboxDev - Ваше предложение не решит мою проблему. Я отредактирую вышеизложенное и объясню, почему это не сработает.
ЦСУ

Вы видели этот пост, в котором обсуждается использование Focal Statistics с переменным радиусом ( gis.stackexchange.com/questions/34306/… )? Похоже, это ваша проблема - ячейки на краю должны иметь большой радиус и учитывать только полукруглую окрестность. Конечно, в зависимости от размера вашей ячейки вам может потребоваться создать множество растров на выбор.
флоэма

1
@CSB Вы столкнетесь с краевыми эффектами независимо от того, используете ли вы NoData и уменьшенную окрестность или если вы измените форму / расположение своей окрестности, чтобы обеспечить размер. По крайней мере, в первом случае вы не будете чрезмерно дискретизировать / представлять данные на периферии непрозрачным образом. Это часть печально известной проблемы изменяемого ареала.
WhiteboxDev

Ответы:


0

Приведенный выше код является возможным и несовершенным ответом, который я нашел для этой проблемы. В конце я подумал, что лучше всего использовать круговую окрестность и вычислить площадь, пересекающую мою «доступную» область. (Круглая окрестность в любом случае дала бы n ближайших ячеек - так что не нужно слишком увлекаться клеточными автоматами.) Если площадь была слишком маленькой, я просто увеличивал круг, пока его не было.

Это работало хорошо, но, как я заметил, это было очень медленно. Посмотрите эту ветку для предложений о том, как ускорить его. Максимизация производительности кода для Shapely . Я последовал советам, которые привели к этой теме. Понимание использования пространственных индексов . Я не стал применять r-дерево в конце концов, потому что я никогда не использовал код. Я обнаружил, что могу подойти к проблеме с совершенно другой точки зрения и сэкономить много времени и энергии, поэтому я и сделал. Может быть, я закончу это однажды ...


Читая ваш код, похоже, что есть хороший шанс, что использование пространственного индекса может ускорить код, часто очень значительно. Делать пересечения с MultiPolygon очень медленно.
Снорфалорпаг

@Snorfalorpagus Да, если вы посмотрите на ответ, я укажу на две другие темы, связанные с этим вопросом. Оба обсуждают использование пространственного индекса.
ЦСБ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.