If you have a polyline or polygon hosted feature service in ArcGIS Online, there is an option under the Settings tab to Optimize Layer Drawing, which "increases the drawing speed of line and polygon layers with detailed geometry (e.g., many vertices) but also uses additional storage space to do so."
Does anyone know if there is a Python API way to run this process on feature services? It would be a very beneficial thing to do via scripting.
See example eight on this page: https://developers.arcgis.com/rest/services-reference/online/update-definition-feature-layer-.htm
Not a full answer, but maybe will get you on the right track.
When I have Optimize Layer Drawing active I cannot use featureLayer.layers[0].edit_features().
Having a way to programmatically disable the optimization temporarily, to perform the edit_features, would be appreciated.
Old thread but thought I'd post this here in case Google brings anyone here. There is an update_definition method in the arcgis.features.managers module of the Python API, but it's been inconsistent for me. So I just make the call through the REST API. The code below enables layer optimization for the specified feature service item and layer index:
from arcgis.gis import GIS
import requests
import json
gis = (portal_url, username, password)
item_id = '' # item id of feature service wih layer to optimize
item = gis.content.get(item_id)
layer_index = 0 # layer index in feature service for layer to optimize
update_def_url = f"{item.layers[layer_index].url}/updateDefinition".replace(r'rest/services',r'rest/admin/services')
token = gis._con.token
data = {'token':token,
'f': 'json',
'async': 'true',
'updateDefinition': r'{"multiScaleGeometryInfo":{"levels":[]}}'
}
result = requests.post(update_def_url, data=data, timeout=10)
status_url = f"{result.json().get('statusURL')}?token={token}&f=json"
status = None
while not status == 'Completed' and not status == 'Failed':
status = requests.get(status_url, timeout=10).json().get('status')
print(f"Optimization status: {status}")
time.sleep(10)
else:
if status == 'Completed':
logging.info(f"Layer drawing optimized successfully for {item.title} ({item.id})")
if status == 'Failed':
status = requests.get(status_url, timeout=10).json()
logging.error(f"Layer optimization failed for {item.title} ({item.id}). Status: {status.json()}")