Hi All,
Recently i develop a gis app with Navtive Maps SDK 200.1, i want to apply a raster function(Raster_calculator_function) on a raster file, but it doesn't work, so i wander whether i can use the function:"Con()" in the expression statement as following:
string theJSON_String =
@"{
""raster_function_arguments"":
{
""expression"":{ ""string"":""Con(r1>r2,0,1)"",""name"":""expression"",""type"":""Raster_function_variable""},
""raster_names"":{ ""name"":""raster_names"",""type"":""Raster_function_variable""},
""raster_names"":{ ""name"":""raster_names"",""string_array"":[""r1"",""r2""],""type"":""Raster_function_variable""},
""r1"":{ ""name"":""r1"",""is_raster"":true,""type"":""Raster_function_variable""},
""r2"":{ ""name"":""r2"",""is_raster"":true,""type"":""Raster_function_variable""},
""type"":""Raster_function_arguments""
},
""raster_function"":{ ""type"":""Raster_calculator_function""},
""type"":""Raster_function_template""
}";
// Create a raster function from the JSON string using the static/Shared method called: RasterFunction.FromJson(json as String)
RasterFunction myRasterFunction = RasterFunction.FromJson(theJSON_String);
Esri.ArcGISRuntime.Rasters.RasterFunction(path as String)
// Get the raster function arguments
RasterFunctionArguments myRasterFunctionArguments = myRasterFunction.Arguments;
// Get the list of names from the raster function arguments
IReadOnlyList<string> myRasterNames = myRasterFunctionArguments.GetRasterNames();
// Apply the first raster name and image service raster in the raster function arguments
myRasterFunctionArguments.SetRaster(myRasterNames[0], raster1);
myRasterFunctionArguments.SetRaster(myRasterNames[1], raster2);
var layer = new RasterLayer(new Raster(myRasterFunction));
@AlexanderZhang thank you for your question. It seems like you've viewed our RasterLayerRasterFunction WPF sample. Since your code follows that logic, this should work! The comparison expression makes sense in your JSON. But you said it isn't working, so a few things to consider:
Let me check to see that the Con() expression works with Raster_calculator per your request. Sorry for the correction, hoping it's an easy fix!
@williambohrmann3 thank you for your help, following your suggestion, I recoded my program. I fixed the compilation error you pointed out, then i modified the JSON string as following:
string theJSON_String =
@"{
""raster_function_arguments"":
{
""expression"":{ ""string"":""r1+r2"",""name"":""expression"",""type"":""Raster_function_variable""},
""raster_names"":{ ""name"":""raster_names"",""string_array"":[""r1"",""r2""],""type"":""Raster_function_variable""},
""r1"":{ ""name"":""r1"",""is_raster"":true,""type"":""Raster_function_variable""},
""r2"":{ ""name"":""r2"",""is_raster"":true,""type"":""Raster_function_variable""},
""type"":""Raster_function_arguments""
},
""raster_function"":{ ""type"":""Raster_calculator_function""},
""type"":""Raster_function_template""
}";
It works well! However, When I modify the JSON string to the following case, it doesn't work anymore(The app automatically exited without any error message.):
string theJSON_String =
@"{
""raster_function_arguments"":
{
""expression"":{ ""string"":""Con(r1>r2,0,1)"",""name"":""expression"",""type"":""Raster_function_variable""},
""raster_names"":{ ""name"":""raster_names"",""string_array"":[""r1"",""r2""],""type"":""Raster_function_variable""},
""r1"":{ ""name"":""r1"",""is_raster"":true,""type"":""Raster_function_variable""},
""r2"":{ ""name"":""r2"",""is_raster"":true,""type"":""Raster_function_variable""},
""type"":""Raster_function_arguments""
},
""raster_function"":{ ""type"":""Raster_calculator_function""},
""type"":""Raster_function_template""
}";
The raster1 and raster2 are offline rasters with a single band. So, i would like to know if the raster function(Raster_calculator_function) supports the following expression: "Con(r1>r2,0,1)".
Thanks.
Hey @AlexanderZhang , your original JSON was correct. My mistake. Glad you fixed the compilation error. Waiting to hear from our raster experts on if Con() expression will work here.
Your Con() expression works in ArcGIS Pro. However, with your app, I am also getting same behavior: silent failure. I checked the output in Visual Studio: The program has exited with code 3221225477 (0xc0000005) 'Access violation'. When debugging, I notice the RasterLayer.Raster.Path was empty. However, I changed your expression to "r1 > r2" and the code compiled. Could you try changing the expression and let me know if that resolves your issue?
If that doesn't work, I'd like to know... Are you working with a raster service or a local file? If a local file, what file extension? And did you ever see the same access violation in output?
Thanks for your information, i'm afraid it can't resolves my issue by changing the expression, because I will use Con expression like "Con(r1>2000,r1,r2)" later!
In my app, the path of the r1 and r2 point to two local raster files(.tif).
I wonder if the issue is the Con() function isn't syntactically correct. I think r1 and r2 need to be surrounded by quotations, since they're names of raster function variables. This is how the raster calculator works in ArcGIS Pro. Can you change your expression to: ""Con(\""r1\"">\""r2\"",0,1)""?
Hi,@williambohrmann3, I've tried your idea but it still doesn't work,Thanks for your advice.
Hey @AlexanderZhang
If you're able to send me a reproducer project with your two raster files, I'd be happy to take a look.
Thank you @williambohrmann3, the raster files are too big to send you, i'm currently trying another solution to implement the function: create a geoprocessing package (.gpkx) in ArcGIS Pro, and then execute the geoprocessing package with ArcGIS Runtime Local Server.
Unfortunately, I encountered another problem , would you like give me some advice?