Select to view content in your preferred language

buffer point data based an field value through script in notebook

296
4
08-20-2024 02:41 AM
TobyChapman
Emerging Contributor

I'm trying to write a script in my online notebook to create a buffer around my point data based on the values I have in a field.   I have written the following script (its abit messy because I download it as a .md file so I could copy and paste it into this window)

python
from arcgis.gis import GIS
gis = GIS("home")
```
```python
from arcgis.features import FeatureLayer
layer = FeatureLayer(feature_layer_url)
 
```python
features = layer.query(where="1=1", return_geometry=True)

```python
geometry=features.features[0].geometry
 
```python
print (geometry)
```
```python
tpr_value = features.features[0].attributes['tpr']

```
```python
from arcgis import features
from arcgis.features import FeatureSet

# Assuming 'layer' is your input layer from earlier steps
result = features.use_proximity.create_buffers(input_layer=layer, distances=[tpr_value], units="Meters", dissolve_type="Dissolve")

# Convert the result to a FeatureSet
buffered_featureset = FeatureSet.from_dict(result)

# Iterate through the features and print their geometries
for feature in buffered_featureset:
    print(feature.geometry)
 
At this point I keep getting the error:
can anyone help me with this?
TypeError                                 Traceback (most recent call last)
/tmp/ipykernel_703/2622654452.py in <cell line: 0>()
      6 
      7 # Convert the result to a FeatureSet
----> 8 buffered_featureset = FeatureSet.from_dict(result)
      9 
     10 # Iterate through the features and print their geometries

/opt/conda/lib/python3.11/site-packages/arcgis/features/feature.py in from_dict(featureset_dict)
   1133         """
   1134         features = []
-> 1135         if "fields" in featureset_dict:
   1136             fields = featureset_dict["fields"]
   1137         else:

TypeError: argument of type 'FeatureCollection' is not iterable
0 Kudos
4 Replies
MarkTorrey
Esri Contributor

Hi Toby,

The create_buffers task will return a FeatureCollection object (when no output_name is supplied). You can use the query method to iterate through each of the features returned in the response.

 

result = features.use_proximity.create_buffers(input_layer=layer, distances=[tpr_value], units="Meters", dissolve_type="Dissolve")

for feature in result.query():
    print(feature.geometry)

 

Let us know if this helps or if you have any questions.

 

0 Kudos
tendtreesTC
Occasional Contributor

That worked great thank you.  The next thing I am trying to do is to convert this buffer into a polygon and add it as a new feature to another feature layer I have.  I have tried the following code: 

target_layer_url = "https://services.arcgis.com/your_service_id/arcgis/rest/services/your_layer_name/FeatureServer/0" target_layer = FeatureLayer(target_layer_url)

 new_features = []

# Iterate through the features in the result and add them to the target layer

for feature in result.query():

buffer_geometry = feature.geometry

buffer_feature = Feature(geometry=buffer_geometry)

new_features.append(buffer_feature)

# Add all the new buffer features to the target layer at once

response = target_layer.edit_features(adds=new_features)

# Check if the operation was successful

if 'addResults' in response and all(result['success'] for result in response['addResults']):

print("All buffer polygons successfully added to the feature layer.")

else:

print("Failed to add some or all buffer polygons to the feature layer.")

 

But I keep getting this returned: 

TypeError                                 Traceback (most recent call last)
/tmp/ipykernel_338/3308212656.py in <cell line: 0>()
      1 for feature in result.query():
      2     buffer_geometry = feature.geometry
----> 3     buffer_feature = feature(geometry=buffer_geometry)
      4     new_features.append(buffer_feature)
      5 

TypeError: 'Feature' object is not callable


As you can probably tell, I don't have alot of experience in coding. any help would be greatly appreciated

 

0 Kudos
MarkTorrey
Esri Contributor

From the error message, it looks like you just need to add an uppercase F to feature(geometry=buffer_geometry)? Other than that it looks good and should run...

MarkTorrey_1-1724268413221.png

 

MarkTorrey_0-1724268233037.png

 

0 Kudos
tendtreesTC
Occasional Contributor

Thank you Mark, the buffers have now been created and loaded into my feature layer however all the polygons have been created as a single item instead of one item for each tree.  My code is below.  I tried to add a filter but that hasn't seem to work.  I'm also wanting to pass the attribute data from my point layer to the new polygon layer if you are able to assist with this also?

from arcgis.gis import GIS
gis = GIS("home")

from arcgis.features import FeatureLayer
feature_layer_url = "https://services-ap1.arcgis.com/fmr3nGZRGUm3hVAY/arcgis/rest/services/Development_site_application/F..."
layer = FeatureLayer(feature_layer_url)

tree_id_to_process = 5

features = layer.query(where=f"tree_ID = {tree_id_to_process}", return_geometry=True)
print (features)

if not features:
print(f"No tree found with tree_ID = {tree_id_to_process}")
else:
# Assuming only one tree point should be returned, handle accordingly
feature = features.features[0] # Get the first (and hopefully only) feature
tpr_value = feature.attributes['tpr']

from arcgis import features
from arcgis.features import FeatureSet

result = features.use_proximity.create_buffers(input_layer=layer, distances=[tpr_value], units="Meters", dissolve_type="None")

for feature in result.query():
print(feature.geometry)

# Define your target layer
target_layer_url = "https://services-ap1.arcgis.com/fmr3nGZRGUm3hVAY/arcgis/rest/services/Development_site_application/F..."
target_layer = FeatureLayer(target_layer_url)

new_features = []

response = target_layer.edit_features(adds=new_features) # Corrected method name to `edit_features`

# Check if the operation was successful
if 'addResults' in response and all(result['success'] for result in response['addResults']):
print("All buffer polygons successfully added to the feature layer.")
else:
print("Failed to add some or all buffer polygons to the feature layer.")

0 Kudos