import type Extent from "../../geometry/Extent.js";
import type SpatialReference from "../../geometry/SpatialReference.js";
import type Field from "../support/Field.js";
import type FieldsIndex from "../support/FieldsIndex.js";
import type MosaicRule from "../support/MosaicRule.js";
import type MultidimensionalSubset from "../support/MultidimensionalSubset.js";
import type RasterFunction from "../support/RasterFunction.js";
import type RasterInfo from "../support/RasterInfo.js";
import type FeatureSet from "../../rest/support/FeatureSet.js";
import type FindImagesParameters from "../../rest/support/FindImagesParameters.js";
import type FindImagesResult from "../../rest/support/FindImagesResult.js";
import type ImageAngleParameters from "../../rest/support/ImageAngleParameters.js";
import type ImageAngleResult from "../../rest/support/ImageAngleResult.js";
import type ImageAreaParameters from "../../rest/support/ImageAreaParameters.js";
import type ImageAreaResult from "../../rest/support/ImageAreaResult.js";
import type ImageBoundaryParameters from "../../rest/support/ImageBoundaryParameters.js";
import type ImageBoundaryResult from "../../rest/support/ImageBoundaryResult.js";
import type ImageDistanceParameters from "../../rest/support/ImageDistanceParameters.js";
import type ImageDistanceResult from "../../rest/support/ImageDistanceResult.js";
import type ImageGPSInfoResult from "../../rest/support/ImageGPSInfoResult.js";
import type ImageHeightParameters from "../../rest/support/ImageHeightParameters.js";
import type ImageHeightResult from "../../rest/support/ImageHeightResult.js";
import type ImageHistogramParameters from "../../rest/support/ImageHistogramParameters.js";
import type ImageIdentifyParameters from "../../rest/support/ImageIdentifyParameters.js";
import type ImageIdentifyResult from "../../rest/support/ImageIdentifyResult.js";
import type ImagePixelLocationParameters from "../../rest/support/ImagePixelLocationParameters.js";
import type ImagePixelLocationResult from "../../rest/support/ImagePixelLocationResult.js";
import type ImagePointParameters from "../../rest/support/ImagePointParameters.js";
import type ImagePointResult from "../../rest/support/ImagePointResult.js";
import type ImageSampleParameters from "../../rest/support/ImageSampleParameters.js";
import type ImageSampleResult from "../../rest/support/ImageSampleResult.js";
import type ImageToMapMultirayParameters from "../../rest/support/ImageToMapMultirayParameters.js";
import type ImageToMapParameters from "../../rest/support/ImageToMapParameters.js";
import type ImageUrlParameters from "../../rest/support/ImageUrlParameters.js";
import type ImageUrlResult from "../../rest/support/ImageUrlResult.js";
import type ImageVolumeParameters from "../../rest/support/ImageVolumeParameters.js";
import type ImageVolumeResult from "../../rest/support/ImageVolumeResult.js";
import type MapToImageParameters from "../../rest/support/MapToImageParameters.js";
import type MeasureAreaFromImageResult from "../../rest/support/MeasureAreaFromImageResult.js";
import type MeasureFromImageParameters from "../../rest/support/MeasureFromImageParameters.js";
import type MeasureLengthFromImageResult from "../../rest/support/MeasureLengthFromImageResult.js";
import type Query from "../../rest/support/Query.js";
import type { AbortOptions } from "../../core/promiseUtils.js";
import type { GeometryUnion } from "../../geometry/types.js";
import type { OperationCapabilities, QueryCapabilities } from "../types.js";
import type { DynamicFetchRasterOptions, RasterInterpolation, RasterNoDataInterpretation, RasterPixelType, RasterFormats, PixelData, RasterMultidimensionalInfo, ServiceRasterFunctionInfo } from "../raster/types.js";
import type { RasterFunctionProperties } from "../support/RasterFunction.js";
import type { RasterRendererUnion } from "../../renderers/support/raster/types.js";
import type { RequestOptions } from "../../request/types.js";
import type { ImageServiceStatisticsHistogramsResult, ImageServiceHistogramsResult } from "../../rest/imageService.js";
import type { FindImagesParametersProperties } from "../../rest/support/FindImagesParameters.js";
import type { ImageAngleParametersProperties } from "../../rest/support/ImageAngleParameters.js";
import type { ImageAreaParametersProperties } from "../../rest/support/ImageAreaParameters.js";
import type { ImageBoundaryParametersProperties } from "../../rest/support/ImageBoundaryParameters.js";
import type { ImageDistanceParametersProperties } from "../../rest/support/ImageDistanceParameters.js";
import type { ImageGPSInfoParametersProperties } from "../../rest/support/ImageGPSInfoParameters.js";
import type { ImageHeightParametersProperties } from "../../rest/support/ImageHeightParameters.js";
import type { ImageHistogramParametersProperties } from "../../rest/support/ImageHistogramParameters.js";
import type { ImageIdentifyParametersProperties } from "../../rest/support/ImageIdentifyParameters.js";
import type { ImagePixelLocationParametersProperties } from "../../rest/support/ImagePixelLocationParameters.js";
import type { ImagePointParametersProperties } from "../../rest/support/ImagePointParameters.js";
import type { ImageSampleParametersProperties } from "../../rest/support/ImageSampleParameters.js";
import type { ImageToMapMultirayParametersProperties } from "../../rest/support/ImageToMapMultirayParameters.js";
import type { ImageUrlParametersProperties } from "../../rest/support/ImageUrlParameters.js";
import type { ImageVolumeParametersProperties } from "../../rest/support/ImageVolumeParameters.js";
import type { MapToImageParametersProperties } from "../../rest/support/MapToImageParameters.js";
import type { QueryProperties } from "../../rest/support/Query.js";
import type { MosaicRuleProperties } from "../support/MosaicRule.js";
import type { MultidimensionalSubsetProperties } from "../support/MultidimensionalSubset.js";
import type { VectorFieldRendererProperties } from "../../renderers/VectorFieldRenderer.js";
import type { UniqueValueRendererProperties } from "../../renderers/UniqueValueRenderer.js";
import type { RasterStretchRendererProperties } from "../../renderers/RasterStretchRenderer.js";
import type { RasterShadedReliefRendererProperties } from "../../renderers/RasterShadedReliefRenderer.js";
import type { RasterColormapRendererProperties } from "../../renderers/RasterColormapRenderer.js";
import type { FlowRendererProperties } from "../../renderers/FlowRenderer.js";
import type { ClassBreaksRendererProperties } from "../../renderers/ClassBreaksRenderer.js";
import type { RasterInfoProperties } from "../support/RasterInfo.js";

