3

This is a bit difficult for anyone here to test as our ArcGIS Server 10.2 instance is behind a firewall. I'll try to present all the necessary information, but feel free to ask for more and I'll adjust the question accordingly.

I have a Geoprocessing Service hosted on ArcGIS Server. The service is a very simple Python script (below) that takes in a string of Hydrologic Unit Codes (in this case sub-watersheds [HUC8 level]). The script takes this string, splits it and compares against a table of species occurrence by watershed. This data is compiled into a Python dictionary and returned as JSON with the json module.

I'm accessing this service via an ajax request from a web mapping app, but for simplicity's sake I'll leave the JavaScript side out unless it's really necessary.

Python

import arcpy, json

# files
hucs = r'S:\ES\ES 2007 Efiles\PROP-500 Maps and Photography\PROP-540 Geographical Information System (GIS) Data files\MegaPetition.gdb\HUCs'
species = r'S:\ES\ES 2007 Efiles\PROP-500 Maps and Photography\PROP-540 Geographical Information System (GIS) Data files\MegaPetition.gdb\CandidatesHUC'
data = {}
Watersheds = arcpy.GetParameterAsText(0)
Watersheds = Watersheds.split(",")

cursor = arcpy.SearchCursor(hucs)

for row in cursor:
    for watershed in Watersheds:
        if row.HUC_CODE == watershed:
            currentWatershed = {}
            speciesList = []
            arcpy.AddMessage("Working on " + row.HUC_NAME + "...")

            whereClause = "HUC8_CD = '" + watershed + "'"
            speciesCursor = arcpy.SearchCursor(species, whereClause)
            arcpy.AddMessage("    Contains " + str(row.NumPetitionedSp) + " At-Risk Species.")

            for animal in speciesCursor:
                speciesList.append(animal.GCOMNAME)
            currentWatershed = {'attributes': [watershed, row.NumPetitionedSp],
                                'species': speciesList}
            data[row.HUC_NAME] = currentWatershed

print json.dumps(data)
del row, cursor

Perhaps I don't understand how the script gets the string of watersheds from the request so that I can use it in my script. With a Script Tool I use arcpy.GetParameterAsText(0), but that doesn't seem to apply here.

I've tried to execute this script through the ArcGIS Server GP Service Page, but I still get an empty result:

RESTful Request Generates the following URL: http://server-address/arcgis/rest/services/NatureServe/AtRiskGPService/GPServer/NatureServe%20At%20Risk%20GP%20Service/execute?Watersheds=06040003%2C06040002%2C06030003%2C06030002%2C06030005&env%3AoutSR=&env%3AprocessSR=&returnZ=false&returnM=false&f=pjson

With the following Response:

Empty Response

Update!

I changed the messaging option for the service from Error to Info, so I can see that the script is taking in the watershed parameter and processing it. It looks like it's just not sending the response back as part of the Result object.

The Result object is created by running a GP tool (ex. result = arcpy.GetCount_management(in_table)). Is there any way I can add my own data to the Result object if I'm not actually running any GP tools? If not I guess I need to send the JSON through a message instead.

1 Answer 1

2

You have no outputs to your tool. You want to return this:

print json.dumps(data)

That wont return anything when run as a tool: neither to the results messages, nor as an output. You need to add a new, derived string parameter to your tool properties then this code at the end:

arcpy.SetParameterAsText(1, json.dumps(data))

Alternatively you could just:

arcpy.AddMessage(json.dumps(data))

But then you'd have to have your webapp loop through the output messages and parse.

1
  • Thanks! I was just in the process of updating my question, and you nailed it.
    – Roy
    Commented Jul 29, 2014 at 14:14

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.