I am wondering if it is possible to easily find out which web applications in our ArcGIS Online organization are using a specific feature layer.
For example, if I delete a layer from our organization, I want to make sure I know which web maps and applications the deletion will affect. This can be difficult and tedious to search manually when an organization has many web maps and applications.
Solved! Go to Solution.
I know this is an older post I found it yesterday and had the same problem as you. Izk222 already bypassed the issue with a different technique but for this specific script:
From the top for catching apps and web maps:
from arcgis.gis import GIS import pandas as pd
# Log in to portal; prompts for PW automatically gis = GIS('your portal url including https', 'your username')
# Layer ID to search for and its URL find_id = 'layer id number' find_url = gis.content.get(find_id).url print(find_url)
# Pull list of all web maps in portal webmaps = gis.content.search('', item_type='Web Map', max_items=-1) # Return subset of map IDs which contain the service URL we're looking for m_matches = [m.id for m in webmaps if str(m.get_data()).find(find_url) > -1]
# print web map ids that use this layer for sanity check for i in m_matches: print(i)
# create list to store target maps map_list = [] for w in webmaps: # for every map in your portal try: # Get the JSON as a string wdata = str(w.get_data()) criteria = [ wdata.find(find_url) > -1, # Check if URL is directly referenced any([wdata.find(i) > -1 for i in matches]) # Check if any matching maps are in app ] # If layer is referenced directly or indirectly, append app to list if any(criteria): map_list.append(w) # Some apps don't have data, so we'll just skip them if they throw a TypeError except: continue
# Pull list of all web apps in portal webapps = gis.content.search('', item_type='Application', max_items=-1) app_matches = [a.id for a in webapps if str(a.get_data()).find(find_url) > -1]
# print web app ids that use this layer for sanity check for i in app_matches: print(i)
# Create empty list to populate with results app_list = [] # Check each web app for matches for w in webapps: try: # Get the JSON as a string wdata = str(w.get_data()) criteria = [ wdata.find(find_url) > -1, # Check if URL is directly referenced any([wdata.find(i) > -1 for i in matches]) # Check if any matching maps are in app ] # If layer is referenced directly or indirectly, append app to list if any(criteria): app_list.append(w) # Some apps don't have data, so we'll just skip them if they throw a TypeError except: continue
# display data print('apps:') pd.DataFrame([{'title':a.title, 'id':a.id, 'type':a.type} for a in app_list])
# display data print('web maps:') pd.DataFrame([{'title':m.title, 'id':m.id, 'type':m.type} for m in map_list])
Hey,
Just curious, but how long should it take this tool to run? We have a fairly small AGOL org with less than 500 items but the tool has been running for about 15 minutes so far. This is my second attempt at running it.
I'm running it in the Python window and it appears to be running, but it is just bogged down somewhere.
Thanks for sharing Josh. Came in massively handy for me today.
Hi, this may be a stupid question but I've been going round in circles for what feels like days - where am I putting this code?
Thanks,
Lesley
You can run it into arcgis notebooks. In pro: click analysis on the top ribbon, click the drop down arrow for python toward the top left of the ribbon, click python notebook.
Is there any other way to do this without Python or other coding? I am not a developer but really need this tool. Geo Jobe offers it in Pro for a fee, but would appreciate if ESRI would offer for free!
The short answer for right now is "no", but you can create a custom tool in a Toolbox by right clicking on the Toolbox > New > Script.
Since @jcarlson was so generous with sharing his code, I'd like to share what I did to take it a step further and set up this tool so that others in my organization who didn't have programming experience could search for items. (setup for ArcGIS Pro)
When setting up the tool parameters, I entered "Web Map" and "Web Application" in the Value List I created for that parameter. This creates a drop down in the tool and ensures there won't be any typos in the user input that would break the code.
Also, if anyone reads this who is completely new to Python, I wanted to point out that when setting up tools to use within Pro or ArcMap, you use arcpy.AddMessage() to print messages to the console instead of a traditional print() statement.
And this is what the output looks like (nothing fancy) - this particular layer is only used in one web map. (side note - the time it takes to run depends on the number of items in your Organization's contents. It may run much quicker if you have fewer items to search through).
This community has helped me so much throughout the years, I like to give back when I can. I hope this helps.....
Best,
Katherine
from arcgis.gis import GIS
import pandas as pd
# Log in to portal; 'home' uses the credentials used to login within Pro
gis = GIS('home')
# Set up input parameters to use in the GUI
find_id = arcpy.GetParameterAsText(0)
search_type = arcpy.GetParameterAsText(1)
find_url = gis.content.get(find_id).url
if search_type == 'Web Map':
arcpy.AddMessage("Searching for Web Maps. This could take a few minutes...")
# Pull list of all web maps in portal
webmaps = gis.content.search('', item_type='Web Map', max_items=-1)
# Return subset of map IDs which contain the service URL we're looking for
matches = [m.id for m in webmaps if str(m.get_data()).find(find_url) > -1]
# Create empty list to populate with results
map_list = []
# Check each web map for matches
for w in webmaps:
try:
# Get the JSON as a string
wdata2 = str(w.get_data())
criteria = [
wdata2.find(find_url) > -1, # Check if URL is directly referenced
any([wdata2.find(i) > -1 for i in matches]) # Check if any matching maps are in app
]
# If layer is referenced directly or indirectly, append map to list
if any(criteria):
map_list.append(w)
# Some apps don't have data, so we'll just skip them if they throw a TypeError
except:
continue
output = pd.DataFrame([{'title': m.title, 'id': m.id, 'type': m.type} for m in map_list])
arcpy.AddMessage(f"OUTPUT TABLE: \n \n {output}")
if search_type == 'Web Application':
arcpy.AddMessage("Searching for Web Applications. This could take a few minutes...")
# Pull list of all web apps in portal
webapps = gis.content.search('', item_type='Application', max_items=-1)
# Create empty list to populate with results
app_list = []
# Return subset of map IDs which contain the service URL we're looking for
matches = [a.id for a in webapps if str(a.get_data()).find(find_url) > -1]
# Check each web app for matches
for w in webapps:
try:
# Get the JSON as a string
wdata = str(w.get_data())
criteria = [
wdata.find(find_url) > -1, # Check if URL is directly referenced
any([wdata.find(i) > -1 for i in matches]) # Check if any matching maps are in app
]
# If layer is referenced directly or indirectly, append app to list
if any(criteria):
app_list.append(w)
# Some apps don't have data, so we'll just skip them if they throw a TypeError
except:
continue
output = pd.DataFrame([{'title':a.title, 'id':a.id, 'type':a.type} for a in app_list])
arcpy.AddMessage(f"OUTPUT TABLE: \n \n {output}")
Thank you all for sharing this information, it's greatly appreciated and will be much used!!
This looks really great! I am new to python scripts though and when trying to run the tool I get an error message:
Any help on how to resolve this error would be much appreciated!
It should be noted that my maps and feature layers are in ArcGIS Online and not portal...