I've got a layout file that I've copied to my Portal. The layout refers to a webmap (which contains a few layers).
My intention is to print the layout, zoomed to a certain extent (which I'd pass through to it), and only showing certain features (which, again, I can pass to it, or provide in a definition query).
How would I accomplish this? I managed it using a local project, but now I'm trying to do it via Portal and have to use the arcgis.gis module. I've got code that will log in to the Portal and get the required extent, so just need to know how to interact with the layout.
My code, so far, is below:
import arcpy, os, sys from arcgis.mapping import WebMap from arcgis.gis import GIS from arcgis.features import FeatureLayer #get variables RequestedId = arcpy.GetParameterAsText(0) cUN = arcpy.GetParameterAsText(1) cPW = arcpy.GetParameterAsText(2) #connect gis = GIS(r"https://mydomain/portal", cUN, cPW) #try and load the webmap wm_item = gis.content.get("WebMapId") wm = WebMap(wm_item) #try to access the layer for lyr in wm.layers: if lyr.title == "MyLayer": #convert it into a feature layer for local use flayer = FeatureLayer(lyr.url) ###some handy old code, no longer used ###for f in flayer.properties.fields: ### arcpy.AddMessage(f['name']) #grab the extent MyExtent = flayer.query(where="Id='" + RequestedId + "'", return_extent_only=True) #now we're going to need our layout lyt_item = gis.content.get("MyLayoutId") arcpy.AddMessage(lyt_item)
For reference, this was my original code, which worked fine using a local project. Basically, I'd like to replicate this:
import arcpy #select our current map, and then the layer we want, and grab our Id from parameters aprx = arcpy.mp.ArcGISProject("CURRENT") RequestedId = arcpy.GetParameterAsText(0) m = aprx.listMaps("MyWebMap") lyr = m.listLayers("MyLayer") #set our definition query lyr.definitionQuery = "Id = '" + RequestedId + "'" #define our extents extents =  #loop through and add our shape extent with arcpy.da.SearchCursor(lyr,'SHAPE@') as cursor: for row in cursor: if row: extents.append(row.extent) #get our actual extent eXMin = min([ext.XMin for ext in extents]) eXMax = max([ext.XMax for ext in extents]) eYMin = min([ext.YMin for ext in extents]) eYMax = max([ext.YMax for ext in extents]) #now go into the layout lyt = aprx.listLayouts("Layout") mf = lyt.listElements("mapframe_element", "WEBMAP_MAP_FRAME") mf.map = m myExtent = arcpy.Extent(eXMin, eYMax, eXMax, eYMin, 0, 0) mf.camera.setExtent(myExtent) mf.camera.scale = mf.camera.scale * 1.1 m.defaultCamera = mf.camera lyt.exportToPDF("C:\\temp\\mylayout.pdf")
I've seen some things saying that you need to know where in the DataStore the layout is saved, but I can't find any way to find this out.