Вам нужно открыть файл NetCDF как растровый * объект, чтобы обработать его как растровый в R. Используйте для этого brick
или stack
, а не nc_open
pre1.brick = brick("precip.2000.nc")
Вы заметите, что этот файл использует обычное в науке о климате соглашение о предоставлении долгот в значениях в диапазоне от 0 до 360 градусов:
extent(pre1.brick)
# class : Extent
# xmin : 0
# xmax : 360
# ymin : -90
# ymax : 90
Мы можем преобразовать в обычные -180 - 180 долгот usint rotate
pre1.brick = rotate(pre1.brick)
Теперь давайте посмотрим, каковы проекции наших растровых и полигональных файлов:
crs(shp)
# +proj=longlat +datum=NAD83 +no_defs +ellps=GRS80 +towgs84=0,0,0
crs(pre1.brick)
# +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
Вы можете видеть, что оба используют координаты широты и длины, но различаются по датам и эллипсу. Обычно рекомендуется для точности и скорости, когда это возможно, проецировать векторные данные, а не растровые, чтобы получить их оба в одной системе координат:
shp = spTransform(shp, crs(pre1.brick))
Проецировав оба на одну и ту же систему координат, мы можем применить шейп-файл в качестве маски к растровому кирпичу:
pre1.mask = mask(pre1.brick, shp)
И преобразовать в data.frame. Здесь я просто продемонстрирую для первого слоя. Вы можете сделать все слои сразу, если хотите, удалив [[1]]
в следующей строке
pre1.df = as.data.frame(pre1.mask[[1]], xy=TRUE)
Если вы хотите, вы можете удалить строки, которые имеют NA, чтобы оставить только ячейки внутри маски, содержащей данные:
pre1.df = pre1.df[complete.cases(pre1.df),]
head(pre1.df)
# x y X2000.01.01.00.00.00
# 10278 -81.25 82.75 0.2647110
# 10279 -80.75 82.75 0.2721323
# 10280 -80.25 82.75 0.2797630
# 10281 -79.75 82.75 0.2875668
# 10282 -79.25 82.75 0.2925712
# 10283 -78.75 82.75 0.2995636