Растр: извлечь центр растровых изображений (geoTIFF) и нарисовать его границы - PullRequest
0 голосов
/ 21 января 2020

Я хотел бы извлечь координаты (и создать фрейм данных) центра 4 растровых подизображений в geoTIFF и нарисовать границу 2 выбранных подизображений, первоначально разделенных на r2 изображении, для этого Я пытаюсь:

library(raster)  
library(rgeos)

#create GeoTIFF raster
r <- raster(ncol=100, nrow=100)
s <- stack(lapply(1:3, function(i) setValues(r, runif(ncell(r)))))
f1 <- file.path(tempdir(), "sl1.tif")
writeRaster(s,f1, format="GTiff",datatype="FLT4S",overwrite=TRUE)

#crop in 4 sub-images
r2<-stack(raster("sl1.tif"))
SplitRas <- function(raster,ppside,save,plot){
  h        <- ceiling(ncol(raster)/ppside)
  v        <- ceiling(nrow(raster)/ppside)
  agg      <- aggregate(raster,fact=c(h,v))
  agg[]    <- 1:ncell(agg)
  agg_poly <- rasterToPolygons(agg)
  names(agg_poly) <- "polis"
  r_list <- list()
  for(i in 1:ncell(agg)){
    e1          <- extent(agg_poly[agg_poly$polis==i,])
    r_list[[i]] <- crop(raster,e1)
  }
  if(save==T){
    for(i in 1:length(r_list)){
      f1 <- file.path(tempdir(), paste0("sample_",i,sep=""))
      writeRaster(r_list[[i]], f1,
                  format="GTiff",datatype="FLT4S",overwrite=TRUE)
    }
  }
  if(plot==T){
    par(mfrow=c(ppside,ppside))
    for(i in 1:length(r_list)){
      plot(r_list[[i]],axes=F,legend=F,bty="n",box=FALSE)
    }
  }
  return(r_list)
}
splitRBG<-SplitRas(raster=r2,ppside=2,save=TRUE,plot=FALSE)
# 

#read the 4 images 
r.files <-list.files(tempdir(), pattern = "sample")
#[1] "sample_1.tif" "sample_2.tif" "sample_3.tif" "sample_4.tif"

# get coordinates data from the center of each image
RES<-NULL
for(i in 1:length(r.files)){
value <- raster::extract(?????????) ## Here Im loosing for extract the center of each image
RES<-rbind(RES,cbind(r.files[i],coordinates(value))) #create a data frame of the results
}
colnames(RES)<-c("r.files","xcoord","ycoord")

Сначала я хотел бы создать фрейм данных с этой информацией

r.files         xcoord       ycooord      
sample_1.tif     -100         -50
sample_2.tif      50          -52
sample_3.tif      120          50
sample_4.tif      120         -30

Здесь моя первая проблема, потому что я не могу найти способ извлечь центр каждого изображения, прежде чем я ожидал:

#Finally draw a square with the images and points in center of coordinates only for sample_3 and sample_4
del<-c("sample_1.tif","sample_2.tif")
r.files2<-r.files [-del]
RES2<-RES[,-(1:2)]
image(r2)
for(i in 1:length(r.files2)){
e <- extent(r.files2[i])
pp <- rasterToPolygons(e, dissolve=TRUE) 
plot(pp, border='green') #Only countour color
points(RES2[i][,2], RES2[i][,3],col="red")
}

Есть идеи или более разумное решение? Спасибо

1 Ответ

1 голос
/ 22 января 2020

Чтобы найти центр растра, возьмите среднее значение мин и макс в каждом направлении от экстента. Пример растрового изображения:

> r = raster(extent(23,29,3,12))

Получить экстент как вектор xmin, xmax, ymin, ymax:

> e = as.vector(extent(r))

Рассчитать среднее значение первых двух элементов как центра координат X, последние два элемента как Центр координат Y:

> c(mean(e[c(1,2)]),mean(e[c(3,4)]))
[1] 26.0  7.5

Если вам также нужны координаты углов растра, вы также можете получить их из вектора экстента, комбинируя (xmin, ymin), (xmax, ymin) et c четырьмя способами, необходимыми для получения четырех углов:

> cbind(e[c(1,1,2,2)],e[c(3,4,3,4)])
     [,1] [,2]
[1,]   23    3
[2,]   23   12
[3,]   29    3
[4,]   29   12

Заметьте, я был немного отстранен от этого вопроса всем кодом в начале, который кажется ненужным для ответа, если только я ' Мы где-то упустили тонкость ... Попробуйте и приведите самый простой пример, необходимый для иллюстрации вашего вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...