I am attempting to write a python script to append csv data to a feature service. I manually perform this daily with the online update/append. Using the same csv I wrote a script by following an example from a presentation by Paul Baker on youtube. ArcGIS Online: Managing Data.
I am able to append the data to the Feature Service and all of the fields populate with the proper attributes but it must lack location because I can not zoom to the new features on the map.
I use the analyze function then pass the results to perform the append.
analyze_results = gis.content.analyze(item=append_item.id,
file_type='csv',
#location_type='none')
source_locale='en')
I print the fields names and types in my source file
for csv_field in analyze_results['publishParameters']['layerInfo']['fields']:
print(f"{csv_field['name']:30} {csv_field['type']}")
Blink esriFieldTypeInteger
Element_Name esriFieldTypeString
ACK esriFieldTypeInteger
Upline_Feeder esriFieldTypeString
Upline_Device esriFieldTypeString
UplineRecloser esriFieldTypeString
Phasing esriFieldTypeString
Consumer_Type esriFieldTypeString
Consumer_Bldng_Num esriFieldTypeString
Name esriFieldTypeString
Tadd esriFieldTypeString
Y esriFieldTypeDouble
X esriFieldTypeDouble
Date_ esriFieldTypeDate
The location is in the x and y fields
I can see this by printing the publishParameters
{'type': 'csv', 'name': 'data', 'useBulkInserts': True, 'sourceUrl': '', 'locationType': 'coordinates', 'maxRecordCount': 1000, 'latitudeFieldName': 'Y', 'longitudeFieldName': 'X', 'columnDelimiter': ','
The append code..
try:
fs_layer.append(item_id=append_item.id,
upload_format='csv',
source_table_name='',
#field_mappings=None,
field_mappings=[{"source":"ACK","name":"ACK"},
{"source":"Blink","name":"Blink"},
{"source":"Consumer_Bldng","name":"Consumer_Bldng"},
{"source":"Consumer_Type","name":"Consumer_Type"},
{"source":"Date_","name":"Date_"},
{"source":"Element_Name","name":"Element_Name"},
{"source":"y","name":"y"},
{"source":"x","name":"y"},
{"source":"Meter_Number","name":"Meter_Number"},
{"source":"Name","name":"Name"},
{"source":"Phasing","name":"Phasing"},
{"source":"Tadd","name":"Tadd"},
{"source":"Upline_Device","name":"Upline_Device"},
{"source":"Upline_Feeder","name":"Upline_Feeder"},
{"source":"Upline_Recloser","name":"Upline_Recloser"}],
edits=None,
source_info=analyze_results,
upsert=False,
skip_updates=False,
use_globalids=False,
update_geometry=False,
append_fields=["Blink",
"Element_Name",
"ACK",
"Upline_Feeder",
"Upline_Device",
"UplineRecloser",
"Phasing",
"Consumer_Type",
"Consumer_Bldng_Num",
"Name",
"Tadd",
"Latitude",
"Longitude",
"X",
"Y",
"Date_"],
rollback=True)
print("Append completed successfully")
except:
print("Something went wrong")Any help would be appreciated.
Are you mixing lower case "x" and "y" with uppercase "X" and "Y" throughout the code, including in the mapping?
I believe I tried to standardize on Upper in one of my trials. I will try again. Thanks
Hi Richard,
I believe that the problem is that this code is updating attribute fields, a feature in ArcGIS Online is stored in the following format:
{"geometry": {"x": , "y": }, "attributes": {"OBJECTID": , "GlobalID": "", "Field1":, "Field2":}}
Field mapping is going to match the attribute dictionary, but won't add the geometry. This sample notebook goes into adding and updating features from a CSV as well as adding/updating geometry (Cells 18 and 23). The important parts are:
input_geometry = {'y':float(matching_row['latitude']), 'x':float(matching_row['longitude'])}
output_geometry = geometry.project(geometries = [input_geometry], in_sr = 4326, out_sr = cities_fset.spatial_reference['latestWkid'], gis = gis)
# assign the updated values new_feature.geometry = output_geometry[0]
I would look at the notebook mentioned above, as it looks like it closely matches your needs.
I hope this helps,
Nico