How do I overwrite an automated buffer feature layer in AGOL using jupyter?

2017
8
01-18-2021 08:47 PM
CassiePorter
New Contributor II

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")

0 Kudos
8 Replies
MehdiPira1
Esri Contributor

Hi @CassiePorter 

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.

 

CassiePorter
New Contributor II

Thanks. Do you know why I can't take this layer offline to collector or field maps?

0 Kudos
MehdiPira1
Esri Contributor

Hi @CassiePorter 

To make the feature layer to work offline, here are the steps:

1. Go to settings of the feature layer and enable sync

MehdiPira1_1-1611796207315.png

 

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.

MehdiPira1_0-1611796172622.png

 

 

0 Kudos
CraigGadaloff1
New Contributor

.

0 Kudos
CassiePorter
New Contributor II

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

0 Kudos
MehdiPira1
Esri Contributor

@CassiePorter 

I edited the code I provided above.

0 Kudos
CassiePorter
New Contributor II

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'}

 

0 Kudos
MehdiPira1
Esri Contributor

@CassiePorter ,

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.

 

0 Kudos