Розрахунок фокусної статистики для спеціального сусідства?


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 за межами вашого навчального району. Інструмент Фокусна статистика може належним чином обробити ці значення вузлів. Зверніться до розділу «Обробка клітин NoData» тут resources.arcgis.com/en/help/main/10.1/index.html # // ...
WhiteboxDev

@WhiteboxDev - Ваша пропозиція не вирішить мою проблему. Я відредагую вище та поясню, чому це не спрацює.
CSB

Ви бачили цю публікацію, в якій обговорюється використання фокусної статистики зі змінним радіусом ( gis.stackexchange.com/questions/34306/… )? Це, здається, є вашою проблемою - комірки на краю повинні мати великий радіус і враховувати лише півкругове сусідство. Звичайно, залежно від розміру вашої комірки, можливо, вам доведеться створити багато, багато растерів на вибір.
флоема

1
@CSB Ви будете стикатися з крайовими ефектами, незалежно від того, використовуєте ви NoData та зменшене сусідство чи зміните форму / розташування свого мікрорайону для забезпечення розміру. Принаймні, з попередніми, ви не будете перенапружувати / представляти дані крайових даних непрозорим чином. Це частина сумнозвісної проблеми "Модифікований ареальний блок".
WhiteboxDev

Відповіді:


0

Код, наведений вище, - це можлива і недосконала відповідь, що я придумав цю проблему. Зрештою, я подумав, що найкращим підходом є використання кругового мікрорайону та обчислення площі, що перетинає мою "доступну" площу. (Кругле сусідство все одно дасть n-найближчі клітини - значить, не потрібно надто захоплюватися Cellular Automata.) Якщо площа була занадто маленькою, я просто зростав коло, поки його не було.

Це працювало добре, але, як я зазначив, це було дуже повільно. Дивіться цю тему для пропозицій щодо її прискорення. Максимізація продуктивності коду для Shapely . Я дотримувався пропозицій, які призводять до цього потоку Розуміння використання просторових індексів . Я в кінцевому підсумку не застосував r-дерево в кінці кінців, тому що я насправді ніколи не закінчив використовувати код. Я дізнався, що можу підійти до проблеми з зовсім іншого кута і заощадити собі багато часу / енергії, так і зробив. Можливо, я закінчу його одного дня ...


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

@Snorfalorpagus Так, якщо ви подивитесь на відповідь, я вказую на дві інші теми, пов'язані з цим питанням. Обидва обговорюють, використовуючи просторовий індекс.
CSB
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.