2016-06-13 2 views
1

Я пытаюсь создать файл GeoJSON с модулем Python geojson, состоящим из регулярной 2-й сетки точек, чьи «свойства» связаны с геофизическими переменными (скоростью, температурой, и т.д). Информация поступает из файла netcdf.«Не совместимый JSON-номер», строя файл geojson

Так что код что-то вроде этого:

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]})) 

В этом случае точка имеет компоненты скорости в объекте «Свойства». Ошибки я получаю на линии features.append() со следующим сообщением:

*ValueError: -5.4989638 is not JSON compliant number* 

, который соответствует значению долготы. Может ли кто-то объяснить мне, что может быть неправильным?

+0

Единственный код в модуле GeoJSON, который соответствует вашей ошибки здесь: https://github.com/frewsxcv/python-geojson/blob/bfea4a814632806761093eafcd50de27ec013de7/geojson/geometry.py#L35-L40 Можете ли вы попробовать «класс (скорость) .__ name__', чтобы узнать, что такое класс вашего номера скорости? – bretmattingly

+0

Все являются массивами numpy класса «numpy.float32». – user1259970

ответ

1

Я нашел решение. Модуль geojson поддерживает только стандартные классы данных Python, а numpy - до 24 типов. К сожалению, модуль netCDF4 нуждается в numpy для загрузки массивов из файлов netCDF. Я решил использовать метод numpy.asscalar(), как описано here. Таким образом, в приведенном выше коде, например:

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

заменяется

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

и работает также и для остальных переменных, поступающих из файла NetCDF. В любом случае, спасибо Bret за ваш комментарий, который дает мне ключ к его решению.

0

Я использовал просто преобразование в float и устранил эту ошибку без необходимости numpy.

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