[GIS] ArcGIS JavaScript API filter raster dataset

arcgis-javascript-apiarcgis-serverarcmap

I have around 1000 rasters (b&w tiffs) and most of them overlay each other. At this moment, I'm holding them in mosaic dataset and I want them to be displayed in my javascript webapp. I am able to load it as Dynamic or Image service layer and it loads all the rasters at once. In screenshot below, mosaic's attribute table has field "Name" in which names of all the rasters are held (all names are unique to only one raster). In my webapp, I want to dynamically show only one raster by specifying its name.

Part of mosaic: http://i.imgur.com/RB2zl52.jpg

In arcmap I can use layer's definition query to select only particular raster (screenshot below).

Filtered by definition query: http://i.imgur.com/XDkFl8y.jpg

What would be the appropriate approach to have dataset filtered in webapp?

Best Answer

The best way is to publish your Mosaic Dataset as an Image Service and add it to your JavaScript API web map as an ArcGISImageServiceLayer.

If you look at the ArcGIS Server REST API, an Image Service has an operation called exportImage, which takes several parameters; among them is mosaicRule. mosaicRule is a set of options which includes a WHERE clause. This is supported in the ArcGIS JavaScript API by calling setMosaicRule, e.g. imageServiceLayer.setMosaicRule(mosaicRule), where imageServiceLayer is an instance of ArcGISImageServiceLayer and mosaicRule is an instance of the MosaicRule class.

So, if you want to select your image based on its name field, you would do something like this (as of JSAPI v3.5):

var mosaicRule = new esri.layers.MosaicRule({
    "method": esri.layers.MosaicRule.METHOD_CENTER,
    "ascending": true,
    "operation": esri.layers.MosaicRule.OPERATION_FIRST,
    "where": "name='" + rasterName + "'"
});
imageServiceLayer.setMosaicRule(mosaicRule);

...where rasterName is the name of the individual raster you'd like to display. You'll want to do this each time you want to select a new raster (you may also have to refresh the layer manually; not sure).

Related Question