2014-01-22 11 views
5

Ich habe eine netCDF - Datei, die ich extrahieren möchte eine Teilmenge von Breiten -/Längengrad Grenzen (dh eine lat/lang definierten Box), mit der 'ncdf' Paket in R.Wie man eine Teilmenge aus einer netCDF - Datei mit Breiten -/Längengrenzen in R

Eine Zusammenfassung meiner netCDF-Datei ist unten. Es hat zwei Dimensionen (Breite und Länge) und eine Variable (10U_GDS4_SFC). Es ist im Wesentlichen ein Breiten-/Längengitterwindwerte enthält:

[1] "file example.nc has 2 dimensions:" 
[1] "lat_0 Size: 1280" 
[1] "lon_1 Size: 2560" 
[1] "------------------------" 
[1] "file example.nc has 1 variables:" 
[1] "float 10U_GDS4_SFC[lon_1,lat_0] Longname:10 metre U wind component Missval:1e+30" 

Die Breite variable läuft von +90 bis -90 und die Länge variable läuft von 0 bis 360.

Ich wünsche eine Teilmenge der extrahieren, der Gesamt Raster die folgenden geografische Ecke Grenzen mit:

unten links: Lat: 34.5˚, Long: 355˚, oben links: Lat: 44.5˚, Long: 355˚, oben rechts: Lat: 44,5 °, lang: 12 °, untere rechte Ecke: Breite: 34,5 °, Länge: 12 °

ich weiß, dass Teile einer Variablen extrahiert werden können, den get.var.ncdf() Befehl (Beispiel unten) mit:

z1 = get.var.ncdf(example.nc, "10U_GDS4_SFC", start=c(11,26), count=c(5,5)) 

Allerdings kann ich nicht arbeiten, wie lat/long eingebaut werden kann, so dass ich am Ende mit einem Teilmengen-Gitter, das Variablenwerte enthält. Ich bin neu mit netCDF-Werten in R zu arbeiten, und jeder Rat würde sehr geschätzt werden. Danke vielmals!

Antwort

5

Im Prinzip sind Sie 2/3 des Weg dorthin. Sie können die Startindizes natürlich mit etwas wie diesem erstellen:

require(ncdf4) 

ncFile <- nc_open(MyNetCDF) 
LonStartIdx <- which(ncFile$dim$lon$vals == 355) 
LatStartIdx <- which(ncFile$dim$lat$vals == 34.5) 

Tun Sie das gleiche für die Zählungen. Dann lesen Sie die Variable, die Sie

wollen
MyVariable <- ncvar_get(ncFile, varName, start=c(LonStartIdx, LatStartIdx), count=...) 

jedoch in Ihrem Fall, dass Sie kein Glück so weit ich weiß. Die Lese-/Schreib-Netcdf-Routinen erledigen ihre Aufgaben sequentiell. Ihr Gitter wird umgebrochen, da Sie Koordinaten haben, die von 0 - 360 in der Länge gehen und Sie sind an einer Box interessiert, die den Nullmeridian enthält.

Für Sie (vorausgesetzt, Sie nicht zu viele Daten haben) wäre es sinnvoll, im vollen Raster in R zu lesen, und dann entweder subset oder Indizes erstellen which mit und schneiden Sie Ihre „Box“ in R.

ncFile <- nc_open(MyNetCDF) 
LonIdx <- which(ncFile$dim$lon$vals > 355 | ncFile$dim$lon$vals < 10) 
LatIdx <- which(ncFile$dim$lat$vals > 34.5 & ncFile$dim$lat$vals < 44.5) 
MyVariable <- ncvar_get(ncFile, varName)[ LonIdx, LatIdx] 
nc_close(ncFile) 

Bemerkung: ich ziehe es ncdf4, finde ich die Syntax ein wenig leichter zu merken (und es war ein weiterer Vorteil gegenüber dem älteren netcdf R-Paket, das ich vergessen habe ...)

Ok. Kommentare können nicht so lange sein, wie ich sie brauchen würde, also habe ich die Antwort aktualisiert Keine Sorge. Lassen Sie uns die Fragen Schritt für Schritt durchgehen.

  • Die which Funktionsweise funktioniert. Ich benutze es selbst.
  • Die Daten werden in einem ähnlichen Format wie in der netcf-Datei sein, aber ich bin mir nicht sicher, ob es ein Problem mit dem Nullmeridian gibt (ich denke ja).Sie könnten die beiden Hälften tauschen müssen durch so etwas wie diese (ersetzen Sie die entsprechende Zeile in dem zweiten Beispiel) zu tun

    LonIdx <- c(which(ncFile$dim$lon$vals > 355) , which(ncFile$dim$lon$vals < 10)) 
    

    Diese Reihenfolge der Koordinatenindizes ändert, so dass der westliche Teil zuerst und dann der Osten kommt.

  • Neuformatierung alles auf einem 2x3 Datenrahmen ist möglich. Nehmen Sie die Daten meiner zweiten Codebeispiel gibt (eine Matrix sein, [lon x lat]. Auch die Werte der Koordinaten erhalten von

    lon <- ncFile$dim$lon$val[LonIdx] 
    

    (oder wie Länge in Ihrem Beispiel genannt wird, gleich für lat). dann montieren die Matrix

    cbind(rep(lat, each=length(lon)), rep(lon,length(lat)), c(myVariable)) 
    
  • die Koordinaten werden natürlich die gleichen wie in der netcdf Datei ...

Sie müssen Samity überprüfen Sie die letzten cbind verwenden, wie Ich bin nur zu 98% zuversichtlich, dass ich die Koordinaten nicht vermasselt habe. In den R-Skripts, die ich auf meinem Desktop gefunden habe, benutze ich Loops, die ... böse sind ... Das sollte (ein bisschen?) Schneller sein und ist auch vernünftiger.

+0

@ Joe danke für die Antwort. Ja, die 0-360 Länge ist ein Problem. Ich brauche jeden variablen Wert, um eine lat/long-Referenz zu haben, also glaube ich nicht, dass Ihre welche Option funktionieren wird? Kennst du einen Weg, mit der Box entweder im selben Format am ursprünglichen netCDF oder in einem? X3-Datenrahmen mit den folgenden Spalten zu enden: lat, long, variable. Ich brauche auch die Box, um den gleichen Abstand in den Koordinatenwerten wie die ursprüngliche netCDF zu haben, da es ein Gitter ist. Alle weiteren Vorschläge würden sehr geschätzt werden. Entschuldigung für mein begrenztes Programmierwissen. – Emily

+0

Ich habe versucht, alles in einen Kommentar zu schreiben, aber sie können nicht lang genug sein. Also habe ich die Antwort aktualisiert. Ich hoffe, das hilft! –

+0

@ Joe Danke für das Update. Ich kann sehen, wie das gut funktionieren soll. Ich habe Probleme damit, es im Moment mit meiner Datei zu arbeiten, aber ich denke, dass dies wahrscheinlich mit der Datei und nicht mit dem Code zusammenhängt! Es gibt mir einen großartigen Ausgangspunkt! Vielen Dank – Emily

0

Sie können auch CDO verwenden den Bereich von der bash-Befehlszeile zuerst zu extrahieren und dann die Datei in R lesen:

cdo sellonlatbox,-5,12,34.5,44.5 in.nc out.nc 

ich in der obigen Diskussion beachten Sie, dass es ein Problem in Bezug auf die Reihenfolge der war Breitengrade. Sie können auch den CDO-Befehl "invertlat" verwenden, um das für Sie zu sortieren.