Як витягнути значення з растрових у розташуванні точок у R?


13

Моє запитання - про вилучення значень з растра в місці розташування точок. З екстрактом функції це дуже просто, і функція дає мені кадр даних зі значеннями всіх змінних у точках. Я хочу мати в цьому кадрі даних координати кожної точки. Як я можу це зробити? Чи можна сказати R, що при витягуванні значень з растра також додаються стовпці точки розташування.

Це моя процедура:

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)

результати приблизно такі:

> 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

Але я хочу ще два стовпці з даними координат (але це можуть бути й інші стовпці з моєї таблиці розташування вилучення CSV).

Дуже дякую.


Вибачте, формат показаних раніше результатів є невірним.
JMCosta

Повинно бути п'ять стовпців (bio1, bio12 .... bio4)
JMCosta

Чи не повинні значення відповідати координатам вашого presencias?
Роман Луштрик

Значення змінних знаходяться від точок пресенсу. Але я хочу також координати точок у таблиці. але я не знаю, як це зробити.
JMCosta

А як щодо чогось cbind(coordinates(presencias), variables_presencia)? Потім ви можете конвертувати в SPDF за допомогою, coordinates(result) <- ~ X + Yі ви можете знову використовувати безліч методів, призначених для просторових об'єктів.
Роман Луштрик

Відповіді:


20

Якщо припустити, що presenciasі variablesподілити ту саму проекцію, це має бути легким завданням. Я рекомендую вам додати ці рядки коду після read.table()заяви, щоб перетворити presenciasкадр даних в об’єкт SpatialPointsDataFrame (просто уточнити назви стовпців, що містять координати x і y, якщо вони відрізняються від мого прикладу).

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

Щоб відтворити приклад, я намагаюся ще раз розкрити сферу своєї відповіді. Перш за все, завантажте та розпакуйте цей файл форм ESRI з більш-менш важливих місць у Німеччині. Вони будуть служити точковими даними згодом. Вам також знадобляться пакети dismo, rgdalі rasterдля цього короткого прикладу переконайтеся, що ці бібліотеки (та всі їх залежності) встановлені на локальному жорсткому диску.

Почнемо з завантаження необхідних пакетів.

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

Далі слід створити зразок RasterLayer. У нашому випадку ми скористаємось gmap()функцією з dismoпакету, щоб отримати фізичну карту Німеччини.

germany.mrc <- gmap("Germany")

Тепер ви можете імпортувати свою точку форм-файлу через пакет readOGRR. rgdalОбов’язково налаштуйте ім’я джерела даних (dsn = ...). У вашому конкретному випадку весь матеріал проекції застарілий. Однак це потрібно зробити в нашому прикладі, щоб успішно накласти наші дані про точки з Німеччиною 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)))

Щоб зменшити величезний розмір наших точкових даних, ми проведемо випадкову вибірку з десяти місць у Німеччині. Цього повинно вистачити для наших цілей.

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

Тепер, коли підготовчий матеріал закінчений, ми можемо просто почати витягувати значення тих конкретних пікселів, в яких лежать десять випадкових вибіркових точок.

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")

Для об'єднання координат точок з вилученими значеннями пікселів нам просто потрібно встановити кадр даних, що містить координати нашої SpatialPointsDataFrame. Це воно!

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

1

Звичайно, ви можете просто зробити:

variables_presencia$x <- presencias['x']

variables_presencia$y <- presencias['y']

(припустимо, що ваші дані координат знаходяться у двох стовпцях, які називаються "x" та "y")


Я думав таким чином, але у мене виникли ці сумніви: фрейм даних, що виникає в результаті витягу, має той самий порядок, що і присутність. (перший рядок фрейму даних - перший рядок таблиці присутності)
JMCosta

І інша річ, якщо не було змінних даних для жодних точок (3 або 4), кількість рядків не буде однаковим, і порядок точно не буде однаковим.
JMCosta

@JMCosta: ти помиляється з цього приводу. Значення NA повертаються для цих балів.
Роберт Хіджманс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.