我正在寻找在指定条件附近的栅格中每个像元的焦点统计信息。
背景-我有三个二进制栅格,每个栅格代表一种感兴趣的植被类型。我想计算研究区域内任何单元格(例如,总和/总单元格)在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
不幸的是,这太慢了。