特別な近傍の焦点統計の計算?


18

指定した基準の近傍内で、ラスターの各セルの焦点統計を計算しようとしています。

背景-3つのバイナリラスタがあり、それぞれが関心のある単一の植生タイプを表します。調査地域内のセル(近隣のセルの合計/合計)から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平方kmのサイズに適応し、維持するために近所をどのように取得するかわかりません(形状を変更する必要があります)。
jbchurchill 14年

@CSB jbchurchillは正しいです。ここで行う最善の方法は、調査エリア外にNoData値を割り当てることです。Focal Statsツールは、これらのnodata値を適切に処理できます。「のNoDataの処理セル」を参照してくださいここresources.arcgis.com/en/help/main/10.1/index.html#//...
WhiteboxDev

@WhiteboxDev-あなたの提案は私の問題を解決しません。上記を編集し、それがうまくいかない理由を説明します。
CSB 14年

可変半径(gis.stackexchange.com/questions/34306/…)でのFocal Statisticsの使用について説明しているこの投稿を見ましたか?これはあなたの問題のようです-エッジ上のセルは大きな半径を持ち、半円形の近傍のみを考慮する必要があります。もちろん、セルのサイズに応じて、選択する多数のラスターを作成する必要があります。
師部14年

1
@CSB NoDataと縮小された近傍を使用するかどうか、またはサイズを確保するために近傍の形状/配置を変更するかどうかに関係なく、エッジ効果に遭遇します。少なくとも前者では、不透明な方法でエッジに近いデータをオーバーサンプリング/表現することはありません。これは、悪名高い修正可能な面積単位問題の一部です。
WhiteboxDev 14年

回答:


0

上記のコードは、この問題のために私が思いついた、最終的な不完全な答えです。結局、最良のアプローチは円形の近傍を使用して、「利用可能な」エリアと交差するエリアを計算することだと思いました。(とにかく円形の近傍はnに最も近いセルを与えます-したがって、セルラーオートマトンを使いこなす必要はありません。)面積が小さすぎる場合は、それがなくなるまで円を成長させました。

それはうまくいきましたが、私が述べたように、それは非常に遅かったです。高速化する方法については、このスレッドを参照してください。Shapelyのコードパフォーマンスの最大化。私は提案に従って、このスレッドの空間インデックスの使用について理解しました。実際にコードを使用することはなかったため、最終的にrツリーを適用しませんでした。私はまったく別の角度から問題に取り組むことができ、多くの時間/エネルギーを節約できることがわかりました。たぶん私はそれを終わらせるでしょう...


コードを読むと、空間インデックスを使用することで、コードを大幅に高速化できる可能性が高いようです。そのようなMultiPolygonに対して交差を行うのは非常に遅いです。
Snorfalorpagus

@Snorfalorpagusはい、答えを見ると、この質問に関連する他の2つのスレッドを指しています。両方とも、空間インデックスの使用について説明します。
CSB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.