export interface ArcGISImageServiceProperties extends Partial<Pick<ArcGISImageService, "bandIds" | "compressionQuality" | "compressionTolerance" | "copyright" | "definitionExpression" | "format" | "imageMaxHeight" | "imageMaxWidth" | "interpolation" | "noData" | "noDataInterpretation" | "pixelFilter" | "pixelType" | "sourceJSON" | "url">> {
  /** Defines how overlapping images should be mosaicked. */
  mosaicRule?: MosaicRuleProperties;
  /**
   * Represents a multidimensional subset of raster data. This includes subsets of both variables and dimensions. When the `multidimensionalSubset` is defined on
   * a layer, the [MosaicRule.multidimensionalDefinition](https://developers.arcgis.com/javascript/latest/references/core/layers/support/MosaicRule/#multidimensionalDefinition) must be within the defined
   * multidimensionalSubset, otherwise nothing will be displayed.
   *
   * @since 4.25
   * @see [ImageryLayer - working with multidimensional raster data](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#multidimensionaldata)
   * @see [Sample - Work with pixelFilter in an ImageryLayer](https://developers.arcgis.com/javascript/latest/sample-code/layers-imagery-pixelvalues/)
   * @example
   * // set a multi dimensional subset on the imagery layer
   * // so that users can only access sea temperature data in the atlantic ocean
   * // between April 7 - 18, 2014 and at depths between -500 - 0.
   * const multidimensionalSubset = new MultidimensionalSubset({
   *   // area over atlantic ocean
   *   areaOfInterest: new Extent({
   *     type: "extent",
   *     xmax: 3041935.5384527617,
   *     xmin: -10166382.94922227,
   *     ymax: 12406741.274438996,
   *     ymin: -5908793.695137047,
   *     spatialReference: {
   *       wkid: 102100
   *     }
   *   }),
   *   subsetDefinitions: [
   *     {
   *       variableName: "water_temp",
   *       dimensionName: "StdTime",
   *       values: [1396828800000, 1397779200000], // 4/7 - 4/18
   *       isSlice: false
   *     },
   *     {
   *       variableName: "water_temp",
   *       dimensionName: "StdZ",
   *       values: [-500, 0],
   *       isSlice: false
   *     }
   *   ],
   * });
   * layer.multidimensionalSubset = multidimensionalSubset;
   */
  multidimensionalSubset?: MultidimensionalSubsetProperties | null;
  /**
   * Specifies the rule for how the requested image should be processed. When rasterFunction applied, the server returns an updated service
   * information that reflects a custom processing as defined by the raster function.
   *
   * Use helper functions from the [rasterFunctionUtils](https://developers.arcgis.com/javascript/latest/references/core/layers/support/rasterFunctionUtils/) module when creating raster functions that apply to ImageryLayers.
   *
   * @since 4.27
   * @see [Raster functions - ArcGIS REST API](https://developers.arcgis.com/documentation/common-data-types/raster-function-objects.htm)
   * @example
   * // apply NDVI and colormap raster function to an imagery layer
   * // use rasterFunctionUtils convenience methods to create raster functions
   * const ndvi = rasterFunctionUtils.bandArithmeticNDVI({
   *   nirBandId: 4,
   *   redBandId: 3,
   *   scientificOutput: false
   * });
   *
   *  const colormap = rasterFunctionUtils.colormap({
   *   colorRampName: "NDVI3",
   *   raster: ndvi
   * });
   * layer.rasterFunction = colormap;
   * @example
   * const stretchFunction = new RasterFunction({
   * functionName: "Stretch",
   *   functionArguments: {
   *     StretchType: 5, // (0 = None, 3 = StandardDeviation, 4 = Histogram Equalization, 5 = MinMax, 6 = PercentClip, 9 = Sigmoid)
   *     Min: 0,
   *     Max: 255,
   *     Raster: "$$" // $$(default) refers to the entire image service, $2 refers to the second image of the image service
   *   },
   *   outputPixelType: "u8"
   * });
   *
   * const colorFunction = new RasterFunction({
   *   functionName: "Colormap",
   *   functionArguments: {
   *     ColorrampName: "Temperature", // other examples: "Slope", "Surface", "Blue Bright"....
   *     Raster: stretchFunction // chaining multiple raster functions
   *   }
   * });
   *
   * const imageryLayer = new ImageryLayer({
   *   url:
   *     "https://sampleserver6.arcgisonline.com/arcgis/rest/services/ScientificData/SeaTemperature/ImageServer"
   * });
   *
   * imageryLayer.rasterFunction = colorFunction;
   */
  rasterFunction?: RasterFunctionProperties | null;
  /**
   * Returns raster function information for the image services,
   * including the name, description, help, function type, and a thumbnail of pre-configured raster function templates.
   *
   * @since 4.22
   */
  rasterFunctionInfos?: ServiceRasterFunctionInfo[] | null;
  /**
   * The renderer assigned to the layer. The renderer defines how to visualize pixels in the imagery layer.
   * Depending on the renderer type, the pixels may be [stretched](https://developers.arcgis.com/javascript/latest/references/core/renderers/RasterStretchRenderer/)
   * across the color ramp, [classified](https://developers.arcgis.com/javascript/latest/references/core/renderers/ClassBreaksRenderer/),
   * have [different symbols](https://developers.arcgis.com/javascript/latest/references/core/renderers/UniqueValueRenderer/) based on values, or show [shaded reliefs](https://developers.arcgis.com/javascript/latest/references/core/renderers/RasterShadedReliefRenderer/).
   *
   * If both renderer and [pixelFilter](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#pixelFilter) is applied to an ImageryLayer then pixelFilter will override
   * the renderer.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > Currently, the [VectorFieldRenderer](https://developers.arcgis.com/javascript/latest/references/core/renderers/VectorFieldRenderer/) is not supported in 3D [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
   *
   * @since 4.11
   * @see [Sample - Intro to ImageryTileLayer](https://developers.arcgis.com/javascript/latest/sample-code/layers-imagerytilelayer/)
   * @see [Sample - ImageryTileLayer - shaded relief renderer](https://developers.arcgis.com/javascript/latest/sample-code/layers-imagery-renderer/)
   */
  renderer?: ((ClassBreaksRendererProperties & { type: "class-breaks" }) | (FlowRendererProperties & { type: "flow" }) | (RasterColormapRendererProperties & { type: "raster-colormap" }) | (RasterShadedReliefRendererProperties & { type: "raster-shaded-relief" }) | (RasterStretchRendererProperties & { type: "raster-stretch" }) | (UniqueValueRendererProperties & { type: "unique-value" }) | (VectorFieldRendererProperties & { type: "vector-field" })) | null;
  /**
   * Source raster information of the image service. The layer must be
   * [ImageryLayer.loaded](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#loaded) before serviceRasterInfo can be accessed.
   *
   * @since 4.12
   * @see [Raster info](https://developers.arcgis.com/rest/services-reference/raster-info.htm)
   */
  serviceRasterInfo?: RasterInfoProperties;
}

export type SourceType = "mosaic-dataset" | "raster-dataset";

