2016-06-13 16 views
1

Ich versuche eine GeoJSON-Datei mit Python-Geojson-Modul zu erstellen, das auf einem regulären 2D-Raster von Punkten basiert, deren 'Eigenschaften' mit geophysikalischen Variablen (Geschwindigkeit, Temperatur, etc). Die Informationen stammen aus einer netcdf-Datei."Nicht JSON-konforme Nummer" Erstellen einer Geojson-Datei

So ist der Code so ähnlich:

from netCDF4 import Dataset 
import numpy as np 
import geojson 

ncfile = Dataset('20140925-0332-n19.nc', 'r') 
u = ncfile.variables['Ug'][:,:] # [T,Z,Y,X] 
v = ncfile.variables['Vg'][:,:] 
lat = ncfile.variables['lat'][:] 
lon = ncfile.variables['lon'][:] 

features=[] 
for i in range(0,len(lat)): 
    for j in range(0,len(lon)): 
     coords = (lon[j],lat[i]) 
     features.append(geojson.Feature(geometry = geojson.Point(coords),properties={"u":u[i,j],"v":v[i,j]})) 

In diesem Fall wird der Punkt Geschwindigkeitskomponenten in den 'Eigenschaften' Objekt hat. Der Fehler I erhalten, ist auf der features.append() entsprechend der folgenden Nachricht:

*ValueError: -5.4989638 is not JSON compliant number* 

, die zu einem Längenwert entspricht. Kann mir jemand erklären, was falsch ist?

+0

Der einzige Code in das GeoJSON-Modul, das auf Ihre Fehler entspricht, wird hier gefunden: https://github.com/frewsxcv/python-geojson/blob/bfea4a814632806761093eafcd50de27ec013de7/geojson/geometry.py#L35-L40 Können Sie eine 'class (velocity) .__ name__' versuchen, um zu sehen, wie die Klasse Ihrer Velocity-Nummer ist? – bretmattingly

+0

Alle sind Nummernfelder der Klasse "numpy.float32". – user1259970

Antwort

1

Ich fand die Lösung. Das Geojson-Modul unterstützt nur Standard-Python-Datenklassen, während numpy bis zu 24 Typen erweitert. Leider benötigt das netCDF4 Modul numpy um Arrays aus netCDF Dateien zu laden. Ich löste mit numpy.asscalar() Methode wie here erklärt. So in dem obigen Code zum Beispiel:

coords = (lon[j],lat[i]) 

wird ersetzt durch

coords = (np.asscalar(lon[j]),np.asscalar(lat[i])) 

und arbeitet auch für den Rest der Variablen aus der Datei netCDF kommen. Wie auch immer, danke Bret für Ihren Kommentar, die mir den Schlüssel liefern, um es zu lösen.

0

Ich habe einfach Konvertierung verwendet, um zu floaten und es beseitigt diesen Fehler ohne Notwendigkeit von numpy.

coords = (float(lon[j]),float(lat[i]))