计算特殊邻域的焦点统计?


18

我正在寻找在指定条件附近的栅格中每个像元的焦点统计信息。

背景-我有三个二进制栅格,每个栅格代表一种感兴趣的植被类型。我想计算研究区域内任何单元格(例如,总和/总单元格)在20 km ^ 2之内每种植被类型的覆盖率。问题是我不能在每个像元周围使用简单的圆形或正方形邻域,因为如果这样做,用于计算总和的搜索区域将包含我研究区域之外的区域。此例外非常重要,因为统计数据将用作栖息地模型的输入,并且不能将我研究区域之外的区域视为可能的栖息地-它们已被城市化。包括它们会给我错误的统计数据。所以,我n由覆盖符合我的标准的区域所需的像元数确定)。标准是它们不属于市区范围内。我在想应该使用某种形式的细胞自动机。我从来没有在CA工作过。

我想我想要的是入门代码,或指向正确方向的东西。


回复以下评论:

假设我正在为研究站点边界上的一个单元格计算此统计信息。如果我将研究区域以外的所有区域都分配为零(或忽略NoData),那么我将获得一个统计数据,该统计数据大约代表了我感兴趣的区域覆盖范围的一半。因此,在约10 km ^ 2的区域中,覆盖范围百分比,而不是20 km ^ 2的区域。由于我正在研究家庭范围的尺寸,因此这一点很重要。邻居必须改变形状,因为那是动物观看/使用景观的方式。如果他们需要20 km ^ 2,他们会改变形状或家园。如果我不检查忽略NoData,则单元格输出将为NoData-NoData没有帮助。


截至2014年10月24日的“进度”

这是到目前为止我使用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 2014年

@CSB jbchurchill是正确的,这里最好的做法是在您的学习区域之外分配NoData值。Focal Stats工具可以适当地处理这些nodata值。请参阅此处的“处理NoData的单元格” resources.arcgis.com/en/help/main/10.1/index.html#//…–
WhiteboxDev

@WhiteboxDev-您的建议不会解决我的问题。我将编辑上面的内容,并解释为什么它不起作用。
CSB

您是否看过这篇文章,其中讨论了如何使用半径可变的Focal Statistics(gis.stackexchange.com/questions/34306/…)?这似乎是您的问题-边缘的单元格应具有较大的半径,并仅考虑半圆形邻域。当然,取决于像元大小,您可能必须创建许多栅格以供选择。
韧皮部2014年

1
@CSB无论使用NoData和缩小的邻域,还是更改邻域的形状/位置以确保大小,您都会遇到边缘效果。至少对于前者,您不会以非透明方式对近边缘数据进行过采样/表示。这是臭名昭著的可修改地域单位问题的一部分。
WhiteboxDev

Answers:


0

上面的代码是最终的且不完善的答案,我是针对这个问题而提出的。最后,我认为最好的方法是使用圆形邻域并计算与“可用”区域相交的区域。(一个圆形的邻域无论如何都会给n个最接近的单元格-因此,不必太喜欢Cellular Automata。)如果面积太小,我就把圆圈长大,直到不是。

它运行良好,但正如我指出的那样,它非常缓慢。请参阅此主题以获取有关如何加快速度的建议。最大化形状代码的代码性能。我遵循了建议,该建议导致该主题了解空间索引的使用。我最终并没有最终应用r树,因为我实际上从未最终使用代码。我发现我可以从完全不同的角度解决问题,并节省很多时间/精力,所以我做到了。也许有一天我会完成...


阅读您的代码似乎很有可能使用空间索引来加速代码,通常速度非常快。像这样对MultiPolygon进行相交非常慢。
Snorfalorpagus

@Snorfalorpagus是的,如果您查看答案,我会指出与该问题相关的其他两个主题。两者都讨论使用空间索引。
CSB
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.