Геопространственные данные в R: у меня есть матрица широт, матрица долгот и матрица значений - как объединить? - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть три матрицы: первая - это матрица точек долготы, вторая - матрица точек широты, а третья - матрица значений качества воздуха, измеренных на каждой широте и долготе. В R я хотел бы объединить все это в растр. После обсуждения здесь и использования приведенных ниже данных о разметке я подумал, что смогу объединить матрицы следующим образом:

mat.lat=matrix(rep(41:50,10),10)
mat.long=matrix(rep(91:100,10),10)
mat.aq=matrix(rnorm(100),10)

r=raster(mat.aq,
    xmn=min(mat.long),
    xmx=max(mat.long),
    ymn=min(mat.lat),
    ymx=max(mat.lat)
)

Однако, когда я строю данные, они немного выкл . Я подозреваю, что это потому, что мои данные на самом деле более сложны, чем те, которые находятся в подготовленных данных, а фактическая сетка широты и долготы не распределена равномерно, а равномерно распределена - это то, что ожидает растровая команда.

Но я чувствую, что должен быть более умный способ объединения матриц, чем просто вспашка минимальных и максимальных значений широты и долготы. У меня есть значения lat / lon, поэтому я не хочу их интерполировать. Но после долгих поисков я не могу понять, как. Этот вопрос подошел близко, постер нашел решение их проблемы, которое не решает мою.

Как объединить две матрицы широт и долгот с матрицей точек данных в растр (или другой фрейм пространственных данных)?

Для фона, Я получил два файла netcdf от коллеги: один с сеткой точек широты и долготы, которые покрывают нашу область интересов. В этом первом файле netcdf широта и долгота являются переменными, а не измерениями. Второй файл netcdf содержит данные, которые нас интересуют, но не широта и долгота. Я хотел бы отобразить данные в этих файлах в R, но стандартные функции для чтения в файлах netcdf предполагают, что измерение файла netcdf уже имеет широту и долготу. После обсуждения здесь я решил, что смогу извлечь три массива информации и соединить их вместе, но мне тяжело это делать. ПЕРЕСМОТР Я нашел способ сделать это, хотя я уверен, что это ужасно, смущающе неэффективный способ снять шкуру с кошки, я поделюсь, если кто-то еще Google наткнется на эту страницу.

pts=cbind(lon=as.vector(mat.lon),
        lat=as.vector(mat.lat),
        aq=as.vector(mat.aq))
    inter1=data.frame(pts)
    inter1 <- cbind(inter1, 
        cat = rep(1L, nrow(inter1)),
        stringsAsFactors = FALSE)

    #convert to spatial points
    coordinates(inter1) = ~lon + lat
    proj4string(inter1)<-CRS("+init=epsg:4269")

    r.grid <- raster(inter1,crs=CRS("+init=epsg:4269"),
        nrows=315,
        ncols=288)
    r=rasterize(x=pts[,1:2],y=r,field=pts[,3])

1 Ответ

0 голосов
/ 24 апреля 2020

Я бы начал с использования размеров, которые предоставлены . Предположительно координаты в другой системе пространственной привязки? Получив их в качестве растра, вы можете использовать projectRaster для преобразования в lon / lat.

Если данные не находятся на регулярной сетке, обрабатывайте данные как точки. Вы могли бы сделать это

mlat=matrix(rep(41:50,10),10)
mlong=matrix(rep(91:100,10),10, byrow=TRUE)
maq=matrix(rnorm(100),10)

pts <- cbind(lat=as.vector(mlat), lon=as.vector(mlong), aq=as.vector(maq))

Если бы данные были на регулярной сетке (как они в примере данных), вы могли бы сделать

library(raster)
r <- rasterFromXYZ(pts)
plot(r)

Если это не так, и вы Вы хотите, чтобы они на регулярной сетке, вам нужно интерполировать. Смотрите? Растр :: интерполировать

...