Поиск граничных точек в файле растровых данных

Итак, у меня есть центральная точка и уровень масштабирования.
Мне нужно нанести несколько точек на карту.

Карта хранится в файле растровых данных и отображается в виджете 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