我在地中海有一些海面温度值的网格化数据,我已将其应用于聚类。我有420个文件,有三列结构(长,纬度,值)。特定文件的数据类似于此地图
现在我想将集群区域提取为shapefile以进行后处理。我找到了这篇文章(https://gis.stackexchange.com/a/187800/9227)并试图像这样使用它的代码
# Packages
library(sp)
library(rgdal)
library(raster)
# Paths
ruta_datos<-"/home/meteo/PROJECTES/VERSUS/OUTPUT/DATA/CLUSTER_MED/"
setwd("~/PROJECTES/VERSUS/temp")
# File list
files <- list.files(path = ruta_datos, pattern = "SST-cluster-mitja-mensual")
for (i in 1:length(files)){
datos<-read.csv(paste0(ruta_datos,files[i],sep=""),header=TRUE)
nclusters<-max(datos$cluster)
for (j in 1:nclusters){
clust.dat<-subset(datos, cluster == j)
coordinates(clust.dat)=~longitud+latitud
proj4string(clust.dat)=CRS("+init=epsg:4326")
pts = spTransform(clust.dat,CRS("+init=epsg:4326"))
gridded(pts) = TRUE
r = raster(pts)
projection(r) = CRS("+init=epsg:4326")
# make all values the same. Either do
s <- r > -Inf
# convert to polygons
pp <- rasterToPolygons(s, dissolve=TRUE)
# save shapefile
shname<-paste("SST-shape-",substr(files[i],27,32),"-",j,sep="")
writeOGR(pp, dsn = '.', layer = shname, driver = "ESRI Shapefile")
}
}
但代码因此错误消息而停止
网格(pts)= TRUE 建议公差最小值:1
points2grid中的错误(点,容差,圆):维2 :坐标间隔不是常数 警告消息:在points2grid(points,tolerance,round)中:grid为空 维度1中的列/行
我不明白,在某个文件中,它表示坐标间隔不是一成不变的,原始的SST数据来自整个地球上的常规网格。所有群集数据文件都具有相同的大小,4248个点。可以使用示例数据文件here
容忍建议意味着什么?我一直在寻找解决方案并找到了一些使用SpatialPixelsDataFrame
的建议,但无法了解如何申请。
任何帮助将不胜感激。感谢。
答案 0 :(得分:1)
我不是地理空间数据专家,但对我来说,如果您对群集进行过滤,数据确实不在网格上。据我所知,你从一个网格(一组常规的远点)开始。
我尝试对您的代码进行修改并生成一些文件,但我无法测试它们是否正确。
原则是在所有数据上构建网格,然后在调用raster
之前仅在集群上进行过滤。
这给出了:
files <- list.files(path = ruta_datos, pattern = "SST-cluster-mitja-mensual")
for (i in 1:length(files)){
datos<-read.csv(paste0(ruta_datos,files[i],sep=""),header=TRUE)
nclusters<-max(datos$cluster)
for (j in 1:nclusters){
## clust.dat<-subset(datos, cluster == j)
clust.dat <- datos
coordinates(clust.dat)=~longitud+latitud
proj4string(clust.dat)=CRS("+init=epsg:4326")
pts = spTransform(clust.dat,CRS("+init=epsg:4326"))
gridded(pts) = TRUE
## r = raster(pts)
r= raster(pts[pts$cluster==j,])
projection(r) = CRS("+init=epsg:4326")
# make all values the same. Either do
s <- r > -Inf
# convert to polygons
pp <- rasterToPolygons(s, dissolve=TRUE)
# save shapefile
shname<-paste("SST-shape-",substr(files[i],27,32),"-",j,sep="")
writeOGR(pp, dsn = '.', layer = shname, driver = "ESRI Shapefile")
}
}
所以,评论中有两行,只更新下面的一行。