从经度/纬度网格化数据

时间:2017-02-03 09:52:50

标签: r shapefile r-raster sp

我在地中海有一些海面温度值的网格化数据,我已将其应用于聚类。我有420个文件,有三列结构(长,纬度,值)。特定文件的数据类似于此地图

enter image description here

现在我想将集群区域提取为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的建议,但无法了解如何申请。

任何帮助将不胜感激。感谢。

1 个答案:

答案 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")    
  }
}

所以,评论中有两行,只更新下面的一行。