2017-05-04 3 views
0

J'ai le fichier suivant NetCDF - J'essaye de convertir en raster mais quelque chose ne va pas. La projection du fichier NetCDF n'est pas donnée mais selon le logiciel que je l'ai reçu, LatLong devrait être de même cylindrique. J'ai essayé les deux, mais je continue à obtenir cette distorsion qui rend impossible d'interroger les valeurs aux bons endroits. Je sais que l'espacement de la grille n'est pas pair, pas sûr si cela affecte le résultat final (ici visuel d'ArcGIS mais dans R c'est le même problème à moins d'être tracé avec la fonction levelplot). enter image description hereNetCDF - conversion en raster et projection problèmes

library(raster) 
library(ncdf4) 
library(lattice) 
library(RColorBrewer) 

setwd("D:/Results") 
climexncdf <- nc_open("ResultsSO_month.nc") 

lon <- ncvar_get(climexncdf,"Longitude") 
nlon <- dim(lon) 
head(lon) 

lat <- ncvar_get(climexncdf,"Latitude") 
nlat <- dim(lat) 
head(lat) 

dname <- "Weekly Growth Index" 

t <- ncvar_get(climexncdf,"Step") 
tmp_array <- ncvar_get(climexncdf,dname) 
tmp_stack <- vector("list",length(t)) 

for (i in 1:length(t)) { 
     tmp_stack[[i]] <- tmp_array[,,i] 
} 

YearData <- vector("list",52) 
for (i in 1:4) { 
     YearData[[i]] <- tmp_array[,,i] 
} 

Month1 <- YearData[c(1,2,3,4)] 

# Calculate monthly averages 
M1Avg <- Reduce("+",Month1)/length(Month1) 

# Replace 0's with NA's 
M1Avg[M1Avg==0] <- NA 

# Piece of code that gives me what I need: 
grid <- expand.grid(lon=lon, lat=lat) 
cutpts <- seq(0,1,0.1) 

# Convert to raster - work to include lat and long 

M1Avg_reorder <- M1Avg[ ,order(lat) ] 
M1Avg_reorder <- apply(t(M1Avg_reorder),2,rev) 

M1AvgRaster <- raster(M1Avg_reorder, 
         xmn=min(lon),xmx=max(lon), 
         ymn=min(lat),ymx=max(lat), 
         crs=CRS("+proj=longlat +datum=WGS84")) 
         #crs=CRS("+proj=cea +lat_0=0 +lon_0=0")) 

r <- projectRaster(M1AvgRaster,crs=CRS("+proj=longlat +datum=WSG84")) 

plot(M1AvgRaster) 

# Location file not included but any locations can be entered 
locations <- read.csv("Locations.csv", header=T) 
coordinates(locations) <- c("y","x") 

data <- extract(M1AvgRaster,locations) 

writeRaster(M1AvgRaster, "M1AvgRaster_Globe_projWGSTest", format = "GTiff") 
+0

Êtes-vous sûr que le fichier de données est OK? Les valeurs de latitude semblent assez aléatoires et, en tant que tel, ce n'est certainement pas un bon fichier avec lequel travailler. Les valeurs de la latitude commencent comme suit: '-16,25, -20,75, -18,25, -14,25, -29,25, 51,75, 28,25, -44,25'. Après le tri, ils sont très simples cylindriques avec un pas de 0,5 degrés, la longitude semble correcte. – kakk11

+0

je sais, c'est comme ça que le logiciel revient, donc je l'ai trié par M1Avg_reorder <- M1Avg [, commande (lat)] M1Avg_reorder <- apply (t (M1Avg_reorder), 2, rev). Pourtant, j'ai des problèmes avec la conversion en lat long, ou toute projection où je serai en mesure d'appeler les emplacements par leurs coordonnées correctement – MIH

+0

Aussi, vous pouvez remarquer que l'étape n'est pas toujours 0,5, mais il peut aussi être 0,75 ou 1 dans certains instances, en longitude et si je me souviens bien dans lat aussi bien. – MIH

Répondre

1

la version python montre que, après réordonnancement au moins l'emplacement des données semble correcte. Cependant, le fichier de données semble étrange, j'ai vu des données corrompues dans la bibliothèque python netcdf, ce que je n'avais jamais vu auparavant avec pas mal de fichiers NetCDF différents. En outre, les paramètres de compression et de compression sont étranges, mieux vaut ne pas les appliquer du tout.

Mais par exemple un minimum de python pour obtenir l'intrigue est ici:

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 
from netCDF4 import Dataset 

ff = Dataset('ResultsSO_month.nc') 
test_var = np.copy(ff.variables['Maximum Temperature'][:]) 
## reorder latitudes 
latindex = np.argsort(ff.variables['Latitude'][:]) 
## Set up map and compute map coordinates 
m = Basemap(projection='cea', llcrnrlat=-90, urcrnrlat=90, 
llcrnrlon=-180, urcrnrlon=180, resolution='c') 
grid_coords = np.meshgrid(ff.variables['Longitude'[:],ff.variables['Latitude'][latindex]) 
X,Y = m(grid_coords[0],grid_coords[1]) 
## Plot 
m.pcolormesh(X,Y,test_var[0,latindex,:]) 
m.drawcoastlines() 
plt.colorbar() 
plt.show() 

enter image description here

+0

merci beaucoup! Est-il possible d'ajouter une ou deux lignes supplémentaires pour le convertir en raster qui sera lu correctement dans ArcGIS et aura une projection spécifique? – MIH

+0

Vous ne voulez pas vous retrouver avec GeoTIFF en projection lonlat et WSG84, n'est-ce pas? Autant que je sache, vous auriez réellement besoin d'étapes de grille cohérentes pour cela, GTiff n'enregistre pas les coordonnées séparément AFAIK, mais seulement la transformation. Vous devez donc jeter certaines lignes de données ou interpoler quelque chose entre les deux, je suppose. – kakk11

+0

Ouais, tiff ou img avec une projection - tout le monde ferait vraiment, une aire égale cylindrique par exemple. Mais cela ne semble pas une option sans ajouter des colonnes supplémentaires non? Je pense que c'est ce que je vais devoir faire. que signifie AFAIK? – MIH