Kıyı şeridiyle sınırlı alan arabellekleri oluşturma


10

Önceden tanımlanmış bir alana (örneğin 400 km2) dayalı bir nokta tampon oluşturmak için ArcGIS 10.2 kullanmaya çalışıyorum. Bundan başka, bazı noktaların tamponları, tamponların sahil şeridinde kırpılmasını gerektiren sahil şeridine yakındır ve hala iç kısımlarla aynı alana sahiptir (400 km2).

Herkes bunun Model Builder veya Arcpy ile nasıl yapılabileceğini biliyor mu?

Arcpy ve R ile sınırlı becerilerim var, ancak bunun için bir çözüm bulmak için bazı komut dosyaları üzerinde çalışmaktan memnuniyet duyarım.

Lütfen elde etmeye çalıştığım şeyin grafik temsilini gösteren aşağıdaki resme bakın

[1]


2
Kelimelerde anlatmaya çalıştığınız şeyin bir resmini ekleyebilir misiniz?
PolyGeo

Kestikten sonra alanları nasıl büyütürdünüz? Tamponun yarıçapını genişleterek?
Peter Horsbøll Møller

Yanıtlar:


15

Dairesel bir tamponun alanı, tampon yarıçapının monoton olarak artan bir fonksiyonudur (yine de düzlemsel bir koordinat sisteminde). Böylece basit bir arama stratejisi, çokgen bölgeye kırpılmış Ryarıçap tamponunun alanı ( bazı toleranslara kadar) olacak şekilde bir yarıçap bulabilir .RAs

En basit arama algoritması sadece bir ikili arama olacaktır. İstediğiniz alan, bu yarıçapların kırpılmış arabelleklerinin alanı arasında bir yer olacak şekilde iki küçük yarıçapla başlayın. Ardından, bunların orta noktasını alın ve tampon alanlarını hesaplayın ve istediğiniz yarıçapın orta noktanın üstünde mi altında mı olduğunu bulun. Özel alan sınırlarınızı güncelleyin ve istediğiniz alana tolerans gösterene kadar tekrarlayın.

Python'da bir ikili arama yazmak ve ArcGIS Python API'sini kullanmak öğrenmek için iyi bir yol gibi geliyor! Bunu yıllar önce R'de yaptığımdan eminim ...

İşte bazı R kodu:

cropareabuff <- function(pt, region, target){
    f = function(r){
        b = rgeos::gBuffer(pt, width=r)
        return(gArea(gIntersection(b, region)) - target)
    }
    f
}

buff_with_area <- function(pt, region, target, lower, upper){
    f = cropareabuff(pt, region, target)
    r = uniroot(f, lower=lower, upper=upper, extendInt="upX")
    list(r=r, b=gIntersection(rgeos::gBuffer(pt, width=r$root), region))
}

Kullanımı:

İlk önce basit bir İngiltere poligonal bölgesi kurun:

library(raster); library(rgeos); library(rgdal)
uk = getData("GADM", country="GBR", level=0)
uk = spTransform(uk,CRS("+init=epsg:27700"))
uk = gSimplify(uk, tol=1000)

Şimdi bir nokta tanımlayın:

p = SpatialPoints(coords=list(x=269042, y=235937), proj4string=CRS("+init=epsg:27700"))

Sonra sadece:

b = buff_with_area(p, uk, 10000000000, 1, 10000)

Bu, iki bileşenli bir listedir b, arabellektir:

plot(b$b, col=2)
plot(uk, add=TRUE)

ve doğru alana sahip:

gArea(b$b)
[1] 1e+10

ve arabellek yarıçapı değerini içeren rçıktıdır uniroot.

> b$r$root
[1] 63338.88

Bu durumda tampon genişliği 64km'nin biraz altındaydı.

Burada uğraşacak tek şey, alt ve üst başlangıç ​​değerleridir - Sanırım daha düşük bir yarıçapı sezgiselleştirebilirsiniz sqrt(A/pi)ve üst, arama algoritması aralığı yakalayana kadar artıracağı için önemli değildir.

İlk maksimum yarıçap gerçekten çok büyükse arama algoritması başarısız olabilir, çünkü tüm bölgenizi büyük bir yarıçapla tamponluyor olabilirsiniz, bu durumda yarıçapı değiştirmek alanı değiştirmeyecektir ... Ancak mantıklı sınırlar bu durumu durdurmalıdır.


Bunu R'de nasıl yaptın? R'de biraz deneyimim olduğunu belirtmeyi unuttum, bu yüzden R'yi de kullanarak bir çözüm umursamadım.
Funkeh-Monkeh

rgeosPaketi ve onun gBufferfonksiyonu, büyük olasılıkla ...
Spacedman

Aslında bir yalan söylüyorum, bir QGIS eklentisi olarak Python'da böyle bir şey uyguladım - tamponlu poli orijinal poligonun alanı 2x (veya Nx) olana kadar çokgenleri arabelleğe aldı. Yine de aynı arama algoritması.
Spacedman

+1. Kodda gösterilen yaklaşımın avantajları R(a) CBS hesaplamalarını arama mantığından ayırır ve (b) unirootoptimize edilmiş ve test edilmiş arama algoritmalarından (inç ) büyük harf kullanır - bir tane yazmak zorunda değilsiniz kendiniz (ve muhtemelen en verimli olmayacak).
whuber

Scipy'nin optimizasyon modülünde benzer kök bulma algoritmalarını uyguladığından şüpheleniyorum: docs.scipy.org/doc/scipy/reference/optimize.html (evet,? Uniroot Brent'ten bahsediyor, scipy'nin Brent-ish işlevleri var)
Spacedman

1

Puanların konumu nedeniyle neredeyse imkansız. 400km 2'lik tamponlar oluşturabilirsiniz , ancak kıyı şeridine daha yakın olan noktalar uzaktaki alanlara kıyasla her zaman daha küçük bir alana sahip olacaktır (> 400km 2 ).

Yapabileceğiniz tek şey gerçekleştirmek yapmak olduğunu tampon analizi noktalarında ve klip sonradan kıyı özelliğiyle oluşturulan tampon.


2
Bu imkansız olmayabilir , ancak çözümü karıştırabilecek bir NP Complete problemi olabilir. Alanı mükemmel hale getirmek meydan okumadır (yaklaşmak için iterasyonların puanlarını alabilir).
Vince

3
İmkansız değil ve hatta zor değil!
Spacedman
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.