R'de Çokgen şekil dosyası kullanarak Rasterden Raster çıkarın


13

R için yeni ve raster paketini kullanıyorum. Varolan bir raster dosyasından çokgenler ayıklanırken bir sorunum var. Kullanırsam

extract(raster, poly_shape)

Rasterdeki fonksiyon her zaman verilerle bir liste oluşturur. Gerçekten istediğim, ArcGIS ile tekrar yükleyebileceğim başka bir raster dosyasını ayıklamak. Biraz daha okuduktan sonra kırpma fonksiyonunun gerçekten ihtiyacım olduğunu düşünüyorum. Ama bu işlevi kullanmaya çalıştığımda

crop(raster, poly_shape)

Bu hatayı alıyorum:

Error in .local(x, y, ...) : extents do not overlap
In addition: Warning message:
In intersect(extent(x), extent(y)) : Objects do not overlap

Raster ve poly_shape dosyaları her iki işlev için aynıdır. Burada neyin yanlış olabileceğini söyleyebilir misin? Kırpma işlevinin liste değil başka bir tarama oluşturması doğru mu?

EDIT : scope () işlevi benim için çalışmıyor. Ben hala aynı hatayı alıyorum. Ama 2 veri kümesinin çakıştığından eminim! İle

extract(raster, poly_shape)

Ondan doğru verileri alıyorum. Sadece bir liste gibi ve istediğim gibi bir tarama değil. Daha önce ArcGIS'deki veri kümelerini yükledim ve çok iyi uyuyorlar, bu yüzden projeksiyonu kontrol etmedim. Şimdi denedim

projection(raster) # "+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs"
projection(poly_shape) # "+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs"

ve projeksiyonların uymadığını görebilirsiniz. Extract işlevi, dosyaları otomatik olarak doğru şekilde dönüştürebiliyor gibi görünüyor. Bunu biliyorum çünkü aşağıdakileri yaptım:

  • ArcGIS'de de R'de çıkarılan poligonun tam kısmını kestim
  • Ekstre edilen R poligonunun (liste) tüm değerlerinin toplamını hesapladım
  • ArcGIS'de kestiğim tüm tarama hücrelerinin toplamını hesapladım

2 aynı sonucu var bu yüzden sonuç ayıklama işlevi doğru çalışması olması gerektiğini düşünüyorum. Şimdi sanırım 2 seçeneğim var:

  1. Raster'ı tekrar çıkarılan listeden çıkarmanın bir yoluna ihtiyacım var veya
  2. 2 veri kümesinin (raster + poly_shape) aynı önlemi kullanması gerekir ve kırpma işlevi çalışmalıdır

Burada ne yapmayı önerirsiniz?


Ya 4 bant rgbi raster ise? Gruplar şu ana kadar kayboldu ...
Doris

GIS SE'ye Hoşgeldiniz! Yeni bir kullanıcı olarak, lütfen kısa tura katıldığınızdan emin olun . Ardından, ek bilgi ve referanslar sağlamak için yanıtınızı düzenlemeyi düşünün. Bkz. İyi bir cevabı nasıl yazarım? daha fazla bilgi için.
Andy

Yeni bir sorunuz varsa, lütfen Soru Sor düğmesini tıklayarak sorun . Bağlam sağlamaya yardımcı oluyorsa bu soruya bir bağlantı ekleyin. - Şu kaynaktan
Erik

Yanıtlar:


19

Çıkartma işlevi tam olması gerektiği gibi davranıyor. Kırpma işlevini çokgenin kapsamını kullanmaya zorlayabilir ve ardından nesneyi çokgen alanını temsil eden tam raster döndürmek için maskeleyebilirsiniz. Hatayı almaya devam ederseniz, aslında verileriniz çakışmaz.

Lütfen R'nin "anında" projeksiyon yapmadığını unutmayın, bu yüzden projeksiyonlarınızı kontrol edin. "Kapsam ()" işlevini kullanarak uzantılarınızın çakışıp çakışmadığını kontrol edebilirsiniz.

Burada çokgen genişliğini kullanarak kırpma ve ardından "rasterleştirilmiş" çokgen kullanarak elde edilen raster maskeleme örneği.

# Add required packages
require(raster)
require(rgeos)
require(sp)

# Create some data using meuse 
data(meuse)
  coordinates(meuse) <- ~x+y
    proj4string(meuse) <- CRS("+init=epsg:28992")
