我有一个解析json web服务的脚本,并使用解析字段添加到Esri文件地理数据库,在我的脚本末尾收到错误。不确定错误File "C:/Python27/ArcGIS10.2/websocket-client-0.23.0/websocket-client-0.23.0/examples/JSONSerializer.py", line 43, in <module>
narr = numpy.array([vehicles], ndtype)
ValueError: size of tuple must match number of fields.
是什么意思。
脚本:
import json
import jsonpickle
import requests
import arcpy
import numpy
fc = "C:\MYLATesting.gdb\MYLA311"
if arcpy.Exists(fc):
arcpy.Delete_management(fc)
f = open('C:\Users\Administrator\Desktop\myla311.json', 'r')
data = jsonpickle.encode( jsonpickle.decode(f.read()) )
url = "https://myla311test.lacity.org/myla311router/mylasrbe/1/QuerySR"
headers = {'Content-type': 'text/plain', 'Accept': '/'}
r = requests.post(url, data=data, headers=headers)
sr = arcpy.SpatialReference(4326)
decoded = json.loads(r.text)
SRAddress = decoded['Response']['ListOfServiceRequest']['ServiceRequest'][0]['SRAddress']
latitude = decoded['Response']['ListOfServiceRequest']['ServiceRequest'][0]['Latitude']
longitude = decoded['Response']['ListOfServiceRequest']['ServiceRequest'][0]['Longitude']
a = {"items":[{SRAddress, latitude, longitude}]}
ndtype = numpy.dtype([
('SRAddress', 'S16'),
('latitude', 'F48'),
('longitude', 'F48')
])
vehicles = []
for item in a['items']:
vehicles.append(tuple(unicode(item[k] for k in ndtype.names)))
narr = numpy.array([vehicles], ndtype)
arcpy.da.NumPyArrayToFeatureClass(narr, fc, ['longitude', 'latitude'], sr)
print a.keys()
# parsed_json = json.dumps(decoded, sort_keys=True, indent=4)
# print json.dumps(decoded, sort_keys=True, indent=4)
答案 0 :(得分:3)
narr = numpy.array([vehicles], ndtype)
表示创建一个数组,使用ndtype
作为dtype定义,使用[vehicles]
作为数据。 ndtype
定义了fields
。
[vehicles]
那么应该是一个元组列表,每个元组应该有3个项目,例如[(address1, lat1, lon1)]
或[(a1,la1,lo1), (a2,la2,lo2) ....]
我认为您需要显示vehicles
的值,甚至[vehicles]
,以确保符合此模式。 a
有此数据。但vehicles
是从[]
开始创建的,并附加到[vehicles]
。这意味着它已经是一个列表。 vehicles
是列表的列表,而不是元组列表。
在不尝试运行代码的情况下,假设narr = numpy.array(vehicles, ndtype)
已经是必需的元组列表,此更改可能会起作用。
[vehicle]
你的''.join(x[0])
'<generator object <genexpr> at 0x0D5A3D00>'
被剥夺了:
In [20]: item={'1':'one','2':'two','3':'three'}
In [21]: unicode(item[k] for k in item)
Out[21]: '<generator object <genexpr> at 0xb438e02c>'
例如:
item
我认为你想要的是(假设In [33]: item={'1':b'one','2':b'two','3':b'three'}
In [34]: tuple(item[k].decode() for k in item)
Out[34]: ('three', 'two', 'one')
值是字节字符串):
{'items': [set([u'-118.252968', u'34.064937', u'1200 W TEMPLE ST, 90026'])]}
在
{SRAddress, latitude, longitude}
内部结构是一个集合,而不是字典。它由以下产生:
item[k]
我很惊讶SRAddress = u'1200 W TEMPLE ST, 90026'
latitude=u'34.064937'
longitude=u'-118.252968'
# make a dictionary, not a set
a = {"items":[{'SRAddress':SRAddress, 'latitude':latitude, 'longitude':longitude}]}
vehicles=[]
for item in a['items']:
vehicles.append(tuple(item[k] for k in ndtype.names))
# [('1200 W TEMPLE ST, 90026', '34.064937', '-118.252968')]
np.array(vehicles, ndtype)
有效,因为集合不支持索引。
但是让我们尝试用这些数据构建你的数组:
TypeError: a float is required
但最后会产生错误:latitude
。那是因为vehicles
是一个字符串,但是ndtype指定了一个浮点数。
构建vehicles = [(SRAddress, float(latitude), float(longitude))]
np.array(vehicles, ndtype)
的一种较短方法是(仍然可以迭代);
array([(b'1200 W TEMPLE ST', (34.064937591552734+0j), (-118.25296783447266+0j))],
dtype=[('SRAddress', 'S16'), ('latitude', '<c8'), ('longitude', '<c8')])
但这会产生另一个问题:
F48
我认为你不想要float
dtype。可能是f48
,{{1}},也可能是字符串。