Jak wyodrębnić wartości z rastrów w miejscu punktów w R?

13

Moje pytanie dotyczy wyodrębnienia wartości z rastrów w miejscu punktów. Z ekstraktem funkcji jest to bardzo łatwe, a funkcja daje mi ramkę danych z wartościami wszystkich zmiennych w punktach. Chcę mieć w tej ramce danych współrzędne każdego punktu. Jak mogę to zrobić? Czy można powiedzieć R, że przy wydobywaniu wartości z rastra dodaj także kolumny punktu lokalizacji.

Oto moja procedura:

presencias=read.table("c:/SDM_R/presencias/P_lentiscus_pres.csv",header=TRUE,sep=";")

lista_variables <-list.files(path="Variables_modelizacion/solo_ascii",pattern='*.asc',full.names=TRUE)
variables <- stack(lista_variables)

variables_presencia<-extract(variables, presencias)

wyniki są mniej więcej takie:

> bio1  bio12  bio18  bio2  bio4 
> 90    875    165    95    4886
> 115   1085   158    83    4075
> 135   1153   153    67    3402
> 85    1026   137    99    5203
> 96    667    128    108   5823
> 98    531    109    113   6305
> 132   450    63     123   6598
> 132   569    104    106   5963
> 95    814    196    98    5571
> 146   474    39     114   6603

Ale chcę jeszcze dwie kolumny z danymi współrzędnych (ale mogą to być inne kolumny z mojej tabeli wyodrębniania csv).

Dziękuje bardzo.

JMCosta
źródło
Przepraszamy, format pokazanych wcześniej wyników jest nieprawidłowy.
JMCosta
Musi być pięć kolumn (bio1, bio12 .... bio4)
JMCosta
Czy wartości nie powinny odpowiadać współrzędnym twojego presencias?
Roman Luštrik
Wartości zmiennych pochodzą z punktów obecności. Ale chcę też współrzędnych punktów w tabeli. ale nie wiem jak to zrobić.
JMCosta
Co powiesz na coś takiego cbind(coordinates(presencias), variables_presencia)? Następnie możesz przekonwertować na SPDF za pomocą coordinates(result) <- ~ X + Yi możesz ponownie skorzystać z wielu metod zaprojektowanych dla obiektów przestrzennych.
Roman Luštrik

Odpowiedzi:

20

Zakładając to presenciasi variablesdzieląc tę ​​samą projekcję, powinno to być łatwe zadanie. Polecam dodanie tych wierszy kodu po read.table()instrukcji, aby przekonwertować presenciasramkę danych na obiekt SpatialPointsDataFrame (po prostu popraw nazwy kolumn zawierających współrzędne xiy, jeśli różnią się od mojego przykładu).

coordinates(presencias) <- c("x", "y")

Aby zapewnić powtarzalny przykład, staram się nieco bardziej rozszerzyć zakres mojej odpowiedzi. Po pierwsze, pobierz i rozpakuj ten plik kształtu ESRI z mniej lub bardziej ważnymi lokalizacjami w Niemczech. Będą one później służyć jako dane punktowe. Potrzebny będzie również pakiety dismo, rgdala rasterna tym krótkim przykładzie, więc upewnij się, że te biblioteki (i wszystkie ich zależności) są zainstalowane na lokalnym dysku twardym.

Zacznijmy od załadowania wymaganych pakietów.

library(dismo)
library(rgdal)
library(raster)

Następnie należy wygenerować przykładową warstwę RasterLayer. W naszym przypadku skorzystamy z gmap()funkcji z dismopakietu, aby uzyskać fizyczną mapę Niemiec.

germany.mrc <- gmap("Germany")

Możesz teraz zaimportować punktowy plik kształtów readOGRz rgdalpakietu R. Pamiętaj o dostosowaniu nazwy źródła danych (dsn = ...). Cała projekcja jest przestarzała w twoim przypadku. Jednak w naszym przykładzie należy to zrobić, aby z powodzeniem nakładać nasze dane punktowe na niemiecki RasterLayer.

# Import SpatialPointsDataFrame
germany.places <- readOGR(dsn = "/path/to/shapefile", layer = "places")
# Define shapefile's current CRS
projection(germany.places) <- CRS("+proj=lonlat +ellps=WGS84")
# Reproject to RasterLayer's CRS
germany.places.mrc <- spTransform(germany.places, CRS(projection(germany.mrc)))

Aby zmniejszyć ogromny rozmiar naszych danych punktowych, losujemy próbkę dziesięciu lokalizacji w Niemczech. To powinno wystarczyć do naszych celów.

set.seed(35)
germany.places.mrc.sample <- germany.places.mrc[sample(nrow(germany.places.mrc), 10), ]

Teraz, gdy przygotowania są zakończone, moglibyśmy po prostu zacząć wyodrębniać wartości tych konkretnych pikseli, w których znajduje się dziesięć losowo próbkowanych punktów.

data <- data.frame(coordinates(germany.places.mrc.sample),
                   germany.places.mrc.sample$name, 
                   extract(germany.mrc, germany.places.mrc.sample))
names(data) <- c("x", "y", "name", "value")

Aby scalić współrzędne punktu z wyodrębnionymi wartościami pikseli, wystarczy skonfigurować ramkę danych zawierającą współrzędne naszego obiektu SpatialPointsDataFrame. Otóż ​​to!

data
           x       y          name value
1  1073490.3 6513446 Veitsteinbach   208
2  1269100.8 6156690   Assenhausen   231
3  1336757.5 6246284    Frauenwahl   195
4   828579.9 6634122      Altenhof   189
5  1571418.1 6662558         Wohla   151
6  1192299.4 6864087     Flechtorf   170
7   976270.0 6362050    Hilsenhain   208
8  1117416.4 6092146      Nestbaum   175
9  1274192.0 6344490 Wappeltshofen   236
10  878488.2 6839843        Leeden   208
fdetsch
źródło
1

Z pewnością możesz po prostu zrobić:

variables_presencia$x <- presencias['x']

variables_presencia$y <- presencias['y']

(zakładając, że dane współrzędnych znajdują się w dwóch kolumnach o nazwach „x” i „y”)

Jack Harrison
źródło
Tak myślałem, ale miałem te wątpliwości: ramka danych wynikająca z ekstraktu ma tę samą kolejność co obecność. (pierwszy wiersz ramki danych to pierwszy wiersz tabeli obecności)
JMCosta
I jeszcze jedno, jeśli nie byłoby danych zmiennych dla żadnych punktów (3 lub 4), liczba rzędów nie będzie taka sama, a kolejność na pewno nie będzie taka sama.
JMCosta
@JMCosta: mylisz się co do tego. Wartości NA zostaną zwrócone dla tych punktów.
Robert Hijmans