Намиране на граничните точки във файл с растерни данни

И така, имам със себе си централната точка и нивото на увеличение.
Трябва да начертая някои точки на картата.

Картата се съхранява във файл с растерни данни и се показва в уиджета на R.

Проблемът е, че когато се получи точка, трябва да проверя дали тя попада в данните на този растерен файл или не.
Ако точката е в растерния файл, тогава мога безопасно да я начертая.
Ако не, тогава трябва да заредя друг растерен файл, който съдържа тази точка, и след това да начертая точката.

Пакетът raster на R има функция с име as.data.frame, която зарежда растерните данни в рамката с данни.

Възможно ли е тогава да разберем кои точки (латове и лонове) са в четирите ъгъла? На прав път ли съм?


person Aquarius_Girl    schedule 30.08.2012    source източник
comment
Не можете ли просто да ограничите оста x и y на вашия график до степента на ggnap?   -  person mnel    schedule 30.08.2012
comment
@mnel Съжалявам, не съм добре запознат с R, така че не знам как да го направя.   -  person Aquarius_Girl    schedule 30.08.2012
comment
Това ще зависи от това какво използвате, за да създадете сюжета. Предполагам, че създавате графиката с помощта на ggmap(), в който случай степента се задава автоматично на това. напр. hdf <- get_map(); .points <- data.frame(lon = 0, lat = 0); ggmap(hdf, extent = 'device') + geom_point(data = .points,aes(x=lon,y=lat)) -- Точката 0,0 не е в обхвата на растера и не е изчертана (както ви казва предупреждението).   -  person mnel    schedule 30.08.2012


Отговори (1)


Ако вашите данни са от клас RasterLayer, тогава extent ще ви даде степента на растера и xmin, 'min, ymax и xmax за достъп до различните слотове.

eg

# create a dummy raster
r1 <- raster(nrows=108, ncols=21, xmn=0, xmx=10)
r1[] <-1

extent(r1)
## class       : Extent 
## xmin        : 0 
## xmax        : 10 
## ymin        : -90 
## ymax        : 90 

Можете да получите достъп до различните слотове, като използвате

xmin(r1)
## [1] 0
xmax(r1)
##[1] 10
ymin(r1)
## [1] -90
ymax(r1)
## [1] 90

Ако вашите данни са SpatialGridDataFrame, тогава bbox ще върне ограничителната кутия

.grid <- as(r1,'SpatialGridDataFrame')

bbox(.grid)
##    min max
## s1   0  10
##  2 -90  90

Моята xy координата лежи ли в границата на растера

можете да използвате cellFromXY, за да намерите клетката id и тя ще върне NA, ако е извън текста

eg

 # some data
 .points <- rbind(c(1,1),c(-4,1))
 # the first point lies within the raster, the second not

 # cell from XY will tell you this.
 cellFromXY(r1,.points)
 ## [1] 1116   NA

РЕДАКТИРАНЕ за ggmap

ако имате карта, придобита от get_map, тя е ggmap обект и няма да работи с пакета raster без малко помощ от вас .

можете да получите ограничителната кутия като атрибут bb.

  hdf <- get_map()
  attr(hdf,'bb')
##    ll.lat    ll.lon   ur.lat    ur.lon
## 1 29.38048 -95.80204 30.14344 -94.92313

Помощна функция, която ще създаде RasterStack от обект ggmap

ggmap_rasterlayer <- function(map){
  map_bbox <- attr(map, 'bb') 
  .extent <- extent(as.numeric(map_bbox[c(2,4,1,3)]))
  my_map <- raster(.extent, nrow= nrow(map), ncol = ncol(map))
  rgb_cols <- setNames(as.data.frame(t(col2rgb(map))), c('red','green','blue'))
  red <- my_map
  values(red) <- rgb_cols[['red']]
  green <- my_map
  values(green) <- rgb_cols[['green']]
  blue <- my_map
  values(blue) <- rgb_cols[['blue']]
  stack(red,green,blue)

}

my_map <- ggmap_rasterlayer(hdf)
person mnel    schedule 30.08.2012
comment
Благодаря за вашият отговор. Използвам ggmap за изтегляне на статичните карти на Google и след това запазвам резултата във файл с разширение .rda. Ще ми трябва пакетът gdal, за да работи. - person Aquarius_Girl; 30.08.2012
comment
Ако използвате ggmap, трябва да го кажете! Пакетът raster създава RasterLayers и няма да работи първоначално. Редактирам отговора - person mnel; 30.08.2012
comment
съжалявам, наистина трябваше да спомена. - person Aquarius_Girl; 30.08.2012
comment
Показах как да конвертирате ggmap обект в RasterStack, което ще ви позволи да използвате cellFromXY - person mnel; 30.08.2012
comment
Благодаря ви за помощта. Ще се върна, ако имам допълнителни проблеми. - person Aquarius_Girl; 30.08.2012