/** ArcGISImageService is a mixin that adds a set of properties and methods for managing image services for [ImageryLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/). */
export abstract class ArcGISImageService {
  constructor(...args: any[]);
  /**
   * Defines a band combination using 0-based band indexes.
   * Set the `bandIds` to the desired band when applying a [RasterStretchRenderer](https://developers.arcgis.com/javascript/latest/references/core/renderers/RasterStretchRenderer/) to the layer
   * to get the correct result.
   *
   * @since 4.19
   */
  accessor bandIds: number[] | null | undefined;
  /**
   * Describes the layer's supported capabilities.
   *
   * @since 4.16
   */
  get capabilities(): ImageryLayerCapabilities;
  /**
   * The compression quality value. Controls how much loss the image will be subjected to by the compression algorithm.
   * Valid value ranges of compression quality are from 0 to 100. Only valid when using `jpg` or `jpgpng` [image format](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#format).
   */
  accessor compressionQuality: number | null | undefined;
  /**
   * Controls the tolerance of the lerc compression algorithm.
   * The tolerance defines the maximum possible error of pixel values in the compressed image. It's a double value.
   *
   * @default 0.01
   */
  accessor compressionTolerance: number;
  /** The copyright text as defined by the service. */
  accessor copyright: string | null | undefined;
  /**
   * Default mosaic rule of the image service.
   *
   * @since 4.28
   */
  get defaultMosaicRule(): MosaicRule | null | undefined;
  /**
   * The SQL where clause used to filter rasters. Only the rasters that satisfy the definition
   * expression are displayed in the [View](https://developers.arcgis.com/javascript/latest/references/core/views/View/). This property overrides
   * the [mosaicRule's](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#mosaicRule) [MosaicRule.where](https://developers.arcgis.com/javascript/latest/references/core/layers/support/MosaicRule/#where)
   * property if both properties are set on the layer.
   */
  accessor definitionExpression: string | null | undefined;
  /**
   * An array of fields in the layer. Each field represents an attribute
   * that may contain a value for each raster in the layer.
   *
   * @see [Mosaic dataset attribute table](https://pro.arcgis.com/en/pro-app/latest/help/data/imagery/mosaic-dataset-attribute-table-pro-.htm)
   */
  get fields(): Field[];
  /**
   * A convenient property that can be used to make case-insensitive lookups for a [field](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#fields) by name.
   * This property is only available after the ImageryLayer has been [loaded](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#loadStatus).
   *
   * @since 4.21
   * @see [ImageryLayer.load()](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#load)
   * @see [fields](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#fields)
   * @example
   * // lookup a field by name, name is case-insensitive
   * const fieldsIndex = layer.fieldsIndex.get("OBjecTID");
   *
   * // if there's a field by that name, print it to the console
   * if (fieldsIndex) {
   *   console.log("fieldsIndex: ", fieldsIndex);
   * }
   */
  get fieldsIndex(): FieldsIndex<Field> | null | undefined;
  /** The format of the exported image. */
  accessor format: RasterFormats;
  /**
   * Indicates if the layer has [multidimensionalInfo](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#multidimensionalInfo).
   *
   * @default false
   */
  get hasMultidimensions(): boolean;
  /**
   * Indicates the maximum height of the image exported by the service.
   *
   * @default 4100
   * @since 4.4
   */
  accessor imageMaxHeight: number;
  /**
   * Indicates the maximum width of the image exported by the service.
   *
   * @default 4100
   * @since 4.4
   */
  accessor imageMaxWidth: number;
  /**
   * Defines how to interpolate pixel values.
   *
   * @since 4.12
   */
  accessor interpolation: RasterInterpolation;
  /** Defines how overlapping images should be mosaicked. */
  get mosaicRule(): MosaicRule;
  set mosaicRule(value: MosaicRuleProperties);
  /**
   * The multidimensional information associated with the layer if the layer's [hasMultidimensions](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#hasMultidimensions) property
   * is `true`. If defined, multidimensional information contains data in multiple dimensions like time and depth/height, and contains multiple variables.
   * Defining slices of particular dimensions in the layer is handled with the
   * [MosaicRule.multidimensionalDefinition](https://developers.arcgis.com/javascript/latest/references/core/layers/support/MosaicRule/#multidimensionalDefinition) property of the [mosaicRule](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#mosaicRule).
   *
   * @see [ImageryLayer - working with multidimensional raster data](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#multidimensionaldata)
   * @see [Sample - Work with pixelFilter in an ImageryLayer](https://developers.arcgis.com/javascript/latest/sample-code/layers-imagery-pixelvalues/)
   */
  get multidimensionalInfo(): RasterMultidimensionalInfo | null | undefined;
  /**
   * Represents a multidimensional subset of raster data. This includes subsets of both variables and dimensions. When the `multidimensionalSubset` is defined on
   * a layer, the [MosaicRule.multidimensionalDefinition](https://developers.arcgis.com/javascript/latest/references/core/layers/support/MosaicRule/#multidimensionalDefinition) must be within the defined
   * multidimensionalSubset, otherwise nothing will be displayed.
   *
   * @since 4.25
   * @see [ImageryLayer - working with multidimensional raster data](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#multidimensionaldata)
   * @see [Sample - Work with pixelFilter in an ImageryLayer](https://developers.arcgis.com/javascript/latest/sample-code/layers-imagery-pixelvalues/)
   * @example
   * // set a multi dimensional subset on the imagery layer
   * // so that users can only access sea temperature data in the atlantic ocean
   * // between April 7 - 18, 2014 and at depths between -500 - 0.
   * const multidimensionalSubset = new MultidimensionalSubset({
   *   // area over atlantic ocean
   *   areaOfInterest: new Extent({
   *     type: "extent",
   *     xmax: 3041935.5384527617,
   *     xmin: -10166382.94922227,
   *     ymax: 12406741.274438996,
   *     ymin: -5908793.695137047,
   *     spatialReference: {
   *       wkid: 102100
   *     }
   *   }),
   *   subsetDefinitions: [
   *     {
   *       variableName: "water_temp",
   *       dimensionName: "StdTime",
   *       values: [1396828800000, 1397779200000], // 4/7 - 4/18
   *       isSlice: false
   *     },
   *     {
   *       variableName: "water_temp",
   *       dimensionName: "StdZ",
   *       values: [-500, 0],
   *       isSlice: false
   *     }
   *   ],
   * });
   * layer.multidimensionalSubset = multidimensionalSubset;
   */
  get multidimensionalSubset(): MultidimensionalSubset | null | undefined;
  set multidimensionalSubset(value: MultidimensionalSubsetProperties | null | undefined);
  /**
   * The pixel value representing no available information.
   * Can be a number (same value for all bands) or array (specific value for each band).
   *
   * @since 4.12
   */
  accessor noData: number | number[] | null | undefined;
  /**
   * Interpretation of the [noData](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#noData) setting.
   *
   * Value | Description |
   * ----- | ----------- |
   * any | Pixel is transparent if any band matches `noData` value.
   * all | Pixel is transparent only if all bands match `noData` value.
   *
   * @since 4.12
   */
  accessor noDataInterpretation: RasterNoDataInterpretation | null | undefined;
  /**
   * The name of an `oid` [field](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#fields) containing
   * a unique value or identifier for each raster in the layer.
   *
   * @see [fields](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#fields)
   */
  get objectIdField(): string;
  /**
   * A function that processes [ImageryLayerView.pixelData](https://developers.arcgis.com/javascript/latest/references/core/views/layers/ImageryLayerView/#pixelData).
   * The `pixelData` object contains a
   * [PixelBlock](https://developers.arcgis.com/javascript/latest/references/core/layers/support/PixelBlock/) property that gives
   * you access to all of the pixels in the raster on the client.
   *
   * Inside the `pixelFilter` you may loop through all the
   * [PixelBlock.pixels](https://developers.arcgis.com/javascript/latest/references/core/layers/support/PixelBlock/#pixels) found in the
   * `pixelBlock` property of the `pixelData` object and process them.
   * This function may be used to hide some pixels from the view, alter their
   * values, and change their color. The pixelFilter should be used when the imagery layer's
   * [format](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#format) is `lerc` or `tiff` as these formats return raw pixel data to the client.
   *
   * @see [Sample - Pixel Filter](https://developers.arcgis.com/javascript/latest/sample-code/layers-imagery-pixelvalues/)
   * @example
   * let layer = new ImageryLayer({
   *   url: // url to the image service
   *   pixelFilter: colorize  // see the colorize() function below
   * });
   *
   * // This function is applied to the pixelFilter property of the layer.
   * // It takes the original value of each pixel and converts it to an RGB
   * // representation to color the layer on a blue - red ramp. Blue pixels
   * // represent low values and red pixels represent high values. View the sample
   * // referenced above to see how this function works
   *
   * function colorize(pixelData) {
   *   // If there isn't pixelData, a pixelBlock, nor pixels, exit the function
   *   if (pixelData === null || pixelData.pixelBlock === null || pixelData.pixelBlock.pixels === null) {
   *     return;
   *   }
   *
   *   // The pixelBlock stores the values of all pixels visible in the view
   *   let pixelBlock = pixelData.pixelBlock;
   *
   *   // Get the min and max values of the data in the current view
   *   let minValue = pixelBlock.statistics[0].minValue;
   *   let maxValue = pixelBlock.statistics[0].maxValue;
   *
   *   // The mask is an array that determines which pixels are visible to the client
   *   let mask = pixelBlock.mask;
   *
   *   // The pixels visible in the view
   *   let pixels = pixelBlock.pixels;
   *
   *   // The number of pixels in the pixelBlock
   *   let numPixels = pixelBlock.width * pixelBlock.height;
   *
   *   // Calculate the factor by which to determine the red and blue
   *   // values in the colorized version of the layer
   *   let factor = 255.0 / (maxValue - minValue);
   *
   *   // Get the pixels containing temperature values in the only band of the data
   *   let band1 = pixels[0];
   *
   *   // Create empty arrays for each of the RGB bands to set on the pixelBlock
   *   let rBand = [];
   *   let gBand = [];
   *   let bBand = [];
   *
   *   // Loop through all the pixels in the view
   *   for (i = 0; i < numPixels; i++) {
   *     // Get the pixel value recorded at the pixel location
   *     let tempValue = band1[i];
   *     // Calculate the red value based on the factor
   *     let red = (tempValue - minValue) * factor;
   *
   *     // Sets a color between blue (lowest) and red (highest) in each band
   *     rBand[i] = red;
   *     gBand[i] = 0;
   *     bBand[i] = 255 - red;
   *   }
   *
   *   // Set the new pixel values on the pixelBlock (now three bands)
   *   pixelData.pixelBlock.pixels = [rBand, gBand, bBand];
   *   pixelData.pixelBlock.pixelType = "u8"; // u8 is used for color
   * }
   */
  accessor pixelFilter: PixelFilterFunction | null | undefined;
  /**
   * Raster source pixel type.
   *
   * Value | Range of values that each cell can contain |
   * ----- | ------------------------------------------- |
   * unknown | Pixel type is unknown |
   * s8 | -128 to 127 |
   * s16 | -32768 to 32767 |
   * s32 | -2147483648 to 2147483647 |
   * u8 | 0 to 255 |
   * u16 | 0 to 65535
   * u32 | 0 to 4294967295
   * f32 | -3.402823466e+38 to 3.402823466e+38
   * f64 | 0 to 18446744073709551616
   */
  accessor pixelType: RasterPixelType | null | undefined;
  /**
   * A complete list of fields that consists of raster attribute table fields, item pixel value, service pixel value, service pixel value with various server
   * defined function templates, and raster attribute table fields. This list is used for layer's [ImageryLayer.popupTemplate](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#popupTemplate).
   *
   * It is essential in many imagery workflows to show pixel values and related categorical information (if applicable) in a popup.
   * To meet this requirement, there're additional raster fields used in image service popups, representing pixel values and corresponding attributes
   * if the service has additional rasterAttributeTable resource. These raster fields are prefixed with `Raster.` to indicate that they are special fields and avoid
   * any potential conflict with fields from service info.
   *
   * <span id="pixel-values"></span>
   * #### Pixel value fields
   *
   * Below is a list of raster fields that return different types of pixel values and their descriptions.
   *
   * <details>
   * <summary>Read More</summary>
   *
   * ##### Service pixel value
   * The `Raster.ServicePixelValue` field returns a pixel value at the identifying location, after dynamic mosaicking (if applicable) and processing is done using layer's current
   * [mosaicRule](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#mosaicRule) and [rasterFunction](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#rasterFunction) settings. This field exists for all image services. The server side dynamic mosaicking process is only applicable
   * if the service is published from a mosaic dataset.
   *
   * ##### Raw service pixel value
   * The `Raster.ServicePixelValue.Raw` field returns a pixel value at the identifying location, after dynamic mosaicking (if applicable) but without further processing. It uses layer's
   * current [mosaicRule](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#mosaicRule) and `None` [raster function](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#rasterFunction). This field only exists if the image service info has `allowRasterFunction: true`, and has a `None` entry
   * in `rasterFunctionInfos`.
   *
   * ##### Service pixel value from server side raster functions
   * The `Raster.ServicePixelValue.RFTNAME` field returns a pixel value at the identifying location, after dynamic mosaicking (if applicable) and processing using any predefined sever side
   * raster function. The list of available functions is defined by `rasterFunctionInfos` in image service root resource, except `None` function, which is already mapped
   * as Raw Service Pixel Value. This field only exists if the image service info has `allowRasterFunction: true`.
   *
   * ##### Item pixel value
   * The `Raster.ItemPixelValue` field returns a pixel value representing pixel values of each of the individual images in the image service. This is only applicable to image services published
   * from a mosaic dataset. It can be retrieved from the image service using either the [identify()](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#identify) or the [getSamples()](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#getSamples) method.
   *
   * For example, for a service published from a mosaic dataset with the following raster functions:
   *
   * ```js
   * rasterFunctionInfos": [
   *  { "name": "None", "description": "", "help": ""},
   *  { "name": "EVI", "description": "", "help": ""}],
   *  { "name": "VI", "description": "", "help": ""}
   * ]
   * ```
   *
   * You can have the following additional raster fields: `Raster.ServicePixelValue`, `Raster.ServicePixelValue.Raw`, `Raster.ServicePixelValue.EVI`, `Raster.ServicePixelValue.VI` and
   * `Raster.ItemPixelValue`.
   *
   * Pixel value fields support formatting. Since an image service can have multiple bands, pixel value represents multiple bands, and shouldn't be assumed as a single number.
   * This needs to be considered when formatting values.
   *
   * ##### Categorical attributes fields for pixel value
   * When working with categorical data (e.g. Land Cover data), image service info may have an associated `rasterAttributeTable` resource, indicated in root resource via
   * the `hasRasterAttributeTable` flag. A raster attribute table always has a `Value` field, and each record in the table represents a pixel value mapping to associated categorical
   * fields, such as the ClassName (`Raster.ClassName`), Count (`Raster.Count`) or color representation (`Raster.Red`, `Raster.Green` and `Raster.Blue`) fields of the value.
   *
   * ##### Vector fields
   * The `Raster.Magnitude` and `Raster.Direction` fields return magnitude and direction values from a multidimensional dataset with a vector field.
   *
   * </details>
   *
   * @example
   * layer.when(() => {
   *   // print out field names returned in layer.rasterFields
   *   layer.rasterFields.forEach((field) => {
   *     console.log(field.name);
   *   });
   * });
   */
  get rasterFields(): Field[];
  /**
   * Specifies the rule for how the requested image should be processed. When rasterFunction applied, the server returns an updated service
   * information that reflects a custom processing as defined by the raster function.
   *
   * Use helper functions from the [rasterFunctionUtils](https://developers.arcgis.com/javascript/latest/references/core/layers/support/rasterFunctionUtils/) module when creating raster functions that apply to ImageryLayers.
   *
   * @since 4.27
   * @see [Raster functions - ArcGIS REST API](https://developers.arcgis.com/documentation/common-data-types/raster-function-objects.htm)
   * @example
   * // apply NDVI and colormap raster function to an imagery layer
   * // use rasterFunctionUtils convenience methods to create raster functions
   * const ndvi = rasterFunctionUtils.bandArithmeticNDVI({
   *   nirBandId: 4,
   *   redBandId: 3,
   *   scientificOutput: false
   * });
   *
   *  const colormap = rasterFunctionUtils.colormap({
   *   colorRampName: "NDVI3",
   *   raster: ndvi
   * });
   * layer.rasterFunction = colormap;
   * @example
   * const stretchFunction = new RasterFunction({
   * functionName: "Stretch",
   *   functionArguments: {
   *     StretchType: 5, // (0 = None, 3 = StandardDeviation, 4 = Histogram Equalization, 5 = MinMax, 6 = PercentClip, 9 = Sigmoid)
   *     Min: 0,
   *     Max: 255,
   *     Raster: "$$" // $$(default) refers to the entire image service, $2 refers to the second image of the image service
   *   },
   *   outputPixelType: "u8"
   * });
   *
   * const colorFunction = new RasterFunction({
   *   functionName: "Colormap",
   *   functionArguments: {
   *     ColorrampName: "Temperature", // other examples: "Slope", "Surface", "Blue Bright"....
   *     Raster: stretchFunction // chaining multiple raster functions
   *   }
   * });
   *
   * const imageryLayer = new ImageryLayer({
   *   url:
   *     "https://sampleserver6.arcgisonline.com/arcgis/rest/services/ScientificData/SeaTemperature/ImageServer"
   * });
   *
   * imageryLayer.rasterFunction = colorFunction;
   */
  get rasterFunction(): RasterFunction | null | undefined;
  set rasterFunction(value: RasterFunctionProperties | null | undefined);
  /**
   * Returns raster function information for the image services,
   * including the name, description, help, function type, and a thumbnail of pre-configured raster function templates.
   *
   * @since 4.22
   */
  get rasterFunctionInfos(): ServiceRasterFunctionInfo[] | null | undefined;
  /**
   * The renderer assigned to the layer. The renderer defines how to visualize pixels in the imagery layer.
   * Depending on the renderer type, the pixels may be [stretched](https://developers.arcgis.com/javascript/latest/references/core/renderers/RasterStretchRenderer/)
   * across the color ramp, [classified](https://developers.arcgis.com/javascript/latest/references/core/renderers/ClassBreaksRenderer/),
   * have [different symbols](https://developers.arcgis.com/javascript/latest/references/core/renderers/UniqueValueRenderer/) based on values, or show [shaded reliefs](https://developers.arcgis.com/javascript/latest/references/core/renderers/RasterShadedReliefRenderer/).
   *
   * If both renderer and [pixelFilter](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#pixelFilter) is applied to an ImageryLayer then pixelFilter will override
   * the renderer.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > Currently, the [VectorFieldRenderer](https://developers.arcgis.com/javascript/latest/references/core/renderers/VectorFieldRenderer/) is not supported in 3D [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
   *
   * @since 4.11
   * @see [Sample - Intro to ImageryTileLayer](https://developers.arcgis.com/javascript/latest/sample-code/layers-imagerytilelayer/)
   * @see [Sample - ImageryTileLayer - shaded relief renderer](https://developers.arcgis.com/javascript/latest/sample-code/layers-imagery-renderer/)
   */
  get renderer(): RasterRendererUnion | null | undefined;
  set renderer(value: ((ClassBreaksRendererProperties & { type: "class-breaks" }) | (FlowRendererProperties & { type: "flow" }) | (RasterColormapRendererProperties & { type: "raster-colormap" }) | (RasterShadedReliefRendererProperties & { type: "raster-shaded-relief" }) | (RasterStretchRendererProperties & { type: "raster-stretch" }) | (UniqueValueRendererProperties & { type: "unique-value" }) | (VectorFieldRendererProperties & { type: "vector-field" })) | null | undefined);
  /**
   * Source raster information of the image service. The layer must be
   * [ImageryLayer.loaded](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#loaded) before serviceRasterInfo can be accessed.
   *
   * @since 4.12
   * @see [Raster info](https://developers.arcgis.com/rest/services-reference/raster-info.htm)
   */
  get serviceRasterInfo(): RasterInfo;
  /**
   * The [image service's metadata JSON](https://developers.arcgis.com/rest/services-reference/image-service.htm)
   * exposed by the ArcGIS REST API. While most commonly used properties
   * are exposed on the ImageryLayer class directly, this property gives access to all information returned
   * by the image service. This property is useful if working in an application built using an older version of the API
   * which requires access to image service properties from a more recent version.
   *
   * @since 4.13
   */
  accessor sourceJSON: any;
  /**
   * Image service data source type.
   *
   * @since 4.28
   */
  get sourceType(): SourceType;
  /** The spatial reference of the image service. */
  get spatialReference(): SpatialReference;
  /**
   * The URL to the REST endpoint of the layer. The URL may either point
   * to a resource on ArcGIS Enterprise or ArcGIS Online.
   *
   * @example
   * // This url must point to an Image Service
   * let layer = new ImageryLayer({
   *   url: "http://sampleserver6.arcgisonline.com/arcgis/rest/services/CharlotteLAS/ImageServer"
   * });
   */
  accessor url: string | null | undefined;
  /**
   * The version of ArcGIS Server in which the image service is published.
   *
   * @example
   * // Prints the version number to the console - e.g. 10.91, 11.2, 11.3
   * console.log(layer.version);
   */
  get version(): number;
  /**
   * Calculates volume on the elevation data for the specified [ImageVolumeParameters.mosaicRule](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageVolumeParameters/#mosaicRule), base surface type
   * and [Polygon](https://developers.arcgis.com/javascript/latest/references/core/geometry/Polygon/) or [Extent](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/) geometries.
   * If no [mosaic rule](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageHistogramParameters/#mosaicRule) is provided, the default mosaic rule from the layer will be applied.
   *
   * @param parameters - Specifies parameters for calculating volume.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns When resolved, [ImageVolumeResult](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageVolumeResult/) is returned
   * containing an array of [ImageVolume](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageVolume/).
   * @since 4.32
   * @see [ArcGIS REST API - Compute Pixel Location](https://developers.arcgis.com/rest/services-reference/enterprise/calculate-volume)
   * @example
   * const params = new ImageVolumeParameters({
   *   geometries: [
   *     new Extent({
   *       xmin: 1450000,
   *       ymin: 540000,
   *       xmax: 1451000,
   *       ymax: 541000,
   *       spatialReference: new SpatialReference({ wkid: 2264 })
   *     }),
   *     new Extent({
   *       xmin: 1450500,
   *       ymin: 540000,
   *       xmax: 1451000,
   *       ymax: 541000,
   *       spatialReference: new SpatialReference({ wkid: 2264 })
   *   })],
   *   constantZ: 1,
   *   baseType: "constant"
   * });
   *
   * layer.calculateVolume(params).then((result) => {
   *   // use the returned result
   *   console.log(result);
   * });
   */
  calculateVolume(parameters: ImageVolumeParameters | ImageVolumeParametersProperties, requestOptions?: RequestOptions): Promise<ImageVolumeResult>;
  /**
   * Computes the rotation angle of a ImageryLayer at a given location.
   * This operation is supported at 10.9.1 and later.
   *
   * @param parameters - Specifies parameters for computing angles.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns When resolved, returns an instance of [ImageAngleResult](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageAngleResult/)
   * containing computed north and up angles.
   * @since 4.22
   * @see [ArcGIS REST API - Compute Angles](https://developers.arcgis.com/rest/services-reference/enterprise/compute-angles.htm)
   */
  computeAngles(parameters: ImageAngleParameters | ImageAngleParametersProperties, requestOptions?: RequestOptions): Promise<ImageAngleResult>;
  /**
   * Computes histograms based on the provided [ImageHistogramParameters](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageHistogramParameters/).
   * If a [raster function](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageHistogramParameters/#rasterFunction) and
   * a [mosaic rule](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageHistogramParameters/#mosaicRule) are not specified, the current settings on the layer will be used.
   * This operation is supported by an image service published with a mosaic dataset or a raster dataset at ArcGIS Server 10.4 and later.
   * The result of this operation contains histograms computed for the given extent.
   *
   * @param parameters - Specifies parameters for computing histograms.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns Resolves to an object containing histogram results.
   * See the object specification table below for details.
   *
   * Property | Type | Description
   * ---------|------|-------------
   * histograms[] | [RasterHistogram](https://developers.arcgis.com/javascript/latest/references/core/layers/raster/types/#RasterHistogram) | Result containing raster histograms.
   * @since 4.18
   * @example
   * // set the pixel size parameter to match the current
   * // resolution of the view and spatial reference
   * let pixelSize = {
   *   x:view.resolution,
   *   y:view.resolution,
   *   spatialReference: {
   *     wkid: view.spatialReference.wkid
   *   }
   * }
   * // set the histogram parameters to request
   * // data for the current view extent and resolution
   * let params = new ImageHistogramParameters({
   *   geometry:  view.extent,
   *   pixelSize: pixelSize
   * });
   *
   * // request for histograms for the specified parameters
   * layer.computeHistograms(params).then(function(results){
   *   // results are returned and process it as needed.
   *   console.log("histograms and stats", results);
   * })
   * .catch(function(err){
   *   console.log("err", err)
   * });
   */
  computeHistograms(parameters: ImageHistogramParameters | ImageHistogramParametersProperties, requestOptions?: RequestOptions): Promise<ImageServiceHistogramsResult>;
  /**
   * Computes the corresponding pixel location in columns and rows for an image based on input geometry.
   * Requires that the raster catalog item has a valid `icsToPixel` resource.
   *
   * @param parameters - Specifies parameters for computing image space pixel location.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns When resolved, returns an instance of
   * [ImagePixelLocationResult](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImagePixelLocationResult/) containing x and y values for the column and row of each input geometry.
   * @since 4.22
   * @see [ArcGIS REST API - Compute Pixel Location](https://developers.arcgis.com/rest/services-reference/enterprise/compute-pixel-location.htm)
   */
  computePixelSpaceLocations(parameters: ImagePixelLocationParameters | ImagePixelLocationParametersProperties, requestOptions?: RequestOptions): Promise<ImagePixelLocationResult>;
  /**
   * Computes [statistics](https://developers.arcgis.com/javascript/latest/references/core/layers/raster/types/#RasterBandStatistics) and [histograms](https://developers.arcgis.com/javascript/latest/references/core/layers/raster/types/#RasterHistogram)
   * for the provided [ImageHistogramParameters](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageHistogramParameters/).
   * If a [raster function](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageHistogramParameters/#rasterFunction) and a
   * [mosaic rule](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageHistogramParameters/#mosaicRule) are not specified, the current settings on the layer will be used.
   * This operation is supported by an image service published with a mosaic dataset or a raster dataset at ArcGIS Server 10.4 and later.
   *
   * The result of this operation contains both statistics and histograms computed for the given extent or polygon.
   * Note that the given extent or polygon is first projected to the spatial reference of the service, then the source pixels are requested at the specified
   * resolution for the projected geometry's extent. The statistics and histogram are then computed based on the source pixel's values.
   *
   * @param parameters - Specifies parameters for computing statistics and histograms.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns Resolves to an object containing histogram and statistics results.
   * See the object specification table below for details.
   *
   * Property | Type | Description
   * ---------|------|-------------
   * histograms[] | [RasterHistogram](https://developers.arcgis.com/javascript/latest/references/core/layers/raster/types/#RasterHistogram) | Result containing raster histograms.
   * bandStatistics[] | [RasterBandStatistics](https://developers.arcgis.com/javascript/latest/references/core/layers/raster/types/#RasterBandStatistics) | Raster band statistics.
   * @since 4.18
   * @example
   * // set the pixel size parameter to match the current
   * // resolution of the view and spatial reference
   * let pixelSize = {
   *   x:view.resolution,
   *   y:view.resolution,
   *   spatialReference: {
   *     wkid: view.spatialReference.wkid
   *   }
   * }
   * // set the histogram parameters to request
   * // data for the current view extent and resolution
   * let params = new ImageHistogramParameters({
   *   geometry:  view.extent,
   *   pixelSize: pixelSize
   * });
   *
   * // request for histograms and statistics for the specified parameters
   * layer.computeStatisticsHistograms(params).then(function(results){
   *   // results are returned and process it as needed.
   *   console.log("histograms and stats", results);
   * })
   * .catch(function(err){
   *   console.log("err", err)
   * });
   */
  computeStatisticsHistograms(parameters: ImageHistogramParameters | ImageHistogramParametersProperties, requestOptions?: RequestOptions): Promise<ImageServiceStatisticsHistogramsResult>;
  /**
   * Creates query parameter object that can be used to fetch features from feature-based layers or
   * image footprints from ImageryLayer that satisfy the layer's configurations such as [definitionExpression](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#definitionExpression).
   * It will return `Z` and `M` values based on the layer's [data capabilities](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#capabilities).
   * It sets the query parameter's [Query.outFields](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outFields) property to `["*"]`.
   * The results will include feature geometries and values for all [available fields](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLayerView/#availableFields) in
   * [queries](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLayerView/#queryFeatures) against the layer views of feature-based layers, or all fields in the layer for
   * [queries against the layer](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#queryFeatures).
   *
   * @returns The query object representing the layer's definition expression and other configurations.
   * @since 5.1
   * @see [Sample - Query features from a FeatureLayer](https://developers.arcgis.com/javascript/latest/sample-code/featurelayer-query/)
   * @example
   * ```js
   * // Get a query object for the layer's current configuration
   * queryParams.outFields will be set to ["*"] to get values for all available fields.
   * const queryParams = layer.createQuery();
   * // set a geometry for filtering features by a region of interest
   * queryParams.geometry = extentForRegionOfInterest;
   * // Add to the layer's current definitionExpression
   * queryParams.where = queryParams.where + " AND TYPE = 'Extreme'";
   *
   * // query the layer with the modified params object
   * layer.queryFeatures(queryParams).then(function(results){
   *   // prints the array of result graphics to the console
   *   console.log(results.features);
   * });
   * ```
   * @example
   * ```js
   * // this snippet shows the query parameter object that is returned
   * // from FeatureLayer.createQuery().
   * const queryParams = new Query();
   * const dataCapabilities = layer.get<DataCapabilities>("capabilities.data");
   *
   * queryParams.gdbVersion = layer.gdbVersion;
   * queryParams.historicMoment = layer.historicMoment;
   * queryParams.returnGeometry = true;
   *
   * if (dataCapabilities) {
   *   if (dataCapabilities.supportsZ && layer.returnZ != null) {
   *     queryParams.returnZ = layer.returnZ;
   *   }
   *
   *   if (dataCapabilities.supportsM && layer.returnM != null) {
   *     queryParams.returnM = layer.returnM;
   *   }
   * }
   *
   * queryParams.outFields = ["*"];
   * queryParams.where = layer.definitionExpression || "1=1";
   * queryParams.multipatchOption = layer.geometryType === "multipatch" ? "xyFootprint" : null;
   * ```
   * @example
   * ```js
   * // this snippet shows query image footprints from imagery layer
   * // that honors the layer's definitionExpression and other configurations.
   * if (imageryLayer.capabilities.operations.supportsQuery) {
   * const query = imageryLayer.createQuery();
   * const rasters = await imageryLayer.queryRasters(query);
   * ```
   */
  createQuery(): Query;
  /**
   * Fetches raw pixel data for a specified extent, width, and height, preserving full pixel depth and including all bands without applying renderer to the layer.
   * The operation uses the following layer properties: [mosaicRule](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#mosaicRule), [rasterFunction](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#rasterFunction), [compressionTolerance](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#compressionTolerance),
   * [definitionExpression](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#definitionExpression), [noData](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#noData), [noDataInterpretation](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#noDataInterpretation), and [multidimensionalSubset](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/ArcGISImageService/#multidimensionalSubset).
   *
   * @param extent - The extent of the image to export.
   * @param width - The width of the image in pixels.
   * @param height - The height of the image in pixels.
   * @param options - The parameter options is an object with the following properties.
   * @returns Resolves to an object containing the parameters of the exported pixels including [PixelBlock](https://developers.arcgis.com/javascript/latest/references/core/layers/support/PixelBlock/).
   * The `pixelBlock` contains the value of each pixel in the image.
   * @since 4.33
   */
  fetchPixels(extent: Extent, width: number, height: number, options?: DynamicFetchRasterOptions): Promise<PixelData>;
  /**
   * Finds images based on the provided [FindImagesParameters](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FindImagesParameters/).
   * It locates all images that contain the [FindImagesParameters.toGeometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FindImagesParameters/#toGeometry) value and sorts them accordingly.
   * The [FindImagesParameters.fromGeometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FindImagesParameters/#fromGeometry) can be a 3D SceneView's [camera position](https://developers.arcgis.com/javascript/latest/references/core/Camera/#position)
   * and [FindImagesParameters.toGeometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FindImagesParameters/#toGeometry) is a clicked location on the map.
   *
   * This operation is supported with ArcGIS Enterprise version 11.2 or higher image services.
   *
   * @param parameters - Specifies the find images parameters.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns Resolves to a [FindImagesResult](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FindImagesResult/) containing images that meet the search requirements.
   * @since 4.29
   */
  findImages(parameters: FindImagesParameters | FindImagesParametersProperties, requestOptions?: RequestOptions): Promise<FindImagesResult>;
  /**
   * Generates raster info for the specified raster function.
   *
   * @param rasterFunction - Raster function for the requested raster info.
   * @param options - An object with the following properties.
   * @returns When resolved, a [RasterInfo](https://developers.arcgis.com/javascript/latest/references/core/layers/support/RasterInfo/)
   * containing info specific to the requested raster function is returned.
   * @since 4.12
   */
  generateRasterInfo(rasterFunction: RasterFunction | RasterFunctionProperties | null | undefined, options?: AbortOptions): Promise<RasterInfo>;
  /**
   * Gets the [image coordinate system](https://developers.arcgis.com/rest/services-reference/raster-ics.htm)
   * information of a catalog item in an image service. The returned object can be used to set the 2D MapView's
   * [MapView.spatialReference](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/#spatialReference) and [MapView.extent](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/#extent)
   * so that the image can be displayed in its original coordinate system.
   * The image service must have a catalog capability.
   *
   * @param rasterId - Raster catalog id.
   * @param options - An object with the following properties.
   * @returns When resolved, returns an object containing [image coordinate system](https://developers.arcgis.com/rest/services-reference/raster-ics.htm) of the raster catalog item.
   * @since 4.13
   * @see [Sample - ImageryLayer image coordinate system](https://developers.arcgis.com/javascript/latest/sample-code/layers-imagery-coordinatesystem/)
   * @see [Image coordinate system](https://developers.arcgis.com/documentation/common-data-types/image-coordinate-system.htm)
   * @see [Image space analysis](https://pro.arcgis.com/en/pro-app/latest/help/analysis/image-analyst/what-is-image-space-analysis-.htm)
   * @example
   * // get image coordinate system of the specified catalog item
   * // for example Raster.OBJECTID = 1600
   * layer.getCatalogItemICSInfo(imageId).then(function(info) {
   * // create a spatialReference object and set its
   * // imageCoordinateSystem property
   *  let sr = { // autocasts to esri/geometry/SpatialReference
   *    imageCoordinateSystem: { id: imageId }
   *  };
   *
   *  // Calculate an extent for the mapview based on the image's extent
   *  // in its original coordinate system
   *  const width = document.getElementById("viewDiv").getBoundingClientRect().width;
   *  const height = document.getElementById("viewDiv").getBoundingClientRect().height;
   *  const newExt = info.icsExtent.clone();
   *  const scaleFactor = 5;
   *  newExt.xmin = (newExt.xmin + newExt.xmax - width * scaleFactor) / 2;
   *  newExt.xmax = newExt.xmin + width * scaleFactor;
   *  newExt.ymin = (newExt.ymin + newExt.ymax - height * scaleFactor) / 2;
   *  newExt.ymax = newExt.ymin + height * scaleFactor;
   *  newExt.spatialReference = sr;
   *
   *  // set the MapView's spatialReference to the image's coordinate system
   *  // and the extent to the extent calculated above
   *  view = new MapView({
   *    container: "viewDiv",
   *    map: map,
   *    spatialReference: sr,
   *    extent: newExt
   *  });
   * });
   */
  getCatalogItemICSInfo(rasterId: number, options?: AbortOptions): Promise<object | undefined>;
  /**
   * Get the [raster info](https://developers.arcgis.com/javascript/latest/references/core/layers/support/RasterInfo/) of a
   * [catalog item](https://developers.arcgis.com/rest/services-reference/raster-catalog-item.htm) in an image service.
   * Each raster catalog item represents a feature in the raster catalog. Each such feature has an associated raster.
   * The image service must have a catalog capability.
   *
   * @param rasterId - Raster catalog id.
   * @param options - An object with the following properties.
   * @returns When resolved, a [RasterInfo](https://developers.arcgis.com/javascript/latest/references/core/layers/support/RasterInfo/)
   * containing info specific to the catalog item is returned.
   * @since 4.13
   */
  getCatalogItemRasterInfo(rasterId: number, options?: AbortOptions): Promise<RasterInfo>;
  /**
   * Retrieves an image's url using the provided [ImageUrlParameters](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageUrlParameters/).
   * This operation is supported with ArcGIS Enterprise version 11.3 or higher image services.
   *
   * @param parameters - Specifies the image url parameters.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns Resolves to a [ImageUrlResult](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageUrlResult/) containing the image's url.
   * @since 4.30
   */
  getImageUrl(parameters: ImageUrlParameters | ImageUrlParametersProperties, requestOptions?: RequestOptions): Promise<ImageUrlResult>;
  /**
   * Returns sample point locations, pixel values and corresponding resolutions of the source data for a given geometry. When the input geometry
   * is a [Polyline](https://developers.arcgis.com/javascript/latest/references/core/geometry/Polyline/), [Extent](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/), or [Polygon](https://developers.arcgis.com/javascript/latest/references/core/geometry/Polygon/),
   * the sampling is based on [ImageSampleParameters.sampleCount](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageSampleParameters/#sampleCount) or
   * [ImageSampleParameters.sampleDistance](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageSampleParameters/#sampleDistance) parameters. When the geometry is a
   * [Point](https://developers.arcgis.com/javascript/latest/references/core/geometry/Point/) or [Multipoint](https://developers.arcgis.com/javascript/latest/references/core/geometry/Multipoint/), the point or points are used directly.
   *
   * The number of sample locations in the response is based on the `sampleDistance` or `sampleCount` parameter and cannot exceed the limit imposed by the image
   * service. The sample points are located at the intersection of the provided geometry and the raster item's footprints. They are also filtered by
   * the [ImageSampleParameters.mosaicRule](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageSampleParameters/#mosaicRule) and [ImageSampleParameters.pixelSize](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageSampleParameters/#pixelSize) parameters.
   *
   * @param parameters - The parameters used in the getSamples operation.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns When resolved, [ImageSampleResult](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageSampleResult/) is returned containing an array of [ImageSamples](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageSample/).
   * @since 4.20
   * @example
   * // get all sample points along a polyline
   * // at the specified sample distance and pixel size
   * const param = {
   *   geometry: polyline
   *   returnFirstValueOnly: false,
   *   // resolution - unit of the view's spatial reference
   *   pixelSize: {
   *     x:12,
   *     y:12,
   *     spatialReference: view.spatialReference
   *   },
   *   interpolation: "nearest",
   *   // unit of the geometry's spatial reference is used
   *   sampleDistance: 30,
   *   outFields: ["*"]
   * };
   * imageryLayer.getSamples(param).then((results) => {
   *   // use the getSamples results as needed.
   *   console.log(results);
   * })
   * .catch(function(error){
   *   console.log(error)
   * })
   */
  getSamples(parameters: ImageSampleParameters | ImageSampleParametersProperties, requestOptions?: RequestOptions): Promise<ImageSampleResult>;
  /**
   * Sends a request to the ArcGIS REST image service to identify content based on the
   * specified [ImageIdentifyParameters](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageIdentifyParameters/).
   * If a [raster function](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageIdentifyParameters/#rasterFunction) and
   * a [mosaic rule](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageIdentifyParameters/#mosaicRule)
   * are not specified, then the current layer settings will be used.
   *
   * @param parameters - The identify parameters used in the identify operation.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns When resolved, a [ImageIdentifyResult](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageIdentifyResult/)
   * is returned.
   * @since 4.18
   */
  identify(parameters: ImageIdentifyParameters | ImageIdentifyParametersProperties, requestOptions?: RequestOptions): Promise<ImageIdentifyResult>;
  /**
   * Converts a geometry from an image space to a map space using the provided [ImageToMapParameters](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageToMapParameters/).
   * This operation is supported with ArcGIS Enterprise version 11.2 or higher image services.
   *
   * @param parameters - Specifies the image to map parameters.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns Resolves to a geometry object.
   * @since 4.29
   */
  imageToMap(parameters: ImageToMapParameters | ImageToMapMultirayParametersProperties, requestOptions?: RequestOptions): Promise<GeometryUnion>;
  /**
   * Creates a map space geometry from multiray image space geometries using the provided [ImageToMapMultirayParameters](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageToMapMultirayParameters/).
   * For example, a house is shown in several raster items. Users can specify the house location on each image using the [ImageToMapMultirayParameters.geometries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageToMapMultirayParameters/#geometries)
   * parameter. Then in the [ImageToMapMultirayParameters.rasterIds](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageToMapMultirayParameters/#rasterIds) parameter, specify the rasterIds of the images in the same order as the geometries.
   * The `imageToMapMultiray` method will find and return the house location in the map space on all specified images.
   *
   * This operation is supported with ArcGIS Enterprise version 11.2 or higher image services.
   *
   * @param parameters - Specifies the image to map multiray parameters.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns Resolves to a geometry object where the coordinates are in map coordinates.
   * @since 4.29
   */
  imageToMapMultiray(parameters: ImageToMapMultirayParameters | ImageToMapMultirayParametersProperties, requestOptions?: RequestOptions): Promise<GeometryUnion>;
  /**
   * Converts a given geometry from a map space to an image space using the provided [MapToImageParameters](https://developers.arcgis.com/javascript/latest/references/core/rest/support/MapToImageParameters/).
   * This operation is supported with ArcGIS Enterprise version 11.2 or higher image services.
   *
   * @param parameters - Specifies the map to image parameters.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns Resolves to a geometry object where the coordinates are in image space.
   * @since 4.29
   */
  mapToImage(parameters: MapToImageParameters | MapToImageParametersProperties, requestOptions?: RequestOptions): Promise<GeometryUnion>;
  /**
   * Calculates the area and perimeter of a given geometry on an image service. The result of this operation includes the name of the raster dataset being used,
   * the sensor name, and measured values.
   *
   * @param parameters - Specifies parameters for measuring the area and perimeter for a given geometry on an image service.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns When resolved, returns an instance of [ImageAreaResult](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageAreaResult/)
   * containing the name of the raster dataset being used, the sensor name, and measured values.
   * @since 4.26
   * @example
   * // calculate an area and perimeter of an image visible in the view
   * const params = new ImageAreaParameters({
   *   geometry: view.extent,
   *   areaUnit: "square-kilometers",
   *   linearUnit: "kilometers"
   * });
   *
   * layer.measureAreaAndPerimeter(params).then((result)=>{
   *   // use the area and perimeter measure values
   *   console.log(result);
   * });
   */
  measureAreaAndPerimeter(parameters: ImageAreaParameters | ImageAreaParametersProperties, requestOptions?: RequestOptions): Promise<ImageAreaResult>;
  /**
   * Measures the area and the perimeter of a polygon in an image space on a selected raster when the following conditions are met:
   *
   * * Image service must be published from a mosaic dataset.
   * * Raster items in the mosaic dataset must have 3D transformation (e.g. mosaic dataset built with UAV raster type).
   *
   * @param parameters - Specifies parameters for measuring the area and the perimeter.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request.
   * @returns When resolved, returns an instance of [MeasureAreaFromImageResult](https://developers.arcgis.com/javascript/latest/references/core/rest/support/MeasureAreaFromImageResult/)
   * containing the polygon's geometry in a map space, and its length, area and center.
   * @since 4.29
   */
  measureAreaFromImage(parameters: MeasureFromImageParameters, requestOptions?: RequestOptions): Promise<MeasureAreaFromImageResult>;
  /**
   * Calculates the distance and angle between two points on an image service. The result of this operation
   * includes the name of the raster dataset being used, the sensor name, and measured values.
   *
   * @param parameters - Specifies parameters for measuring the distance and angle between two points on an image service.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns When resolved, returns an instance of [ImageDistanceResult](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageDistanceResult/)
   * containing the name of the raster dataset being used, the sensor name, and measured values.
   * @since 4.26
   */
  measureDistanceAndAngle(parameters: ImageDistanceParameters | ImageDistanceParametersProperties, requestOptions?: RequestOptions): Promise<ImageDistanceResult>;
  /**
   * Calculates the height of an object between two points on an image service if the sensor info is available.
   * The result of this operation includes the name of the raster dataset being used, the sensor name, and measured values.
   * See the [ImageHeightParameters.operationType](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageHeightParameters/#operationType) documentation for types of
   * height measurements.
   *
   * @param parameters - Specifies parameters for measuring the height of an object between two points on
   * an image service.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns When resolved, returns an instance of [ImageHeightResult](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageHeightResult/)
   * containing the name of the raster dataset being used, the sensor name, and measured values.
   * @since 4.26
   */
  measureHeight(parameters: ImageHeightParameters | ImageHeightParametersProperties, requestOptions?: RequestOptions): Promise<ImageHeightResult>;
  /**
   * Measures the length of a polyline in an image space on a selected raster when the following conditions are met:
   *
   * * Image service must be published from a mosaic dataset.
   * * Raster items in the mosaic dataset must have 3D transformation (e.g. mosaic dataset built with UAV raster type).
   *
   * @param parameters - Specifies parameters for measuring the length of a polyline.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request.
   * @returns When resolved, returns an instance of [MeasureLengthFromImageResult](https://developers.arcgis.com/javascript/latest/references/core/rest/support/MeasureLengthFromImageResult/)
   * containing the [Polyline](https://developers.arcgis.com/javascript/latest/references/core/geometry/Polyline/) in a map space and its length.
   * @since 4.29
   */
  measureLengthFromImage(parameters: MeasureFromImageParameters, requestOptions?: RequestOptions): Promise<MeasureLengthFromImageResult>;
  /**
   * Returns the location for a given point or centroid of a given area on an image service.
   *
   * @param parameters - Specifies parameters for determining a point location or a centroid
   * of a given area on the image service.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns When resolved, returns an instance of [ImagePointResult](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImagePointResult/)
   * containing the name of the raster dataset being used, the sensor name, and measured values.
   * @since 4.26
   */
  measurePointOrCentroid(parameters: ImagePointParameters | ImagePointParametersProperties, requestOptions?: RequestOptions): Promise<ImagePointResult>;
  /**
   * Returns the boundary of an image for the provided [ImageBoundaryParameters](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageBoundaryParameters/).
   * This operation is supported with ArcGIS Enterprise version 10.6 or higher image services.
   *
   * @param parameters - Specifies the imagery boundary parameters.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns Resolves to an object containing boundary geometry of an image service.
   * @since 4.29
   */
  queryBoundary(parameters?: ImageBoundaryParameters | ImageBoundaryParametersProperties, requestOptions?: RequestOptions): Promise<ImageBoundaryResult>;
  /**
   * Executes a [Query](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/) against the image service and
   * returns the [Extent](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/) of rasters that satisfy the query.
   *
   * @param query - Specifies the attributes and spatial
   * filter of the query. If no parameters are specified, then the extent and count of all rasters
   * satisfying the layer's configuration/filters are returned.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns When resolved, returns the extent and count of the rasters
   * that satisfy the input query. See the object specification table below for details.
   * Property | Type | Description
   * ---------|------|-------------
   * count | Number | The number of rasters that satisfy the input query.
   * extent | [Extent](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/) \| null | The extent of the rasters that satisfy the query.
   * @since 5.0
   * @example
   * // Queries for the extent of all images matching the layer's configurations
   * // e.g. definitionExpression
   * layer.queryExtent().then(function(results){
   *   // go to the extent of the results satisfying the query
   *   view.goTo(results.extent);
   * });
   */
  queryExtent(query?: QueryProperties | null | undefined, requestOptions?: RequestOptions): Promise<{
      count: number;
      extent: Extent | null;
  }>;
  /**
   * Returns GPS information for the provided [ImageGPSInfoParameters](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageGPSInfoParameters/).
   * It returns information about cameras, GPS locations when the image was taken,
   * and exterior orientation information of each image.
   *
   * This operation is supported with ArcGIS Enterprise version 11.2 or higher image services.
   *
   * @param parameters - Specifies the parameters for query GPS info operation.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns Resolves to an object containing information about images and cameras.
   * @since 4.29
   */
  queryGPSInfo(parameters?: ImageGPSInfoParametersProperties, requestOptions?: RequestOptions): Promise<ImageGPSInfoResult>;
  /**
   * Executes a [Query](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/) against the image service and returns an
   * array of Object IDs for the rasters.
   *
   * @param query - Specifies the query parameters. If no parameters are specified, then all Object IDs satisfying the
   * layer's configuration/filters are returned.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns When resolved, returns an array of numbers representing the object IDs of the rasters satisfying the query.
   * @since 4.21
   */
  queryObjectIds(query?: QueryProperties | null | undefined, requestOptions?: RequestOptions): Promise<number[]>;
  /**
   * Executes a [Query](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/) against the image service and
   * returns the number of rasters that satisfy the query.
   *
   * @param query - Specifies the query parameters. If no parameters are specified, then count of all rasters satisfying the layer's
   * configuration/filters are returned.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns When resolved, returns the number of rasters satisfying the query.
   * @since 4.21
   * @example
   * const query = new Query({
   *   where: "LowPS <= 30"
   * });
   *
   * layer.queryRasterCount(query).then(function(result){
   *   // use the count of rasters
   *   console.log("queryRasterCount", result)
   * });
   */
  queryRasterCount(query?: QueryProperties | null | undefined, requestOptions?: RequestOptions): Promise<number>;
  /**
   * Executes a [Query](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/) against an image service and returns a
   * [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/) once the promise resolves.
   * A [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/) contains an array of [Graphic](https://developers.arcgis.com/javascript/latest/references/core/Graphic/)
   * features.
   *
   * @param query - Specifies the query parameters. If no parameters are specified, then all features satisfying the layer's
   * configuration/filters are returned.
   * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request
   * (will override requestOptions defined during construction).
   * @returns When resolved, a [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/) containing an array
   *  of graphics is returned.
   * @since 4.18
   * @example
   * let params = new Query({
   *   // Define query parameters here
   * });
   * layer.queryRasters(params).then(function(response){
   *   // The response is a FeatureSet if results are found
   * });
   */
  queryRasters(query?: QueryProperties | null | undefined, requestOptions?: RequestOptions): Promise<FeatureSet>;
}

