Витягте растер з растра, використовуючи форм-файл полігона в R


13

Я новачок у R та використовую растровий пакет. У мене є проблема з вилученням полігонів з існуючого растрового файлу. Якщо я користуюся

extract(raster, poly_shape)

Функція на растрі завжди створює список із даними. Мені дуже хочеться витягти ще один растровий файл, який я можу знову завантажити ArcGIS. Прочитавши трохи більше, я думаю, що функція врожаю - це те, що мені справді потрібно. Але коли я намагаюся використовувати цю функцію

crop(raster, poly_shape)

Я отримую цю помилку:

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

Файли растрові та полі_шапи однакові для обох функцій. Чи можете ви сказати мені, що тут може бути не так? Чи правильно, що функція обрізання створює інший растр, а не список?

EDIT : Функція степеня () не працює для мене. Я все одно отримую ту саму помилку. Але я впевнений, що два набори даних перетинаються! З

extract(raster, poly_shape)

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

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"

і ви бачите, що проекції не відповідають. Здається, функція витягу здатна автоматично трансформувати файли в потрібний спосіб. Я це знаю, бо зробив наступне:

  • Я вирізав точну частину багатокутника, який я видобув у R також у ArcGIS
  • Я обчислив суму всіх значень видобутого полігона R (список)
  • Я підрахував суму всіх растрових клітин, які я вирізав в ArcGIS

2 мають точно такий же результат, тому я гадаю, що висновок повинен бути таким, що функція вилучення працювала правильно. Зараз у мене є 2 варіанти, які я думаю:

  1. Мені потрібен спосіб, як знову витягнути Растер із вилученого списку або
  2. У двох наборах даних (растровий + полі_шапе) потрібно використовувати одне і те ж прогнозування, і функція обрізання повинна працювати

Що б ти запропонував зробити тут?


Що робити, якщо це растр на 4 діапазони rgbi? Досі
Доріс,

Ласкаво просимо в GIS SE! Як новий користувач, будь ласка, не забудьте взяти короткий тур . Потім подумайте про редагування своєї відповіді, щоб надати додаткову інформацію та посилання. Див. Як написати гарну відповідь? для отримання додаткової інформації.
Енді,

Якщо у вас є нове запитання, будь ласка, задайте його, натиснувши кнопку Задати питання . Додайте посилання на це питання, якщо це допомагає надати контекст. - З перегляду
Ерік

Відповіді:


19

Екстракційна функція поводиться саме так, як слід. Ви можете змусити функцію обрізання використовувати масштаб багатокутника, а потім замаскувати об’єкт, щоб повернути точний растр, що представляє площу полігона. Якщо ви продовжуєте отримувати помилку, це означає, що ваші дані насправді не перетинаються.

Майте на увазі, що R не виконує проекцію "на льоту", тому перевірте свої прогнози. Ви можете перевірити, чи перекриваються ваші розширення за допомогою функції "scale ()".

Ось приклад обрізання за допомогою міри багатокутника, а потім маскування отриманого растру за допомогою "растерізованого" полігона.

# 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
Екстракт () робить виконувати на льоту перепроецірованія, але урожай () не робить. Це може
спричинити

@Jefferey crop () та mask () лише обрізають растр відповідно до прямокутних розширень багатокутника, він не вирізає його з-за межі полігону. Будь-яка ідея, які команди могли би вирізати растр у межах даного многокутника?
csheth

1
@Chintan Sheth, щоб маска підмножилася в полігоні, вам потрібно мати растр, що представляє значення в полігоні. Ось чому ви растрируете багатокутник підмножини і потім маскуєте його. Етап обрізання полягає в тому, щоб зменшити масштаб растра до такого ж, як полігон підмножини, який у минулому, якщо пропустити, призведе до помилки невідповідності.
Джефрі Еванс

spTransformз spпакету (який іноді автоматично завантажується з іншими просторовими R-пакетами) дозволяє перепроектувати так, що обидва файли знаходяться в одній проекції, наприклад. good_poly=spTransform(spolygon, CRSobj=crs(raster_file))
user3386170

@ user3386170, так? Не впевнений, у що ви потрапляєте. Це запитання виникло в той момент, коли растровий пакет просто додав "на льотну проекцію" в межах деяких, якщо його функції. Ці функції раніше мали помилку, коли проекції не збігалися, але ця публікація була з 2014 року. Ви також повинні знати, що завжди завантажуйте rgdal під час використання sp :: spTransform (), оскільки це додає додаткову, важливу функціональність за кадром.
Джефрі Еванс

8

Я шукав насправді mask()функцію.

mask(raster, poly_shape)

працює без помилок і повертає те, що я шукав.


2
Відхиліть свої дані, щоб вони знаходилися в одному просторі проекції. Навіть у ArcGIS, де проекція в режимі льоту є автоматичною, дуже погана практика проводити аналіз у різних прогнозах. З даними в різних прогнозах ваші дані не матимуть спільних розширень, що є помилкою, яку ви отримуєте.
Джефрі Еванс

Використовуйте projectExtent (), щоб отримати лише міру обрізання растра.
mdsumner

Щоб відповідати формату запитань та відповідей на веб-сайті, це слід розмістити в основній частині питання як редагування / оновлення (а потім додати коментар до відповіді, це у "відповіді", щоб вони знали, що ще на що подивитися).
matt wilkie

@mattwilkie Вибачте за невідповідність формату, але мій текст був занадто довгим, щоб розмістити його як коментар тут. @JeffreyEvans Я спробував наступне: projection(raster) = projection(poly_shape)і навпаки , projection(poly_shape) = projection(raster)але обидва способи виробляють ту ж помилку: Error in .local(x, y, ...) : extents do not overlap In addition: Warning message: In intersect(extent(x), extent(y)) : Objects do not overlap. Чи є спосіб, як я бачу, яка проекція використовується на льоту, використовуючи функцію extra () (тому що, очевидно, працює)?
Ларс

1
Я шукав насправді функцію mask (). mask(raster, poly_shape)працює без помилок і повертає те, що я шукав.
Ларс

-1

Обсяг працює чудово ... Я думаю, що Xmin, Xmax, Ymin і Ymax вашої міри відрізняються від X і Y вашого растру - тобто вони встановлені навпроти

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.