构建geojson文件的“不符合JSON标准的数字”

时间:2016-06-13 18:42:37

标签: json python-3.x gis geojson

我正在尝试使用Python geojson模块构建一个GeoJSON文件,该模块包含一个常规的二维网格点,其“属性”与地球物理变量(速度,温度等)相关联。该信息来自netcdf文件。

所以代码是这样的:

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*

,它对应于经度值。有人能解释一下我的错误吗?

2 个答案:

答案 0 :(得分: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给你的评论,它为我提供了解决问题的线索。

答案 1 :(得分:1)

我使用简单的转换为浮动,它消除了这个错误,而不需要numpy。

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