栅格:提取栅格图像的中心(geoTIFF)并绘制其边界
Raster: Extract center of raster images (geoTIFF) and draw its borders
我想在 geoTIFF 中提取 4 个光栅子图像中心的坐标(并创建数据框)并绘制 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")
}
有什么想法或更聪明的解决方案吗?谢谢
要找到栅格的中心,请取范围内每个方向的最小值和最大值的平均值。样本栅格:
> 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) 等四种方式从范围向量中获取坐标,以获得四种方法角落:
> 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
请注意,一开始的所有代码让我对这个问题有点迟疑,这对答案来说似乎是不必要的,除非我在某处遗漏了一个微妙之处……尝试做一个最简单的例子来说明你的问题。
我想在 geoTIFF 中提取 4 个光栅子图像中心的坐标(并创建数据框)并绘制 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")
}
有什么想法或更聪明的解决方案吗?谢谢
要找到栅格的中心,请取范围内每个方向的最小值和最大值的平均值。样本栅格:
> 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) 等四种方式从范围向量中获取坐标,以获得四种方法角落:
> 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
请注意,一开始的所有代码让我对这个问题有点迟疑,这对答案来说似乎是不必要的,除非我在某处遗漏了一个微妙之处……尝试做一个最简单的例子来说明你的问题。