export interface ImageryMensurationCapabilities {
  /** Indicates if the layer supports distance and angle mensuration operation. */
  supportsDistanceAndAngle: boolean;
  /** Indicates if the layer supports area and perimeter mensuration operation. */
  supportsAreaAndPerimeter: boolean;
  /** Indicates if the layer supports point or centroid mensuration operations. */
  supportsPointOrCentroid: boolean;
  /** Indicates if the layer supports a mensuration operation for calculating a height of a ground feature by measuring from the base of the object to the top of the object. */
  supportsHeightFromBaseAndTop: boolean;
  /** Indicates if the layer supports a mensuration operation for calculating a height of a feature by measuring from the base of the object to the top of the object's shadow on the ground. */
  supportsHeightFromBaseAndTopShadow: boolean;
  /** Indicates if the layer supports mensuration operation for calculating a height from the top of the object to the top of the objects's shadow on the ground. */
  supportsHeightFromTopAndTopShadow: boolean;
  /** Indicates if the layer supports 3D mensuration operations. */
  supports3D: boolean;
}

export interface ImageryLayerCapabilities {
  /** Describes operations supported by the ImageryLayer. */
  operations: ImageryLayerOperations;
  /** Describes [Query](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/) operations supported by the layer. Use the [query](https://developers.arcgis.com/javascript/latest/references/core/rest/query/) to query an imagery layer. */
  query: QueryCapabilities;
  /** Describes [mensuration operations](https://developers.arcgis.com/rest/services-reference/enterprise/measure.htm) supported by the ImageryLayer. Added since ArcGIS Maps SDK for JavaScript 4.26. */
  mensuration: ImageryMensurationCapabilities;
}

