Özel Mahalle için Odak İstatistikleri Hesaplama?


18

Belirli bir ölçütlerin bir mahallede, bir raster her hücre için odak istatistiklerini hesaplamak için arıyorum.

Arka Plan - Her biri tek bir bitki türünü temsil eden üç ikili rasterim var. Çalışma alanımdaki herhangi bir hücrenin (örneğin, mahalledeki toplam / toplam hücre) 20 km ^ 2 içindeki her bitki örtüsü tipinin kapsama yüzdesini hesaplamak istiyorum. Sorun şu ki, her hücrenin çevresinde basit bir daire veya kare mahalle kullanamıyorum çünkü eğer yapsaydım, toplamı hesaplamak için kullanılan arama alanı çalışma alanım dışındaki alanları içerecekti. Bu istisna önemlidir, çünkü istatistikler bir habitat modeli için girdi olarak kullanılacaktır ve çalışma alanım dışındaki alanlar olası habitat olarak kabul edilemez - kentleştirilmiştir. Bunları dahil etmek bana hatalı istatistikler verecektir. Peki, benn , ölçütlerimi karşılayan istenen mahalle büyüklüğüme eşit bir alanı kaplamak için gereken hücre sayısına göre belirlenir. Kriterler, kentleşmiş bir alana girmemeleri. Bir çeşit hücresel otomatın kullanılması gerektiğini düşünüyorum. CA ile hiç çalışmadım.

Sanırım istediğim başlangıç ​​kodu gibi bir şey ya da doğru yönde bir nokta.


AŞAĞIDAKİ YORUM:

Diyelim ki çalışma alanımın sınırındaki bir hücre için bu istatistiği hesaplıyorum. Çalışma alanım dışındaki tüm alanları sıfıra atarsam (veya NoData'yı yoksayarsam), ilgilendiğim alan kapsamının yaklaşık yarısını temsil eden bir istatistik alırım. Yani, ~ 10 km ^ 2 alandaki kapsama yüzdesi yüzdesi , 20 km ^ 2 alan yerine. Ev tipi boyutları üzerinde çalıştığım için bu önemlidir. Mahalle şekli değiştirmek zorunda, çünkü hayvan manzarayı böyle görüyor / kullanıyor. 20 km ^ 2'ye ihtiyaç duyarlarsa, şekli veya kendi ülkelerini değiştireceklerdir. NoData'yı yoksay seçeneğini işaretlemezsem, hücre çıktısı NoData olur ve NoData yardım etmez.


24.09.2014 itibarıyla "İLERLEME"

Şimdiye kadar Shapely ve Fiona kullanarak bulduğum kod:

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

Ne yazık ki, inanılmaz derecede yavaş.


1
bu ilginç bir problem. Çalışma alanınızın dışındaki tüm hücreleri NoData'ya ayarlayabilirsiniz, ancak aynı 20 kilometrekare büyüklüğünü (şekli değiştirmek zorunda kalacak) adapte etmek ve korumak için nasıl bir mahalle alacağınızı bilmiyorum.
jbchurchill

@CSB jbchurchill doğru, burada yapılacak en iyi şey NoData değerlerini çalışma alanınızın dışına atamaktır. Odak İstatistikleri aracı bu düğüm değerlerini uygun şekilde ele alabilir. 'NODATA işleme hücrelerini' bakın burada resources.arcgis.com/en/help/main/10.1/index.html#//...
WhiteboxDev

@WhiteboxDev - Öneriniz sorunumu çözmeyecek. Yukarıdakileri düzenleyeceğim ve neden işe yaramayacağını açıklayacağım.
CSB

Değişken bir yarıçapla ( gis.stackexchange.com/questions/34306/… ) Odak İstatistiklerini kullanmayı tartışan bu yayını gördünüz mü ? Bu sizin sorununuz gibi görünüyor - kenardaki hücreler geniş bir yarıçapa sahip olmalı ve sadece yarım daire biçimli bir mahalleyi düşünmelidir. Tabii ki, hücre büyüklüğünüze bağlı olarak, aralarından seçim yapabileceğiniz birçok, birçok raster oluşturmanız gerekebilir.
phloem

1
@CSB NoData ve küçülmüş bir mahalle kullansanız da, boyut sağlamak için mahallenizin şeklini / yerleşimini değiştirseniz de, kenar efektleriyle karşılaşacaksınız. En azından öncekiyle, yakın verileri şeffaf olmayan bir şekilde örneklemeyecek / temsil etmeyeceksiniz. Bu rezil Değiştirilebilir Alan Birimi Sorununun bir parçasıdır.
WhiteboxDev

Yanıtlar:


0

Yukarıdaki kod, nihai ve kusurlu cevap bu sorun için geldi. Sonunda en iyi yaklaşımın dairesel bir mahalle kullanmak ve "mevcut" alanımla kesişen alanı hesaplamak olduğunu düşündüm. (Dairesel bir mahalle zaten en yakın hücreleri verir - bu nedenle, Hücresel Otomata ile çok süslü olmanıza gerek yoktur.) Alan çok küçükse, daireyi henüz büyüyene kadar büyüttüm.

İyi çalıştı ama belirttiğim gibi çok yavaştı. Hızlandırmayla ilgili öneriler için bu konuya bakın. Kod Performansını Düzgün Şekilde En Üst Düzeye Çıkarmak . Ben bu konuya neden önerileri takip Kayma dizinler Kullanımı anlama . Sonunda bir r-ağacı uygulayamadım, çünkü aslında kodu hiç kullanmadım. Soruna tamamen farklı bir açıdan yaklaşabileceğimi ve kendime çok fazla zaman / enerji kazandırabileceğimi öğrendim, öyle yaptım. Belki bir gün bitiririm ...


Kodunuzu okumak, uzamsal bir dizin kullanmanın, kodu genellikle dramatik bir şekilde hızlandırabilme şansının yüksek olduğu anlaşılıyor. Böyle bir MultiPolygon ile kesişme yapmak çok yavaştır.
Snorfalorpagus

@Snorfalorpagus Evet, cevaba bakarsanız, bu soruyla ilgili diğer iki konuya işaret ediyorum. Her ikisi de bir uzamsal indeks kullanarak tartışırlar.
CSB
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.