POST
|
Thanks to both Jeff and Johannes for responding to my questions. All their responses to my post were informative and useful. In the end, I went with Johannes suggestion because it seemed the least complicated and most easily understood by anyone who has to maintain the tool I am creating later. Thank you! jtm
... View more
02-21-2023
01:52 PM
|
0
|
0
|
1109
|
POST
|
Thank you for your responses, Jeff! I recognize that what I am doing here is odd but it was only meant to illustrate what I was running into in the simplest example possible. In reality, I'm using information from a couple of places to determine which parameters are actually being added to the tool at runtime and don't want to have to duplicate the exact same code in the execute to figure out which parameters to check for input values and how to interpret them. What's in parameter 2 during one execution is not necessarily in parameter 2 the next time...it might be in parameter 3. The information in your first post, that I was employing a Class Attribute, rather than a property was useful to know. I think I might be getting languages mixed up because I thought I remembered defining classes that way in Python before but I'm sure not now. In the end, I went with Johannes suggestion. I have a number of these values that I want to store while building the parameter list and that seemed the least complicated and most easily understood by anyone who has to update this code later. Cheers jtm
... View more
02-21-2023
01:50 PM
|
0
|
0
|
1110
|
POST
|
Hello all, I'm hoping someone can tell me what the "self" is referring to in a Toolbox's Tool's method definitions. It's not what I expect it to be. Below is an example with regards to a property set on the Tool object in its getParameterInfo method using "self". The following is the smallest example I could come up with to illustrate the behaviour which is unexpected to me. I can perform the following steps in both ArcPro 3.0.2 and ArcCatalog 10.4.1 with the same results, so this is not new. The code I provide at the end of this post will run in either product as is. 1. In ArcPro or ArcCatalog (or ArcMap, I assume), create a new Python Toolbox to generate a pyt file that includes default class definitions for Toolbox and Tool objects. The following code changes are all within the Tool class' definition. 2. Add a version property to Tool and set its value to 1; 3. In Tool's getParameterInfo(self) method, add an arcpy.Parameter to ensure its code is running and before returning the parameter, set self.version to 100; 4. In Tool's execute method, add an arcpy message to print out the value in self.version. 5. Run the tool. No need to make any changes in its GUI, just load it, run it and look at its output messages. When I run this tool, the value that is output by the "print" message is 1. I expect it to be 100. As a further test, I put "self.version = " different values in updateParameters and updateMessages and tried changing the default value in the GUI's Version input box to get them to run. Still, when I run the task, the output tells me the value in self.version is 1. Finally, in Tool's __init__ method, I set self.version to 2. That line is in the code below also, but is currently commented out. Uncomment it to try it yourself. This time, the "print" output 2, so updating the self.version property in the __init__ method works as I expect but not when done in any other Tool method. Can anyone explain why it is not outputing 100 in my original test above? What is "self" referring to in those the Tool class methods' parameter lists? Or this there something wrong with how I am tryign to use it? Regards, # -*- coding: utf-8 -*-
import arcpy
class Toolbox(object):
def __init__(self):
"""Define the toolbox (the name of the toolbox is the name of the
.pyt file)."""
self.label = "Toolbox"
self.alias = "toolbox"
# List of tool classes associated with this toolbox
self.tools = [Tool]
class Tool(object):
# ------------------------------------------
# Added and initialized this property
# ------------------------------------------
version = 1
def __init__(self):
"""Define the tool (tool name is the name of the class)."""
self.label = "Tool"
self.description = ""
self.canRunInBackground = False
# -----------------------------------------
# Added this line
# -----------------------------------------
# self.version = 2
def getParameterInfo(self):
"""Define parameter definitions"""
# ------------------------------------------
# This whole method is new
# ------------------------------------------
# params = None
# return params
version_param = arcpy.Parameter(
displayName="Version",
name="version",
datatype="GPString",
parameterType="Optional",
direction="Input")
version_param.value = "testing, testing, 123 ..."
self.version = 100
return [version_param]
def isLicensed(self):
"""Set whether tool is licensed to execute."""
return True
def updateParameters(self, parameters):
"""Modify the values and properties of parameters before internal
validation is performed. This method is called whenever a parameter
has been changed."""
return
def updateMessages(self, parameters):
"""Modify the messages created by internal validation for each tool
parameter. This method is called after internal validation."""
return
def execute(self, parameters, messages):
"""The source code of the tool."""
# ------------------------------------------
# Added this line
# ------------------------------------------
arcpy.AddMessage("execute: " + str(self.version))
return
def postExecute(self, parameters):
"""This method takes place after outputs are processed and
added to the display."""
return
... View more
02-17-2023
10:23 AM
|
1
|
5
|
1185
|
POST
|
Hello all, Our group uses AWS CloudFormation and ArcGIS Powershell DSC to create EC2 instances with ArcPro and some Python scripts installed to run various long-running processes a couple of times a year. I'm wondering if there is any possible way to programmatically log on to ArcPro with one of our organization's user accounts that has the necessary licensing level? It's the only part of the whole creation and execution that I can't figure out how to automate. It's not critical; we just logon to the EC2 instance and then open ArcPro to login using the account we use for those particular processes. However, it would be lovely if we didn't have to do even that. I've seen a few threads of people trying to do something similar for web applications, via JavaScript. Is it possible to access the OAuth stuff without the UI? It seems like it's the same login being used for ArcPro. Anyway, after a few days searching, I still have no idea if this is even possible, let along how to go about it. Any suggestions or references to useful information is appreciated. Cheers all jtm
... View more
10-22-2021
09:43 AM
|
0
|
0
|
267
|
POST
|
Thanks again, Jansen. I had found that page but was unable to get access to the "New expression" option it suggests should be in the drop down list of fields. Eventually, I realized that the functionality is not available for the service in question because it is being served by a 10.4.1 ArcGIS Server; the functionality was introduced in 10.5.1. So, after some thought, I've decided that I am principally concerned with how the legend appears in an HTML page where the Web Map is displayed using a copy of the minimalist template we have deployed on our server. I am less concerned with how the legend appears in AGOL's viewers...if they're okay with their legends displaying in that order, then so am I...in their viewers 😉 I'm now looking into setting the legendOptions' "order" property to "ascendingValues" after the WebMap has loaded in my HTML pages. So, not really a solution, per se, because my question was how to change the order in the AGOL viewers but perhaps the post will provide some info to others anyway. Thanks again, Jansen! If anyone is able to try his suggestion, let me know if it works for reordering a layer's legend items to display in ascending order and I'll add his entry as a solution also. Joanne
... View more
08-06-2021
02:14 PM
|
1
|
0
|
1365
|
POST
|
Thank you for taking the time to respond, Jansen. In my particular scenario, the Web Map contains only the default basemap and a single ArcGIS Server MapService, so I don't believe the Content rearranging possibility applies. I would like to display the legend for that web service layer in ascending order, rather than (what appears to be the default) descending order. That is, the symbology classes are displaying in the legend, by default, as: 8 - 10 5 - 8 1 - 5 Rather than: 1 - 5 5 - 8 8 - 10 Your Arcade suggestion may work but I don't know enough about that functionality to know how to go about it. I'll look into it though and report back if I find anything. Thanks for the suggestion! Cheers, Joanne
... View more
08-06-2021
11:23 AM
|
1
|
2
|
1372
|
POST
|
I am using a classBreaksRenderer to symbolize a layer in a webmap. The Web Map specification suggests I can use legendOptions' "order" property to indicate the legend should display in ascendingValues or descendingValues (see https://developers.arcgis.com/web-map-specification/objects/legendOptions/). How/Where can I set that property to ascending in a webmap hosted by AGOL? I've looked around in both the new and the old Viewer but haven't found the UI. Can anyone point me in the right direction? Appreciated, jtm
... View more
08-05-2021
01:51 PM
|
1
|
4
|
1400
|
POST
|
I am deploying an ArcGIS Server system to AWS using CloudFormation and part of the system includes an EC2 instance with ArcGIS Pro installed. My organization has an account assigned for that ArcGIS Pro installation to use. I can connect to the EC2 instance, log in to ArcPro and run a bunch of Python scripts that access arcpy functionality no problem. What I am wondering is whether it is possible to script that login (maybe through some REST requests to ArcGIS Online somehow?) because I'd like to add it directly to the CloudFormation process, rather than needing to remember to log in later when the process is complete (or, if I'm not around, not needing to tell someone else the password). Even better, is there a way I can do the equivalent of "Authorize ArcGIS Pro to work offline" to the EC2 host programmatically? I've looked around but haven't found any suggestions of others trying to the same. If you're aware of some posts or documentation to this effect, I would greatly appreciate it. Cheers, jtm
... View more
07-08-2021
01:47 PM
|
0
|
0
|
564
|
POST
|
Since I didn't get any information through this venue, I contacted ESRI Support. Essentially, the get() functionality in the submodules is geared towards working with Enterprise and AGOL. It does not not accommodate stand-alone ArcGIS Servers. In the end, the only way to "get" a service or a datastore is to use the arcgis.gis.server.Server submodule's list() functionality for the property in question and loop through the response to find the item of interest yourself (as shown in my example). Just providing closure in case anyone else who might be wasting time trying to do the same thing. Cheers, jtm
... View more
03-09-2021
10:21 AM
|
3
|
0
|
1776
|
POST
|
Hello, As I explore the ArcGIS API for Python functionality, there is something about working with the submodules that I can't seem to figure out and I'm hoping someone can provide info. I am working with a stand-alone site of two 10.8.1 ArcGIS Servers; i.e., no Portal. The documentation at https://developers.arcgis.com/python/api-reference/arcgis.gis.server.html details a submodule at https://developers.arcgis.com/python/api-reference/arcgis.gis.server.html#server which indicates the arcgis.gis.server.Server class "can be directly instantied when working with stand-alone (unfederated) ArcGIS Server sites". Seems like a good area for what I am trying to do, which is administering the ArcGIS Server site, not "using" it. I have been able to instantiate and work with that class to accomplish much of what I want to do, but the manner in which I need to do this seems excessive. Generally, I appear to have to utilize the lists that class provides access to and loop through them all constantly to find, say, the service (or the datastore or whatever) that I want to work with at any given time. However, other submodule documentation on that page seems to suggest more direct methods to get a service (or a datastore, etc.) are available. For example, the arcgis.gis.server.catalog.ServicesDirectory has a get(name, folder=None) method that "returns a single service in a folder". I have been unable to get that to work. Similarly, the arcgis.gis.server.DataStoreManager has a get(path) that "Retrieves the data item object at the given path... None if not found." Can't get that to work either. These are only two examples. I've tried other methods in other submodules with varying success and have come to the conclusion that there is just something I am fundamentally not understanding about how to work with those submodules. I should note, that I am not trying to utilize any that are specifially identified as ones that "should not be created by a user". So, I'm providing some example code and results (below) illustrating my two examples above, trying to use the ServicesDirectory and DataStoreManager, specifically, their get() methods. I've included prints() detailing some fairly specific items that are throwing me off too but, generally, it seems as though I am getting access to some of the modules' functionality but not all...? I don't know. If anyone can identify what it is that I am doing wrong here, I would greatly appreciate it. It's been a frustrating couple of days. Cheers, jtm Source code (results are below this block) 1. The DataStoreManager's list() returns the same as the Server.datastores.list(), suggesting it's created properly, but the DataStoreManager's get() doesn't work (using two different interpretations of what is supposed to be passed for its path parameter. 2. The ServicesDirectory.list() doesn't even work the same as the Server.services.list(), suggesting I haven't even created it properly; and, of course, its get() doesn't return anything either. I highlight what appears to be a documentation conflict for instantiating the ServicesDirectory which may be the cause of my trouble but, as noted, when I used url_admin (rather than url, as shown in my code) I couldn't get access to anything through that object and just got error messages. import arcgis.gis.server
my_cfg = {
"domain": "my_site.com",
"username": "admin_username",
"password": "admin_password",
"ds_folderShares_name": "datastore_name",
"folder_name": "folder_name",
"service_name": "service_name"
}
url = "https://" + my_cfg["domain"] + "/arcgis"
url_admin = url + "/admin"
url_token = url + "/tokens/generateToken"
my_server = arcgis.gis.server.Server(
url=url_admin,
token_url=url_token,
username=my_cfg["username"],
password=my_cfg["password"],
all_ssl=True
)
my_ds_manager = arcgis.gis.server.DataStoreManager(
url=my_server.url + "/data",
gis=my_server
)
print("\nServer.datastores.list()................................................")
datastores = my_server.datastores.list()
for datastore in datastores:
if datastore.properties["path"] == "/fileShares/" + my_cfg["ds_folderShares_name"]:
print("Found datastore")
break
print("\nDataStoreManager.list()...............................................")
datastores = my_ds_manager.list()
for datastore in datastores:
if datastore.properties["path"] == "/fileShares/" + my_cfg["ds_folderShares_name"]:
print("Found datastore")
break
print("\nDataStoreManager.get()................................................")
print("- Passing 'path': DataStoreManager.get('/fileShares/datastore_name')")
print(" The fact that the datastore I just made can't be found using this method is one thing;")
print(" but the documentation suggests this should return 'None if not found.'")
my_ds = my_ds_manager.get("/fileShares/" + my_cfg["ds_folderShares_name"])
print(my_ds)
print("- Passing the name of the datastore: DataStoreManager.get('datastore_name')")
print(" Again, the fact that the datastore can't be found using this method is one thing;")
print(" but this one at least responds with a 'None' when it can't find it.")
my_ds = my_ds_manager.get( my_cfg["ds_folderShares_name"])
print(my_ds)
print("\nInstantiating ServicesDirectory.......................................")
print("The documentation appears conflicting for this instantiation. It says the 'url' is ")
print("'The web address to the ArcGIS Server administration end point.' but the example shown is")
print("'https://mysite.com/arcgis'. The admin end point doesn't work, so I'm guessing this is")
print("just a documentation issue.")
my_services = arcgis.gis.server.catalog.ServicesDirectory(
url=url,
token_url=url_token,
username=my_cfg["username"],
password=my_cfg["password"],
all_ssl=True
)
service_path = my_cfg["folder_name"] + "/" + my_cfg["service_name"]
print("\nServer.services.list()................................................")
services = my_server.services.list(my_cfg["folder_name"] )
for service in services:
if service.properties["serviceName"] == my_cfg["service_name"]:
print("Found service")
break
print("\nServicesDirectory.list()..............................................")
services = my_services.list(my_cfg["folder_name"])
found = False
for service in services:
print("Found a service in", my_cfg["folder_name"])
found = True
break
if not found:
print(services)
print("\nServicesDirectory.get('service_name', 'folder_name')..................")
service = my_services.get(my_cfg["service_name"], my_cfg["folder_name"] )
print(service) Results: Server.datastores.list()................................................
Found datastore
DataStoreManager.list()...............................................
Found datastore
DataStoreManager.get()................................................
- Passing 'path': DataStoreManager.get('/fileShares/datastore_name')
The fact that the datastore I just made can't be found using this method is one thing;
but the documentation suggests this should return 'None if not found.'
status='error'
messages=['Item not found.']
code=500
- Passing the name of the datastore: DataStoreManager.get('datastore_name')
Again, the fact that the datastore can't be found using this method is one thing;
but this one at least responds with a 'None' when it can't find it.
None
Instantiating ServicesDirectory.......................................
The documentation appears conflicting for this instantiation. It says the 'url' is
'The web address to the ArcGIS Server administration end point.' but the example shown is
'https://mysite.com/arcgis'. The admin end point doesn't work, so I'm guessing this is
a documentation issue.
Server.services.list()................................................
Found service
ServicesDirectory.list()..............................................
[]
ServicesDirectory.get('service_name', 'folder_name')..................
None
... View more
03-05-2021
10:44 AM
|
1
|
1
|
1888
|
POST
|
First, "Thank you!" to both Joshua and Fred for taking the time to reply. I'm not able to mark both as a solution (although each are) so I'll choose Fred's because it gave me more information than I had already learned...particularly the link to https://developers.arcgis.com/python/guide/managing-your-gis-servers/ (which I hadn't found). Having said that, an overriding question that I have regarding using ArcGIS API for Python hasn't been answered, but after re-reading my posts I realize I may not have been clear. So, I'll accept Fred's reponse but will also start a new thread with an code example to illustrate what I'm fundamentally struggling to understand. Cheers, jtm
... View more
03-05-2021
09:23 AM
|
0
|
1
|
3364
|
POST
|
Hello, Similar to https://community.esri.com/t5/arcgis-api-for-python-questions/arcgis-api-for-python-how-to-manage-datastores/m-p/1033071/thread-id/5652, now I'm trying to figure out how to get a service object so I can delete() it. To recap, I am working with a stand-alone site consisting of two 10.8.1 ArcGIS Servers; i.e., no Portal. I have done this in the past for 10.4.1 using the REST API but am trying to do same with the newer "ArcGIS API for Python". I'm new to this, having trouble working through the documentation and not finding much in the way of examples. I have an arcgis.gis.server.Server object instantiated and can list(<folder_name>) on its services to receive a list of all the services that exist in the specified folder. However, the documentation suggests that using a ServicesDirectory (https://developers.arcgis.com/python/api-reference/arcgis.gis.server.html#arcgis.gis.server.catalog.ServicesDirectory) will allow me to get() a service directly. I have been unable to get this to work. I can't even get my ServicesDirectory's object to list(<folder_name>), using the same folder_name that works with the Server object's list. The list returned is always empty. Again...anything that might help is appreciated. Cheers, jtm
... View more
03-04-2021
02:54 PM
|
0
|
4
|
3439
|
POST
|
Okay, well, I got the something to work but still can't get anything returned with the DataStoreManager get(). I'll post what I've got in case there's anyone else having trouble with this stuff... import arcgis.gis.server
url = "https://<my_domain>/arcgis"
url_admin = url + "/admin"
url_token = url + "/tokens/generateToken"
my_server = arcgis.gis.server.Server(
url=url_admin,
token_url=url_token,
username="<my_admin_username>",
password="<my_admin_password>",
all_ssl=True
)
my_ds_manager = arcgis.gis.server.DataStoreManager(
url=my_server.url + "/data",
gis=my_server
)
my_str = "my_tst_ds"
my_ds_manager.add_folder(my_str, "<my_server_path>", "<my_client_path>")
datastores = my_ds_manager.list()
for datastore in datastores:
if datastore.properties["path"] == "/fileShares/" + my_str:
print("Deleting", datastore.properties["path"])
datastore.delete()
else:
print("Not deleting", datastore.properties["path"])
... View more
03-04-2021
01:22 PM
|
0
|
0
|
3391
|
POST
|
Okay, so I can get a arcgis.gis.server.DataStoreManager and the description of the get() suggests that I can receive a DataStore, but I'm not sure what "path" I'm supposed to put in. I've tried using the path returned in the search (that is, "/fileShares/<my_datastore_name>") but it returns an "Item not found" error. Still pluggin' away... And later... I'm able to add a folder using that DataStoreManager but, directly after I make it (and verify it has been added to the site through the ArcGIS Server Manager), I still can't "get" it. I've tried using just the name of the DataStore folder item I just created, as well as "/fileShares/<that_name>". Just passing the name, returns None and passing "/fileShares/<name>" returns the "Item not found" error noted above.
... View more
03-04-2021
12:43 PM
|
0
|
0
|
3400
|
POST
|
Hello, I am working with a stand-alone site consisting of two 10.8.1 ArcGIS Servers; i.e., no Portal. I am currently trying to script the addition/deletion (register/unregister, whatever the appropropriate terminology is here) of some folder fileShares. I have done this in the past for 10.4.1 using Python 2.7 with the REST API but am trying to do same with the newer "ArcGIS API for Python" available with the installation. I'm new to this, having trouble working through the documentation and not finding much in the way of examples. I have an arcgis.gis.server.Server object instantiated and I can search() on its datastores to find the "fileShares" folders but...then what? It's just a list of my datastore information as dictionaries, how do I use this to instantiate an arcgis.gis.server.Datastore so I can update() it (if that's what I want to do; same would be true for delete())? The documentation (https://developers.arcgis.com/python/api-reference/arcgis.gis.server.html#arcgis.gis.server.Datastore) indicates the following parameters are necessary to instantiate a Database object: datastore, path, datadict=None, **kwargs. I assume the path is the "path" in the dictionary returned by the search and the datadict is the "info" in the dictionary (with the updates that I will ultimately want applied), but what is the first datastore parameter referring to? More importantly, how does the update() know what Server this Datasource is supposed to be found on? I don't get it... Any explanation or direction re: what I'm missing in this would be appreciated. I'm sure it's something pretty fundamental. Cheers, jtm
... View more
03-04-2021
12:18 PM
|
0
|
2
|
3436
|
Title | Kudos | Posted |
---|---|---|
1 | 02-17-2023 10:23 AM | |
1 | 08-06-2021 02:14 PM | |
1 | 08-06-2021 11:23 AM | |
1 | 08-05-2021 01:51 PM | |
1 | 06-15-2015 02:32 PM |
Online Status |
Offline
|
Date Last Visited |
04-29-2024
11:39 AM
|