I am uploading some Points and Lines into ArcGIS Online hosted feature services using a python program the ArcGIS Rest Api. The points work fine but I am having trouble getting the correct format for adding the lines.
For the Points:
{
"features":
"geometry": {
"x": x,
"y": y
},
"attributes": {
"RECORD_ID": RECORD_ID,
"DEVICE_ID": DEVICE_ID,
"DATE_TIME": DATE_TIME,
"LONGITUDE": LONGITUDE,
"LATITUDE": LATITUDE,
}
}
Works.
For the lines If have tried:
{
"features":
"paths":[
[x,y],[x1,y1]],
"spatialReference": {"wkid" : 4326},
"attributes": {
"RECORD_ID": RECORD_ID,
"DEVICE_ID": DEVICE_ID,
"DEVICE_NAME": DEVICE_NAME,
"DATE_TIME": DATE_TIME,
"SPEED": SPEED,
"HEADING": HEADING,
}
}
FAILS.
The error I get is:
"No JSON object could be decoded"
Any idea what I am doing wrong?
Thanks
Larry
Solved! Go to Solution.
I believe for the add query or update (OBJECTID field required) query, the features section is all that is needed. You shouldn't need "fields" or the other sections.
{
"features": [{
"attributes": {
"RECORD_ID": 1,
"DATE_TIME": 1546359300000,
"SPEED": 1,
"HEADING": 12
},
"geometry": {
"paths": [
[
[-5871083.00245447, 6028331.87508284],
[-5871713.60793782, 6027605.72331413]
]
]
}
}]
}
I did notice that the spatial reference of the line layer returned is 3857 - web mercator (see below). From your first json example, it looks like you are trying to use 4326 - lon/lat. You may need to convert your coordinates before the update query with a projectAs.
"spatialReference": {
"wkid": 102100,
"latestWkid": 3857
}
Try adding an extra set of square brackets around your "paths"
No Luck, same erro.
{
"features":
"paths":[
[[x,y],[x1,y1]]],
"spatialReference": {"wkid" : 4326},
"attributes": {
"RECORD_ID": RECORD_ID,
"DEVICE_ID": DEVICE_ID,
"DEVICE_NAME": DEVICE_NAME,
"DATE_TIME": DATE_TIME,
"SPEED": SPEED,
"HEADING": HEADING,
}
}
I should have caught this earlier. ArcGIS feature objects don't have a "paths" property at the feature level. You need to have a "geometry" property that contains the path and spatial reference.
See Feature object—Common Data Types | ArcGIS for Developers and Geometry objects—Common Data Types | ArcGIS for Developers
When you request a line feature, what does the returned json look like (specifically, the geometry portion)?
I haven't tried looking at the result of requesting a line. I did export a json line layer from AGOL and that had the geojson formatting which I did try to use but without and luck so I went back to the ESRI version of json using the "paths" method.
Also, checking json with jsonlint.com will also help locate issues.
So, perhaps something like:
{
"features": {
"geometry": {
"paths": [
[
[0, 0],
[1, 1]
]
],
"spatialReference": {
"wkid": 4326
}
},
"attributes": {
"RECORD_ID": 1,
"DEVICE_ID": 1,
"DEVICE_NAME": "NAME",
"DATE_TIME": 123,
"SPEED": 1,
"HEADING": 1
}
}
}
I just tried your syntax exactly and I got the same error. I will try your idea of requesting
a json line from AGOL and see what I get back. BTW the record gets inserted each time with all
of the attributes correct, just no line object.
Thanks
{
"features": {
"geometry": {
"paths": [
[
[0, 0],
[1, 1]
]
],
"spatialReference": {
"wkid": 4326
}
},
"attributes": {
"RECORD_ID": 1,
"DEVICE_ID": 1,
"DEVICE_NAME": "NAME",
"DATE_TIME": 123,
"SPEED": 1,
"HEADING": 1
}
}
}
This is the result from a request to AGOL for a line record. The last 2 lines are the features and geometry.
This one I added in the editor on AGOL
{"objectIdFieldName":"OBJECTID","uniqueIdField":{"name":"OBJECTID","isSystemMaintained":true},"globalIdFieldName":"GlobalID",
"geometryProperties":{"shapeLengthFieldName":"Shape__Length","units":"esriMeters"},
"geometryType":"esriGeometryPolyline","spatialReference":{"wkid":102100,"latestWkid":3857},
"fields":[{"name":"RECORD_ID","type":"esriFieldTypeInteger","alias":"RECORD_ID","sqlType":"sqlTypeOther",
"domain":null,"defaultValue":null},{"name":"DATE_TIME","type":"esriFieldTypeDate","alias":"DATE_TIME",
"sqlType":"sqlTypeOther","length":0,"domain":null,"defaultValue":null},{"name":"SPEED","type":"esriFieldTypeDouble",
"alias":"SPEED","sqlType":"sqlTypeOther","domain":null,"defaultValue":null},{"name":"HEADING","type":"esriFieldTypeDouble",
"alias":"HEADING","sqlType":"sqlTypeOther","domain":null,"defaultValue":null}],
"features":[{"attributes":{"RECORD_ID":1,"DATE_TIME":1546359300000,"SPEED":1,"HEADING":12},
"geometry":{"paths":[[[-5871083.00245447,6028331.87508284],[-5871713.60793782,6027605.72331413]]]}}]}
This one I added using python. You will notice that it does not have any geometry.
{"objectIdFieldName":"OBJECTID","uniqueIdField":{"name":"OBJECTID","isSystemMaintained":true},"globalIdFieldName":"GlobalID",
"geometryProperties":{"shapeLengthFieldName":"Shape__Length","units":"esriMeters"},
"geometryType":"esriGeometryPolyline","spatialReference":{"wkid":102100,"latestWkid":3857},
"fields":[{"name":"RECORD_ID","type":"esriFieldTypeInteger","alias":"RECORD_ID","sqlType":"sqlTypeOther",
"domain":null,"defaultValue":null},{"name":"DATE_TIME","type":"esriFieldTypeDate","alias":"DATE_TIME"
,"sqlType":"sqlTypeOther","length":0,"domain":null,"defaultValue":null},{"name":"SPEED","type":"esriFieldTypeDouble",
"alias":"SPEED","sqlType":"sqlTypeOther","domain":null,"defaultValue":null},{"name":"HEADING","type":"esriFieldTypeDouble",
"alias":"HEADING","sqlType":"sqlTypeOther","domain":null,"defaultValue":null}],
"features":[{"attributes":{"RECORD_ID":18790232,"DATE_TIME":1547054436000,"SPEED":9.15513190909996E-07,"HEADING":20.2115876610467}}]}
I believe for the add query or update (OBJECTID field required) query, the features section is all that is needed. You shouldn't need "fields" or the other sections.
{
"features": [{
"attributes": {
"RECORD_ID": 1,
"DATE_TIME": 1546359300000,
"SPEED": 1,
"HEADING": 12
},
"geometry": {
"paths": [
[
[-5871083.00245447, 6028331.87508284],
[-5871713.60793782, 6027605.72331413]
]
]
}
}]
}
I did notice that the spatial reference of the line layer returned is 3857 - web mercator (see below). From your first json example, it looks like you are trying to use 4326 - lon/lat. You may need to convert your coordinates before the update query with a projectAs.
"spatialReference": {
"wkid": 102100,
"latestWkid": 3857
}