특별한 이웃을위한 초점 통계 계산?


18

지정된 기준 근처에서 래스터의 각 셀에 대한 초점 통계를 계산하려고합니다.

배경-나는 단일 식물 유형의 관심을 나타내는 3 개의 이진 래스터를 가지고 있습니다. 연구 지역에있는 어떤 세포 (가까운 지역의 합계 / 총 세포)에서 20 km ^ 2 이내의 각 초목 유형의 적용 범위 백분율을 계산하고 싶습니다. 문제는 각 셀 주위에 간단한 원이나 사각형 이웃을 사용할 수 없다는 것입니다. 왜냐하면 내가 계산하면 합계를 계산하는 데 사용되는 검색 영역이 연구 영역 외부의 영역을 포함하기 때문입니다. 이 예외는 통계가 서식지 모델의 입력으로 사용되며 연구 지역 외부의 지역은 가능한 서식지로 간주 될 수 없으므로 도시화되어 있기 때문에 중요합니다. 그것들을 포함 시키면 나에게 잘못된 통계를 줄 것이다. 그래서 내가 뭘N 내 기준을 충족 내 원하는 지역의 크기에 상당하는 영역)을 커버하기 위해 필요한 셀들의 개수에 의해 결정된다. 그들이 도시화 된 지역에 속하지 않는 기준. 나는 어떤 형태의 세포 오토마타를 사용해야한다고 생각합니다. 그래도 CA와 함께 일한 적이 없습니다.

내가 원하는 것은 스타터 코드 또는 올바른 방향의 포인트와 같은 것 같습니다.


코멘트에 답하십시오 :

내 연구 사이트의 경계에있는 셀에 대해이 통계를 계산한다고 가정 해 봅시다. 연구 영역 외부의 모든 영역을 0에 할당하거나 NoData를 무시하면 관심있는 영역 범위의 대략 절반을 나타내는 통계를 얻게됩니다. 따라서 ~ 10km ^ 2 영역의 백분율 범위 , 20km ^ 2 면적 대신. 나는 가정 범위 크기를 공부하고 있기 때문에 이것이 중요합니다. 동물이 풍경을 보거나 사용하는 방식이기 때문에 이웃은 모양을 바꿔야합니다. 20km ^ 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

@CSB jbchurchill이 옳습니다. 여기서 가장 좋은 방법은 학습 영역 외부에 NoData 값을 할당하는 것입니다. Focal Stats 도구는 이러한 nodata 값을 적절하게 처리 할 수 ​​있습니다. 'NODATA의 처리 세포'를 참조하십시오 여기 resources.arcgis.com/en/help/main/10.1/index.html#//...
WhiteboxDev

@WhiteboxDev-귀하의 제안으로 문제가 해결되지 않습니다. 위의 내용을 편집하고 왜 작동하지 않는지 설명하겠습니다.
CSB

가변 반경 ( gis.stackexchange.com/questions/34306/… )에서 초점 통계 사용에 대해 설명하는이 게시물을 보셨습니까 ? 이것은 당신의 문제인 것 같습니다-가장자리의 셀은 반경이 커서 반원형 이웃 만 고려해야합니다. 물론 셀 크기에 따라 선택할 수있는 많은 래스터를 만들어야 할 수도 있습니다.
phloem

1
@CSB NoData와 축소 된 이웃을 사용하는지 또는 이웃의 모양 / 배치를 변경하여 크기를 보장하는지에 관계없이 가장자리 효과가 발생합니다. 적어도 전자의 경우 투명하지 않은 방식으로 니어 에지 데이터를 오버 샘플링 / 표현하지 않습니다. 이것은 악명 높은 수정 가능한 영역 단위 문제의 일부입니다.
WhiteboxDev

답변:


0

위의 코드는 최종적으로 불완전 하며이 문제에 대한 답변입니다. 결국 가장 좋은 방법은 원형 이웃을 사용하고 "사용 가능한"영역과 교차하는 영역을 계산하는 것이라고 생각했습니다. (원형 이웃은 어쨌든 n ~ 가장 가까운 세포를 줄 것이므로 Cellular Automata로 너무 화려 할 필요는 없습니다.) 면적이 너무 작 으면 원이 아닌 때까지 원을 자랐습니다.

그것은 잘 작동했지만 내가 지적했듯이 매우 느 렸습니다. 속도를 높이는 방법에 대한 제안은이 스레드를 참조하십시오. 매끈한 코드 성능 극대화 . 이 제안 에 따라이 스레드 가 공간 인덱스 사용 이해 로 이어졌습니다 . 실제로 코드를 사용하지 않았기 때문에 결국 r-tree를 적용하지 않았습니다. 나는 완전히 다른 각도에서 문제에 접근하고 많은 시간 / 에너지를 절약 할 수 있다는 것을 알았습니다. 아마 언젠가는 끝내 겠지 ...


코드를 읽으면 공간 인덱스를 사용하면 코드 속도가 크게 향상 될 가능성이 높은 것처럼 보입니다. 이와 같은 MultiPolygon에 대한 교차를하는 것은 매우 느립니다.
Snorfalorpagus

@ Snorfalorpagus 예, 대답을 보면이 질문과 관련된 두 개의 다른 스레드를 가리 킵니다. 둘 다 공간 인덱스 사용에 대해 설명합니다.
CSB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.