@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
205 lines (202 loc) • 11.5 kB
TypeScript
/**
* This object contains a helper method for generating data-driven visualizations with continuous
* opacity based on data returned from a field value or expression in a [Layer](https://developers.arcgis.com/javascript/latest/references/core/layers/Layer/).
*
* The [createVisualVariable()](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/renderers/opacity/#createVisualVariable) method
* generates an [opacity visual variable](https://developers.arcgis.com/javascript/latest/references/core/renderers/visualVariables/OpacityVariable/)
* with default alpha values that are optimally mapped to data values based on the statistics of the indicated field.
*
* > [!WARNING]
* >
* > **Known Limitations**
* >
* > [SceneLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/SceneLayer/) must have the `supportsRenderer` and `supportsLayerQuery` capabilities enabled unless a predefined [statistics](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/statistics/types/#SummaryStatisticsResult) object is provided to the `statistics` parameter of the method. To check a SceneLayer's capabilities, use the [SceneLayer.getFieldUsageInfo()](https://developers.arcgis.com/javascript/latest/references/core/layers/SceneLayer/#getFieldUsageInfo) method.
* > You cannot generate renderers and visual variables using SQL expressions for client-side [FeatureLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/)
* > in a [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
*
* @since 4.6
* @see [Styles and data visualization](https://developers.arcgis.com/javascript/latest/visualization/)
*/
import type FeatureFilter from "../../layers/support/FeatureFilter.js";
import type AuthoringInfo from "../../renderers/support/AuthoringInfo.js";
import type OpacityVariable from "../../renderers/visualVariables/OpacityVariable.js";
import type { MapViewOrSceneView } from "../../views/MapViewOrSceneView.js";
import type { AbortOptions } from "../../core/promiseUtils.js";
import type { VisualVariableLegendOptions as IVisualVariableLegendOptions } from "../../renderers/types.js";
import type { SummaryStatisticsResult } from "../statistics/types.js";
import type { FeatureLikeLayerOrAdapter } from "../support/adapters/types.js";
/**
* This method generates an opacity visual variable
* with default alpha values optimally mapped to data values based on the statistics
* queried for the indicated field or expression.
*
* There are several ways this method may be called. The most common case is by
* providing a `layer` and a `field`. This is the scenario where
* the statistics of the data aren't well known and the user doesn't know the which
* alpha values to map to data values. You can optionally use a `valueExpression` instead of a field to visualize
* features based on a numeric value returned from a script executed at runtime.
*
* The other options are provided for convenience for more involved custom visualization authoring
* applications. For example, if you already generated statistics in another operation, you
* can pass the stats in the `statistics` parameter to avoid making an extra call to the server.
*
* @param parameters - Input parameters for generating an opacity visual variable based on data
* returned from a given field or expression.
* @returns Resolves to an instance of
* [VisualVariableResult](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/renderers/opacity/#VisualVariableResult).
* @example
* let layer = new FeatureLayer({
* url: "https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/counties_politics_poverty/FeatureServer/0"
* });
*
* // visualization based on field and normalization field
* let parameters = {
* layer: layer,
* field: "POP_POVERTY",
* normalizationField: "TOTPOP_CY"
* };
*
* // when the promise resolves, apply the visual variable to the renderer
* opacityVariableCreator.createVisualVariable(parameters)
* .then(function(response){
* let renderer = layer.renderer.clone();
* renderer.visualVariables = [ response.visualVariable ];
* layer.renderer = renderer;
* });
* @example
* let layer = new FeatureLayer({
* url: "https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/counties_politics_poverty/FeatureServer/0"
* });
*
* // visualization based off Arcade expression
* let parameters = {
* layer: layer,
* valueExpression: "($feature.POP_POVERTY / $feature.TOTPOP_CY) * 100",
* view: view,
* valueExpressionTitle: "% of people living in poverty"
* };
*
* // when the promise resolves, apply the visual variable to the renderer
* opacityVariableCreator.createVisualVariable(parameters)
* .then(function(response){
* let renderer = layer.renderer.clone();
* renderer.visualVariables = [ response.visualVariable ];
* layer.renderer = renderer;
* });
*/
export function createVisualVariable(parameters: VisualVariableParameters): Promise<VisualVariableResult>;
export interface VisualVariableParameters extends AbortOptions {
/**
* The layer for which the visual variable
* is generated. When a client-side layer type is provided, attribute and spatial statistics are calculated
* only from features in the view's extent. When a server-side layer type is provided, the statistics
* are calculated from the entire layer, unless a `valueExpression` is provided.
*/
layer?: FeatureLikeLayerOrAdapter | null;
/**
* The name of the field whose data will be queried for statistics and used for
* the basis of the data-driven visualization.
* This property is ignored if a `valueExpression` is used.
*/
field?: string | null;
/**
* The name of the field to normalize the values of the given
* `field`. Providing a normalization field helps minimize some visualization errors and standardizes the data
* so all features are visualized with minimal bias due to area differences or count variation. This option is
* commonly used when visualizing densities.
*/
normalizationField?: string | null;
/**
* An [Arcade](https://developers.arcgis.com/javascript/latest/arcade/) expression following
* the specification defined by the [Arcade Visualization Profile](https://developers.arcgis.com/javascript/latest/arcade/#visualization).
* Expressions may reference field values using the `$feature` profile variable and must return
* a number. This property overrides the `field` property and therefore is used instead of an input `field` value.
* The `view` parameter is required if specifying a `valueExpression`. When using a `valueExpression`, client-side
* statistics are calculated based on the features in the view's extent. To generate statistics for the entire layer,
* set an equivalent `sqlExpression`.
*/
valueExpression?: string | null;
/**
* Text describing the value returned from the `valueExpression`.
* This is used by the [Legend](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-legend/).
*/
valueExpressionTitle?: string | null;
/**
* A SQL expression evaluating to a number. When provided, statistics are
* queried from the server for the entire layer. Only use this parameter when generating a renderer based on
* an equivalent `valueExpression`. This parameter is ignored for client-side layer types.
*/
sqlExpression?: string | null;
/**
* A SQL where clause used to filter features for the statistics query. For example,
* this is useful in situations where you want to avoid dividing by zero as is the case with creating a predominance
* visualization.
*/
sqlWhere?: string | null;
/**
* When defined, only features included in the filter
* are considered in the attribute and spatial statistics calculations when determining the final renderer.
* This is useful when a lot of variation exists in the data
* that could result in undesired data ranges. A common use case would be to set a filter that only
* includes features in the current extent of the view where the data is most likely to be viewed. Currently, only
* geometry filters with an `intersects` spatial relationship are supported. All other filter types (including `where`) are ignored.
*
* @since 4.31
*/
filter?: FeatureFilter | null;
/**
* Provides options for setting a title to a field when an expression is provided
* instead of a field name. This title will represent the field in the [Legend](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-legend/).
*/
legendOptions?: IVisualVariableLegendOptions | null;
/**
* A statistics object generated from the [summaryStatistics](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/statistics/summaryStatistics/) function.
* If statistics for the field have already been generated, then pass the object here to avoid making a second statistics
* query to the server.
*/
statistics?: SummaryStatisticsResult | null;
/**
* A custom minimum value set by the user. Use this in conjunction with `maxValue` to
* generate statistics between lower and upper bounds. This will be the lowest stop in the returned visual variable.
*/
minValue?: number | null;
/**
* A custom maximum value set by the user. Use this in conjunction with `minValue` to
* generate statistics between lower and upper bounds. This will be the uppermost stop in the returned visual variable.
*/
maxValue?: number | null;
/**
* Indicates whether the generated renderer is for a binning or clustering visualization.
* If `true`, then the input field(s) in this method should refer to [aggregate fields](https://developers.arcgis.com/javascript/latest/references/core/layers/support/AggregateField/) defined in the `featureReduction` property of the layer.
*/
forBinning?: boolean | null;
/**
* A [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/) or [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/)
* instance is required when a `valueExpression` is specified.
*/
view?: MapViewOrSceneView | null;
}
/**
* The result object of the [createVisualVariable()](https://developers.arcgis.com/javascript/latest/references/core/smartMapping/renderers/opacity/#createVisualVariable) method. See the table
* below for details of each property.
*/
export interface VisualVariableResult {
/**
* An opacity visual
* variable configured based on the statistics of the data.
*/
visualVariable: OpacityVariable;
/**
* Indicates whether default values are used in the absence of sufficient
* data and/or statistics from the layer. Default values are typically used when all features have the same field
* value or no value at all.
*/
defaultValuesUsed: boolean;
/** Basic statistics returned from a query to the service for the given field or expression. */
statistics: SummaryStatisticsResult;
/**
* Authoring information related to the creation of the visual variable.
* This includes information related to UI inputs from sliders and selected themes.
*/
authoringInfo: AuthoringInfo;
}