Я задал этот вопрос как часть Эффективного способа построения данных по нерегулярной сетке, но общая обратная связь заключалась в том, чтобы разделить исходный вопрос на более управляемый ломти. Следовательно, этот новый вопрос.
Я работаю со спутниковыми данными, организованными на нерегулярной двумерной сетке, размеры которой являются сканированием (по размеру трека, то есть по оси Y) и по наземному пикселю (по размеру дорожки, то есть по оси X). Информация о широте и долготе для каждого центрального пикселя хранится в вспомогательных переменных координат, а также в четырех координатных координатах угла (координаты широты и долготы указаны на эталонном эллипсоиде WGS84).
Позвольте построить набор данных игрушек, состоящий из потенциально нерегулярной сетки 12x10 и связанных с ней измерений температуры поверхности.
library(pracma) # for the meshgrid function
library(ggplot2)
num_sl <- 12 # number of scanlines
num_gp <- 10 # number of ground pixels
l <- meshgrid(seq(from=-20, to=20, length.out = num_gp),
seq(from=30, to=60, length.out = num_sl))
lon <- l[[1]] + l[[2]]/10
lat <- l[[2]] + l[[1]]/10
data <- matrix(seq(from = 30, to = 0, length.out = num_sl*num_gp),
byrow = TRUE, nrow = num_sl, ncol = num_gp) +
matrix(runif(num_gp*num_sl)*6, nrow = num_sl, ncol = num_gp)
df <- data.frame(lat=as.vector(lat), lon=as.vector(lon), temp=as.vector(data))
Данные lon
и lat
содержат координаты центрального пикселя, как указано в исходном продукте, с которым я работаю, хранятся в виде двумерной матрицы, оси которой являются ground_pixel (ось X) и scanline (ось Y), Матрица data
- те же размеры - содержит мои измерения. Затем я выравниваю три матрицы и сохраняю их в кадре данных.
Я хотел бы построить пиксели земли (как четырехугольники) на карте, заполненные соответственно измерением температуры.
Используя плитки, я получаю:
ggplot(df, aes(y=lat, x=lon, fill=temp)) +
geom_tile(width=2, height=2) +
geom_point(size=.1) +
borders('world', colour='gray50', size=.2) +
coord_quickmap(xlim=range(lon), ylim=range(lat)) +
scale_fill_distiller(palette='Spectral') +
theme_minimal()
Но это не то, что я хочу. Я мог бы играть с width
и height
, чтобы плитки "касались друг друга", но, конечно, это даже не приблизилось бы к моей желаемой цели, которая заключается в построении фактических проецируемых пикселов земли на карте. < ш > Python xarray может, например, автоматически выводить границы пикселей с учетом координат центра пикселей:
Вопрос
Есть ли способ достичь тех же результатов в R, то есть: автоматически ли границы пикселов выводятся из центров пикселей и нарисовать пиксели в виде заполненных полигонов на карте? Может быть, с помощью пакета sf
?
Я вижу это в ответ на этот question, но ответ, который относится к использованию sf
, для меня немного неясен, так как он с различными проекциями и потенциально регулярными сетками, тогда как в моем случае я полагаю, что мне не нужно повторно проектировать мои данные, и, кроме того, мои данные не находятся на регулярной сетке.
Если это невозможно, я полагаю, что я могу прибегнуть к использованию информации о границах пикселей в своих продуктах, но, возможно, что тема для другого вопроса должна оказаться нелегкой для решения этой проблемы.