data(meuse.grid)
  coordinates(meuse.grid) = ~x+y
    proj4string(meuse.grid) <- CRS("+init=epsg:28992")
      gridded(meuse.grid) = TRUE    
        r <- raster(meuse.grid) 
          r[] <- runif(ncell(r))

# Create a polygon
f <- gBuffer(meuse[10,], byid=FALSE, id=NULL, width=250, 
                         joinStyle="ROUND", quadsegs=10)   

# Plot full raster and polygon                       
plot(r)
  plot(f,add=T)

# Crop using extent, rasterize polygon and finally, create poly-raster
#          **** This is the code that you are after ****  
cr <- crop(r, extent(f), snap="out")                    
  fr <- rasterize(f, cr)   
    lr <- mask(x=cr, mask=fr)

# Plot results
plot(lr)
  plot(f,add=T)

4
özü () yok sinek reprojection gerçekleştirmek, ancak ekin () değil. Bu biraz karışıklık olabilir
mdsumner

@ Jefferey kırpma () ve maske () rasterleri yalnızca çokgenin dikdörtgen genişliklerine göre klipsleyin, çokgenin sınırları içinden kırpmaz. Hangi komutların verilen çokgenin sınırları dahilindeki rasterleri kırpabileceği hakkında bir fikrin var mı?
csheth

1
@Chintan Sheth, maskenin çokgen içinde alt kümeye ayarlanması için, çokgen içindeki değerleri temsil eden bir rasterinizin olması gerekir. Bu yüzden alt küme çokgenini rasterleştirin ve sonra maskeleyin. Kırpma adımı, raster boyutunu, geçmişte atlanırsa bir dereceye kadar uyumsuzluk hatası atacak olan alt küme poligonu ile aynı seviyeye düşürmektir.
Jeffrey Evans

spTransformden sp(zaman zaman otomatik olarak diğer mekansal R paketleri ile yüklenir) paketi yeniden projeksiyon sağlar hem de dosya aynı projeksiyon örneğin içindedir, böylece. good_poly=spTransform(spolygon, CRSobj=crs(raster_file))
user3386170

@ user3386170, Ha? Ne elde ettiğinden emin değilim. Bu soru, raster paketinin bazı fonksiyonlarına "sinek projeksiyonunda" eklediği bir zamanda ortaya çıktı. Bu işlevler, projeksiyonlar eşleşmediğinde daha önce bir hata atmıştı, ancak bu yazı 2014'ten geliyordu. Ayrıca, sahne arkasına ek, önemli, işlevsellik eklediğinden sp :: spTransform () kullanırken her zaman rgdal yüklediğinin farkında olmalısınız.
Jeffrey Evans

8

Aslında aradığım şey işlevdi mask().

mask(raster, poly_shape)

hatasız çalışır ve aradığım şeyi döndürür.


2
Verilerinizi aynı projeksiyon alanında olacak şekilde yeniden projekte edin. Anında projeksiyonun otomatik olduğu ArcGIS'de bile, farklı projeksiyonlarda analiz yapmak çok kötü bir uygulamadır. Farklı projeksiyonlardaki verilerle, veriler, aldığınız hata olan ortak uzantıları paylaşmaz.
Jeffrey Evans

Raster kırpma miktarını elde etmek için projectExtent () kullanın.
mdsumner

Sitenin Soru-Cevap biçimine sığdırmak için, bu sorunun ana gövdesine bir düzenleme / güncelleme olarak yerleştirilmelidir (ve daha sonra bakmak için daha fazla şey olduğunu bilmeleri için "yanıt" olan cevaba bir yorum ekleyin).
matt wilkie

@mattwilkie Biçime uymadığım için üzgünüm, ancak metnim buraya yorum yapmak için çok uzundu. : @JeffreyEvans Ben aşağıdaki çalıştı projection(raster) = projection(poly_shape)etrafında ve başka bir şekilde projection(poly_shape) = projection(raster)ama her iki yönde aynı hatayı üretir: Error in .local(x, y, ...) : extents do not overlap In addition: Warning message: In intersect(extent(x), extent(y)) : Objects do not overlap. Extract () işlevini kullanarak hangi projeksiyonun anında kullanıldığını görebilmemin bir yolu var mı?
Lars

1
Aslında aradığım mask () işlevi oldu. mask(raster, poly_shape)hatasız çalışır ve aradığım şeyi döndürür.
Lars

-1

Kapsamı gayet iyi çalışıyor ... Sanırım sizin dereceniz Xmin, Xmax, Ymin ve Ymax, rasterinizin X ve Y'sinden farklı - yani tam tersi

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.