I have a feature layer in AGOL that contains points, and have scripted in jupyter for buffers to be generated based on one of the fields (proximity analysis) and then output a polygon feature layer with these buffers. My problem is that I need to automate the buffers throughout the day (as data is changed for the field that the buffers are generated from). How do I get the output to overwite the existing feature layer each time the buffers are calculated?
This is the script I have to generate the buffers. Just need it to overwrite the output name.
buffer= use_proximity.create_buffers(itembuffersgeneratedfrom_layer1,
field='buffer_field',
units='meters',
output_name="Buffered_Points")
The following script overwrites a feature layer:
from arcgis.gis import GIS
from arcgis.features import use_proximity
from arcgis.features import FeatureLayerCollection
gis = GIS("url", "username", "password")
# get the buffered feature layer
existing_Buffered_Points_item = gis.content.get("existing_Buffered_Points_item_id")
fLyr = existing_Buffered_Points_item.layers[0]
fLyr.manager.truncate()
#access the first layer in points_item
points_layer1 = points_item.layers[0]
# get the newly buffered item
points_buffer = use_proximity.create_buffers(points_layer1,
field='buffer',
units='meters',
output_name="Buffer_m")
points_buffer_itemID = gis.content.get(points_buffer.id)
feature_layer_collection = FeatureLayerCollection.fromitem(existing_Buffered_Points_item)
feature_layer_collection.manager.overwrite(points_buffer_itemID)
======================================================================
Please give a like if helpful and Accept as Solution if it's answered your query.
Thanks. Do you know why I can't take this layer offline to collector or field maps?
To make the feature layer to work offline, here are the steps:
1. Go to settings of the feature layer and enable sync
2. Create a web map from this feature layer, you can include other feature services/layers as well
3. Go to settings of the web map once it's created and turn on the offline mode and save it.
Hi. I can't see how this directly overwrites the existing feature layer. I need it to simply update the buffer based on a field (as this field is constantly updated) without creating a new item (which is part of a map). Is this possible?
Sorry this is all a bit new for me but I couldn't get the code above to do this.
So far I generate the buffer like this:
from arcgis.gis import GIS
gis = GIS("home")
points_item = gis.content.get("pointsID")
points_item
from arcgis.features import use_proximity
#access the first layer in points_item
points_layer1 = points_item.layers[0]
points_buffer = use_proximity.create_buffers(points_layer1,
field='buffer',
units='meters',
output_name="Buffer_m")
I need this output to overwrite an existing layer buffer_m
I edited the code I provided above.
Almost working, but got an error on overwrite.
The code:
pointsFeatureLayer = gis.content.get("[pointslayerguid]")
pointsLayer = pointsFeatureLayer.layers[0]
points_buffer = use_proximity.create_buffers(pointsLayer,
field='CHANGE_TOL',
units='meters',
output_name="Buffer_m4")
points_buffer_itemID = gis.content.get(points_buffer.id)
existingBufferFeatureLayer = gis.content.get("[bufferlayerguid]")
existingBufferLayer = existingBufferFeatureLayer.layers[0]
existingBufferLayer.manager.truncate()
feature_layer_collection = FeatureLayerCollection.fromitem(existingBufferFeatureLayer)
feature_layer_collection.manager.overwrite(points_buffer_itemID)
{'error': 'Cannot find related data item used to publish this feature layer'}
I reckon the error is due to the following limitation from manager.overwrite:
"3. The data file used to overwrite should be of the same format and filename as the original that was used to publish the layer 4."
Anyway, I've created another script and tested successfully. It first truncates the existing buffered feature layer then appends the newly buffered ones. You just need to add/remove and update the attribute fields according to your feature layer fields.
from arcgis.gis import GIS
from arcgis.features import use_proximity
from copy import deepcopy
gis = GIS("url", "username", "password")
# get the buffered feature layer
existing_Buffered_Points_item = gis.content.get("existing_Buffered_Points_item_id")
existing_Buffered_Points_layers = existing_Buffered_Points_item.layers
fLyr = existing_Buffered_Points_item.layers[0]
fset = fLyr.query()
template_hostedFeature = deepcopy(fset.features[0])
fLyr.manager.truncate()
flayer_rows = fset.sdf
#access the first layer in points_item
points_layer1 = points_item.layers[0]
# get the newly buffered item
points_buffer = use_proximity.create_buffers(points_layer1,
field='buffer',
units='meters',
output_name="Buffer_m")
new_buffered_points_item = gis.content.get(points_buffer.id)
new_fLyr = new_buffered_points_item.layers[0]
new_fset = new_fLyr.query()
new_fset_features = new_fLyr.query().features
new_flayer_rows = new_fset.sdf
features_to_be_added = []
for index, row in new_flayer_rows.iterrows():
new_feature = deepcopy(template_hostedFeature)
input_geometry = new_fset_features[index].geometry
output_geometry = geometry.project(geometries = [input_geometry],
in_sr = 3857,
out_sr = 3857,
gis = gis)
# assign the updated values
# update these based on your dataset
new_feature.geometry = output_geometry[0]
new_feature.attributes['OBJECTID'] = row['OBJECTID']
new_feature.attributes['Asset_ID'] = row['Asset_ID']
new_feature.attributes['Latitude'] = row['Latitude']
new_feature.attributes['Longitude'] = row['Longitude']
new_feature.attributes['Speed'] = row['Speed']
new_feature.attributes['Date'] = row['Date']
new_feature.attributes['BUFF_DIST'] = row['BUFF_DIST']
features_to_be_added.append(new_feature)
existing_Buffered_Points_layers[0].edit_features(adds = features_to_be_added)
print("The existing buffer feature layer is updated with new buffered features!")
Cheers
Mehdi
======================================================================
Please give a like if helpful and Accept as Solution if it's answered your query.
Absurdly complicated but good answer from @MehdiPira1 !