Wyodrębnij Raster z Rastra przy użyciu pliku kształtu Wielokąt w R

13

Jestem nowy w R i korzystam z pakietu rastrowego. Mam problem z wyodrębnieniem wielokątów z istniejącego pliku rastrowego. Jeśli użyję

extract(raster, poly_shape)

funkcja na rastrze zawsze tworzy listę z danymi. Naprawdę chcę wyodrębnić kolejny plik rastrowy, który mogę ponownie załadować za pomocą ArcGIS. Po przeczytaniu trochę więcej, myślę, że naprawdę potrzebuję funkcji przycinania. Ale kiedy próbuję użyć tej funkcji

crop(raster, poly_shape)

Otrzymuję ten błąd:

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

Pliki raster i poly_shape są takie same dla obu funkcji. Czy możesz mi powiedzieć, co może być nie tak? Czy to w porządku, że funkcja przycinania tworzy kolejny raster, a nie listę?

EDYCJA : Funkcja scope () nie działa dla mnie. Nadal pojawia się ten sam błąd. Ale jestem pewien, że 2 zestawy danych pokrywają się! Z

extract(raster, poly_shape)

Otrzymuję z tego odpowiednie dane. Tak jak lista, a nie raster jak ja chcę ją mieć. Właśnie załadowałem wcześniej zestawy danych do ArcGIS i pasują one bardzo dobrze, więc nie sprawdziłem projekcji. Teraz próbowałem

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"

i widać, że występy nie pasują. Wydaje się, że funkcja wyodrębniania może automatycznie przekształcać pliki we właściwy sposób. Wiem to, ponieważ wykonałem następujące czynności:

  • Dokładną część wielokąta wyciąłem w R również w ArcGIS
  • Obliczyłem sumę wszystkich wartości wyodrębnionego wielokąta R (lista)
  • Obliczyłem sumę wszystkich komórek rastrowych, które wyciąłem w ArcGIS

Te 2 mają dokładnie taki sam wynik, więc sądzę, że wniosek powinien być taki, że funkcja wyodrębniania działała poprawnie. Teraz mam chyba 2 opcje:

  1. Potrzebuję sposobu, aby ponownie usunąć Raster z wyodrębnionej listy lub
  2. Dwa zestawy danych (raster + poly_shape) muszą korzystać z tego samego prjection, a funkcja crop powinna działać

Co sugerowałbyś tutaj zrobić?

Lars
źródło
Co jeśli jest to 4-pasmowy raster rgbi? Zespoły do ​​tej pory przepadły ...
Doris,
Witamy w GIS SE! Jako nowy użytkownik koniecznie zapoznaj się z krótką prezentacją . Następnie rozważ edycję odpowiedzi, aby podać dodatkowe informacje i odniesienia. Zobacz Jak napisać dobrą odpowiedź? po więcej informacji.
Andy
Jeśli masz nowe pytanie, zadaj je, klikając przycisk Zadaj pytanie . Dołącz link do tego pytania, jeśli pomaga to w zapewnieniu kontekstu. - Z recenzji
Erik

Odpowiedzi:

19

Funkcja wyodrębniania działa dokładnie tak, jak powinna. Możesz zmusić funkcję przycinania do użycia zasięgu wieloboku, a następnie zamaskować obiekt, aby zwrócić dokładny raster reprezentujący obszar wielokąta. Jeśli nadal pojawia się błąd, oznacza to, że Twoje dane w rzeczywistości się nie pokrywają.

Pamiętaj, że R nie wykonuje projekcji „w locie”, więc sprawdź swoje projekcje. Możesz sprawdzić, czy zakresy się pokrywają, korzystając z funkcji „scope ()”.

Oto przykład przycinania przy użyciu zasięgu wielokąta, a następnie maskowania powstałego rastra za pomocą „zrasteryzowanego” wielokąta.

# 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)
Jeffrey Evans
źródło
4
ekstrakt () ma wykonać na ponowne odwzorowanie latać, ale wole () nie robi. To może tłumaczyć pewne zamieszanie
mdsumner,
@Jefferey crop () i mask () przycinają raster tylko zgodnie z prostokątnymi obszarami wielokąta, ale nie przycinają go od granicy wielokąta. Masz pojęcie, jakie polecenia mogłyby przyciąć raster w granicach danego wielokąta?
csheth,
1
@Chintan Sheth, aby maska ​​mogła rozdzielić wielokąt, musisz mieć raster reprezentujący wartości w wielokącie. Dlatego rasteryzujesz wielokąt podzbioru, a następnie maskujesz go. Krokiem przycinania jest zmniejszenie zasięgu rastra do tego samego, co w podzbiorze wielokąta, który w przeszłości, gdyby pominięty, powodowałby błąd niedopasowania zasięgu.
Jeffrey Evans,
spTransformz sppakietu (który czasami jest automatycznie ładowany z innymi pakietami przestrzennymi R) pozwala na ponowną projekcję, dzięki czemu oba pliki są w tej samej projekcji np. good_poly=spTransform(spolygon, CRSobj=crs(raster_file))
user3386170
@ user3386170, prawda? Nie jestem pewien, o co ci chodzi. To pytanie pojawiło się w czasie, gdy pakiet rastrowy właśnie dodał „rzutowanie w locie” w ramach niektórych funkcji. Funkcje te wcześniej zgłaszały błąd, gdy projekcje się nie zgadzały, ale ten post pochodzi z 2014 roku. Powinieneś także pamiętać, że zawsze ładujesz rgdal podczas korzystania ze sp :: spTransform (), ponieważ dodaje on dodatkową, ważną funkcjonalność za scenami.
Jeffrey Evans
8

Tak naprawdę szukałem tej mask()funkcji.

mask(raster, poly_shape)

działa bez błędów i zwraca to, czego szukałem.

Lars
źródło
2
Ponownie rzutuj dane, aby znajdowały się w tej samej przestrzeni projekcyjnej. Nawet w ArcGIS, gdzie projekcja w locie odbywa się automatycznie, bardzo złą praktyką jest przeprowadzanie analizy w różnych projekcjach. W przypadku danych w różnych prognozach dane nie będą miały wspólnych zakresów, co jest błędem, który otrzymujesz.
Jeffrey Evans
Użyj projectExtent (), aby uzyskać zakres kadrowania rastra.
mdsumner
Aby dopasować format strony do pytań i odpowiedzi, należy ją umieścić w głównej części pytania jako edycję / aktualizację (a następnie dodać komentarz do odpowiedzi, na którą znajduje się „odpowiedź”, aby wiedzieli, że jest więcej do obejrzenia).
matt wilkie
@mattwilkie Przepraszamy za niedopasowanie formatu, ale mój tekst był zbyt długi, aby opublikować go jako komentarz tutaj. @JeffreyEvans Próbowałem następujących powodów: projection(raster) = projection(poly_shape)i na odwrót projection(poly_shape) = projection(raster), ale oba sposoby dają ten sam błąd: Error in .local(x, y, ...) : extents do not overlap In addition: Warning message: In intersect(extent(x), extent(y)) : Objects do not overlap. Czy istnieje sposób, w jaki sposób mogę zobaczyć, która projekcja jest używana w locie za pomocą funkcji extract () (ponieważ ta oczywiście działa)?
Lars,
1
Tak naprawdę szukałem funkcji mask (). mask(raster, poly_shape)działa bez błędów i zwraca to, czego szukałem.
Lars,
-1

Zakres działa dobrze ... Myślę, że Xmin, Xmax, Ymin i Ymax twojego zasięgu różnią się od X i Y twojego rastra - tzn. Są ustawione przeciwnie

NIE
źródło