export interface ImageryLayerOperations extends OperationCapabilities {
  /** Indicates if the layer supports a [compute histograms](https://developers.arcgis.com/rest/services-reference/compute-histograms.htm) operation from an area of interest. */
  supportsComputeHistograms: boolean;
  /** Indicates if the layer supports an [export image](https://developers.arcgis.com/rest/services-reference/export-image.htm) operation based on a bounding box. */
  supportsExportImage: boolean;
  /** Indicates if the layer supports an [identify()](https://developers.arcgis.com/javascript/latest/references/core/rest/identify/#identify) operation on pixel values. */
  supportsIdentify: boolean;
  /** Indicates if the layer supports image to map operation. */
  supportsImageToMap: boolean;
  /** Indicates if the layer supports image to map multiray operation. */
  supportsImageToMapMultiray: boolean;
  /** Indicates if the layer supports map to image operation. */
  supportsMapToImage: boolean;
  /** Indicates if the layer supports mensuration. */
  supportsMeasure: boolean;
  /** Indicates if the layer allows the source image to be [downloaded](https://developers.arcgis.com/rest/services-reference/download-rasters.htm). */
  supportsDownload: boolean;
  /** Indicates if the layer supports an operation to [query images](https://developers.arcgis.com/rest/services-reference/query-image-service-.htm). */
  supportsQuery: boolean;
  /** Indicates if the layer supports find images operation. */
  supportsFindImages: boolean;
  /** Indicates if the layer supports get image url operation. */
  supportsGetImageUrl: boolean;
  /** Indicates if the layer supports a [sampling operation](https://developers.arcgis.com/rest/services-reference/get-samples.htm). */
  supportsGetSamples: boolean;
  /** Indicates if the layer supports [projection of geometries](https://developers.arcgis.com/rest/services-reference/project.htm), including from/to image spatial reference. */
  supportsProject: boolean;
  /** Indicates if the layer supports an operation [computing statistics and histograms](https://developers.arcgis.com/rest/services-reference/compute-statistics-and-histograms.htm) from an area of interest. */
  supportsComputeStatisticsHistograms: boolean;
  /** Indicates if the layer supports an operation to [query the service's boundary](https://developers.arcgis.com/rest/services-reference/query-boundary.htm). */
  supportsQueryBoundary: boolean;
  /** Indicates if the elevation layer supports an operation to [compute volumes](https://developers.arcgis.com/rest/services-reference/calculate-volume.htm). */
  supportsCalculateVolume: boolean;
  /** Indicates if the layer supports [computing pixel location](https://developers.arcgis.com/rest/services-reference/compute-pixel-location.htm) in pixel space. */
  supportsComputePixelLocation: boolean;
  /** Indicates if the layer supports an operation to [query the service's gps info](https://developers.arcgis.com/rest/services-reference/enterprise/query-gps-.htm). */
  supportsQueryGPSInfo: boolean;
}

/**
 * Function definition for the [ImageryLayer.pixelFilter](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#pixelFilter) property.
 * See the example snippet in the [ImageryLayer.pixelFilter](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#pixelFilter)
 * documentation for more details.
 *
 * @param pixelData - An object that provides the user access to
 *    [PixelBlock.pixels](https://developers.arcgis.com/javascript/latest/references/core/layers/support/PixelBlock/#pixels) in and their values in the layer.
 */
export type PixelFilterFunction = (pixelData: PixelData) => void;