It's all a proof of concept for myself and my learning but I have definitely hit a brick wall here!
Here's what I've done and can get to work.
I have written a Python script that:
- Sets its workspace to and SDE instance.
- Checks out a Spatial licencse.
- Queries raster layers.
- Takes a raster layer based on some string match - and then adds 100 to each pixel to create an output raster. Raster Algebra stuff....
- The output raster is saved in the scratch workspace as "wibble".
Next....
I can Share As A Geoprocessing Service and it does all the same stuff and saves an output raster to the ArcGIS Servers output directory with a Scratch FGDB there and a raster called "wibble".
Next...
I want to run my Geoprocessing task from the browser using JS API and that works too, and it puts the output raster in a jobs folder - looking something like this:
d:\arcgisserver\directories\arcgisjobs\testraster_gpserver\jccffbe1165404cf4b930b971c86be46a\scratch\scratch.gdb\wibble
My code for the geoprocessor looks like:
var gp = new Geoprocessor("http://ls8-webd-w8v:6080/arcgis/rest/services/TestRaster/GPServer/TestRaster");
var params = { "inputMessage": dom.byId("testMessage").value };
gp.submitJob(params, completeCallback, statusCallback);
So how do I now hook up my JavaScript code to get hold of this "wibble" raster and display it on a map in the browser. Now, I know you are not able to directly draw out rasters to a map service, it has to be an image, so you use getResultImageLayer from the geoprocessing object, but it still doesn't display, I think the code is wrong:
function completeCallback(jobInfo) {
imageParams = new ImageParameters();
imageParams.imageSpatialReference = map.spatialReference;
gp.getResultImageLayer(jobInfo.jobId, "wibble", imageParams, function (gpLayer) {
gpLayer.setOpacity(0.5);
map.addLayer(gpLayer);
});
}
I'm not even doing anything with ImageParameters - as I'm not sure what to do. Then I tried a different way, still nothing.
function completeCallback(jobInfo) {
mapserviceurl = "http://ls8-webd-w8v:6080/arcgis/rest/services/TestRaster/GPServer/TestRaster/jobs";
var mapurl = mapserviceurl + "/" + jobinfo.jobId;
var outputLayer = new ArcGISDynamicMapServiceLayer(mapurl, {
"id": "TestRaster",
"opacity": 0.7
});
map.addLayer(outputLayer);
};
Oh, by the way - here is the python that makes the geoprocessing script - it's nothing major!
import arcpy, os, sys
from arcpy.sa import *
inputSde = r"Database Connections\ls8-dbd-w8v-2_geodb_GEOLOGY.sde"
arcpy.env.overwriteOutput = True
inputString = arcpy.GetParameterAsText(0)
def main():
try:
if arcpy.CheckExtension("Spatial") == "Available":
arcpy.CheckOutExtension("Spatial")
else:
raise LicenseError
arcpy.env.workspace = inputSde
outRas = None
rastersStrings = arcpy.ListRasters("*", "All");
for strRaster in rastersStrings:
if strRaster == "GEOLOGY.MAAS_BATHYMETRY":
path = os.path.join(inputSde, strRaster)
raster = Raster(path)
outRas = raster + 100
if outRas is not None:
tempFile = os.path.join(arcpy.env.scratchGDB, "wibble")
outRas.save(tempFile)
else:
arcpy.AddWarning("Failed to make raster")
except LicenseError:
print "Spatial license is unavailable"
except:
arcpy.AddWarning("Error: {0}".format(sys.exc_info()[0]))
finally:
arcpy.CheckInExtension("Spatial")
if __name__ == '__main__':
main()
I get the following Javascript error message for using the ImageParameters code (as above) - saying its "400 a bad request" - it looks like its looking in a folder "results" but I don't have that on the server - could it be to do with how I am saving the raster in the Python script?
http://ls8-webd-w8v:6080/arcgis/rest/services/TestRaster/GPServer/TestRaster/jobs/j7613d1e015a74976986c6f7447ea5ba5/results/wibble?dpi=96&transparent=true&format=png8&imageSR=4326&f=image&bbox=%7B%22xmin%22%3A-220.57570097228788%2C%22ymin%22%3A-48.21623734392513%2C%22xmax%22%3A220.57570130793587%2C%22ymax%22%3A135.59684693950146%2C%22spatialReference%22%3A%7B%22wkid%22%3A4326%2C%22latestWkid%22%3A4326%7D%7D&bboxSR=4326&size=960%2C400