UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

832 lines (829 loc) 57.9 kB
import type Point from "../../geometry/Point.js"; import type SpatialReference from "../../geometry/SpatialReference.js"; import type GeographicTransformation from "../../geometry/operators/support/GeographicTransformation.js"; import type QuantizationParameters from "./QuantizationParameters.js"; import type StatisticDefinition from "./StatisticDefinition.js"; import type TimeExtent from "../../time/TimeExtent.js"; import type { JSONSupport } from "../../core/JSONSupport.js"; import type { GeometryUnion } from "../../geometry/types.js"; import type { DatumTransformation, SQLFormat } from "../../portal/jsonTypes.js"; import type { ObjectId } from "../../views/types.js"; import type { MeshProperties } from "../../geometry/Mesh.js"; import type { PolylineProperties } from "../../geometry/Polyline.js"; import type { PolygonProperties } from "../../geometry/Polygon.js"; import type { PointProperties } from "../../geometry/Point.js"; import type { MultipointProperties } from "../../geometry/Multipoint.js"; import type { ExtentProperties } from "../../geometry/Extent.js"; import type { SpatialReferenceProperties } from "../../geometry/SpatialReference.js"; import type { StatisticDefinitionProperties } from "./StatisticDefinition.js"; import type { QuantizationParametersProperties } from "./QuantizationParameters.js"; import type { TimeExtentProperties } from "../../time/TimeExtent.js"; export interface QueryProperties extends Partial<Pick<Query, "aggregateIds" | "cacheHint" | "datumTransformation" | "distance" | "gdbVersion" | "geometryPrecision" | "groupByFieldsForStatistics" | "having" | "maxAllowableOffset" | "maxRecordCountFactor" | "multipatchOption" | "num" | "objectIds" | "orderByFields" | "outFields" | "parameterValues" | "rangeValues" | "relationParameter" | "returnCentroid" | "returnDistinctValues" | "returnExceededLimitFeatures" | "returnGeometry" | "returnM" | "returnQueryGeometry" | "returnTrueCurves" | "returnZ" | "spatialRelationship" | "sqlFormat" | "start" | "text" | "units" | "where">> { /** * The geometry to apply to the spatial filter. The [spatialRelationship](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#spatialRelationship) * will indicate how the geometry should be used to query features. * * > [!WARNING] * > * > **Known Limitations** * > * > [Mesh](https://developers.arcgis.com/javascript/latest/references/core/geometry/Mesh/) geometry types are currently not supported. */ geometry?: ((ExtentProperties & { type: "extent" }) | (MultipointProperties & { type: "multipoint" }) | (PointProperties & { type: "point" }) | (PolygonProperties & { type: "polygon" }) | (PolylineProperties & { type: "polyline" }) | (MeshProperties & { type: "mesh" })) | null; /** * The historic moment to query. This parameter applies only if the `supportsQueryWithHistoricMoment` * capability of the service being queried is `true`. This setting is provided in the layer resource. */ historicMoment?: (Date | number | string) | null; /** * The spatial reference for the returned geometry. If not specified, the geometry is returned in the spatial * reference of the queried layer. */ outSpatialReference?: SpatialReferenceProperties | null; /** * The definitions for one or more field-based statistics to be calculated. If `outStatistics` is specified the only other query parameters * that should be used are [groupByFieldsForStatistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#groupByFieldsForStatistics), [orderByFields](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#orderByFields), [returnDistinctValues](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnDistinctValues), * [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry), [text](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#text), [timeExtent](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#timeExtent) and [where](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#where). * * > [!WARNING] * > * > **Known Limitations** * > * > For service-based queries, `outStatistics` is only supported on layers where `supportsStatistics = true`. * * @example * let query = new Query(); * let statisticDefinition = new StatisticDefinition({ * statisticType: "sum", * onStatisticField: "POP2000", * outStatisticFieldName: "TotalPop" * }); * * query.outStatistics = [ statisticDefinition ]; */ outStatistics?: StatisticDefinitionProperties[] | null; /** * Specifies the pixel level to be identified on the X and Y axis. Defaults to the base resolution of the * dataset if not specified. Applicable only to Image Service layers. */ pixelSize?: PointProperties | null; /** * Used to project the geometry onto a virtual grid, likely representing * pixels on the screen. Geometry coordinates are converted to integers * by building a grid with a resolution matching the `quantizationParameters.tolerance`. * Each coordinate is then snapped to one pixel on the grid. * * > [!WARNING] * > * > **Known Limitations** * > * > Only supported with ArcGIS Online hosted services or ArcGIS Enterprise 10.6.1 services. * * @example * let query = new Query(); * query.quantizationParameters = { * mode: "view", * originPosition: "upper-left", * tolerance: 4820, * extent: layer.fullExtent * }; */ quantizationParameters?: QuantizationParametersProperties | null; /** * A time extent for a temporal query against [time-aware layers](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#timeInfo). * For example, it can be used to discover all crimes that occurred during the * night shift from 10 PM to 6 AM on a particular date. * * @example * let layer = new FeatureLayer( ... ); * let timeExtent = new TimeExtent({ * start: new Date(1992, 0, 1), * end: new Date(1992, 11, 31) * }); * let timeQuery = new Query({ * timeExtent: timeExtent * }); * layerView.queryFeatures(timeQuery).then(function(featureSet) { ... }); */ timeExtent?: TimeExtentProperties | null; } /** * Range value to filter features from the layer that are within the specified range values. * * @see [rangeValues](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#rangeValues) */ export interface RangeValue { /** The range id. */ name: string; /** Single value or value range. */ value: number | [ number, number ]; } /** * * [Attribute queries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#attribute) * * [Numbers and strings](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#number-string-query) * * [Date and times](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#date-query) * * [Spatial queries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#spatial) * * [Temporal queries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#temporal) * * [Statistic queries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#statistic) * * This class defines parameters for executing queries for features from a layer or layer view. * Once a Query object's properties are defined, it can then be passed into an executable function, which will * return the features in a [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/). * * There are three types of queries: attribute, spatial, and statistic queries. You can query for features * in one of these categories or use elements of each in a single query. * * <span id="attribute"></span> * ## Attribute queries * * <span id="number-string-query"></span> * #### Number and strings * To query features based on attribute values, specify a SQL where clause in the [where](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#where) property. * You can optionally use the [text](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#text) property for a `LIKE` statement. Setting the [outFields](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outFields) * of the query will limit the attributes returned from the query. This can improve the speed of the query * if your app doesn't require all the attributes for each feature. * * For example, you can use [where](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#where) to query all counties in the state of Washington * from a layer representing U.S. Counties: * * ```js * const query = featureLayer.createQuery(); * query.where = "STATE_NAME = 'Washington'"; * query.outFields = [ "STATE_NAME", "COUNTY_NAME", "POPULATION", "(POPULATION / AREA) as 'POP_DENSITY'" ]; * * // To return a feature set containing the attributes: STATE_NAME, COUNTY_NAME, POPULATION, and POP_DENSITY. * const featureSet = await featureLayer.queryFeatures(query) * ``` * <span id="date-query"></span> * #### Date and times * * When querying features based on `date`, `date-only`, `time-only` and `timestamp-offset` field types * the `DATE`, `TIMESTAMP` or `TIME` SQL functions should be used to make sure the query returns correct results. * The following snippets demonstrate how the date functions can be constructed with the functions mentioned above. * * ```js * <DateField> = DATE 'YYYY-MM-DD' * <DateField> = TIMESTAMP 'YYYY-MM-DD HH:MI:SS' * <DateOnlyField> = DATE 'YYYY-MM-DD' * <TimeOnlyField> = TIME 'HH:MM:SS' * <TimestampOffsetField> = TIMESTAMP 'YYYY-MM-DD HH:MI:SS +/-UTC offset' * ``` * * Date values are stored as epoch values in `date` field. Epoch time describes a point in time as the number * of seconds since `00:00:00 Thursday, 1 January 1970 (UTC)`. * A `date` field can be associated with a specific time zone. When querying values from a date field, you may need to convert dates to match the time zone of the field. * Use the [FieldsIndex.getTimeZone()](https://developers.arcgis.com/javascript/latest/references/core/layers/support/FieldsIndex/#getTimeZone) method to identify the time zone of a date field. * For example, if your service has two date fields, one in `America/Los_Angeles` and the other in `America/New_York`, then date queries need to be crafted specifically for each field. * If the desired query date is `01/01/2012 11:20:00 PM GMT` then the resulting query could be: * * `query.where = "DateTime_PST = TIMESTAMP '2012-01-01 15:20:00"`, or * * `query.where = "DateTime_EST = TIMESTAMP '2012-01-01 18:20:00"`. * * ```js * // Query for features that recorded on January 1, 2012 9:00:00 AM GMT * // DateTime_PST date field values are in PST. Must adjust the epoch values to PST * * const queryDate = new Date(1325408400000); // 01/01/2012 9:00:00 AM GMT * let queryFields = ["DateTime_PST"]; * * // get the timezone of the DateTime_PST date field * const fieldTimeZone = layer.fieldsIndex.getTimeZone("DateTime_PST") ; * * // we need to adjust the date value to match the time zone of the field. * const where = `DateTime_PST < DATE '${getDateForTimeZone(queryDate, fieldTimeZone)}'` * layerView.filter = new FeatureFilter({ * where * }); * runQueries(where, queryFields); * * // This function conveniently formats a dates in terms of the parsed time zone. * function getDateForTimeZone(queryDate, timezone) { * * // adjust the given date field to the timezone of the date field * const zonedDate = new Date( * queryDate.toLocaleString("en-US", { * timeZone: timezone * }) * ); * const pad = (value) => String(value).padStart(2, "0"); * const month = pad(zonedDate.getMonth() + 1); * const day = pad(zonedDate.getDate()) * const year = zonedDate.getFullYear(); * const hour = pad(zonedDate.getHours()); * const minutes = pad(zonedDate.getMinutes()); * const seconds = pad(zonedDate.getSeconds()); * * return `${year}-${month}-${day} ${hour}:${minutes}:${seconds}`; * } * ``` * * Please refer to [Querying Feature Services: Date-Time Queries](https://www.esri.com/arcgis-blog/products/api-rest/data-management/querying-feature-services-date-time-queries/) and * [REST API - Date-time queries](https://developers.arcgis.com/rest/services-reference/enterprise/query-feature-service-layer/#date-time-queries) documents * to learn more about how to query date-time values. * * <span id="spatial"></span> * ## Spatial queries * * You can query features by geometry/location. While [where](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#where) is not required in this * workflow, you can use `where` as part of the query to get more refined results. * * To execute a spatial query, you must set the [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry) parameter to a * [Geometry](https://developers.arcgis.com/javascript/latest/references/core/geometry/Geometry/) object and specify a valid [spatialRelationship](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#spatialRelationship). * You can optionally provide a query [distance](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#distance) and [units](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#units) to query features against a buffer * around the given geometry. * * For example, to query for all features within 2 miles of a mouse move, you would do the following: * * ```js * view.on("pointer-move", async (event) => { * const query = featureLayer.createQuery(); * query.geometry = view.toMap(event); // the point location of the pointer * query.distance = 2; * query.units = "miles"; * query.spatialRelationship = "intersects"; // this is the default * query.returnGeometry = true; * query.outFields = ["POPULATION"]; * * // The following line returns features within two miles of the pointer's location * const { features } = await featureLayer.queryFeatures(query); * }); * ``` * * You could also use `where`, for example, to return all features with a population greater than 10,000 within * the 2-mile buffer. * * > [!WARNING] * > * > **Known Limitations** * > * > For client side spatial queries on 3D Object SceneLayerView the [Extent](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/) of the feature * > is used when evaluating the spatial relationship with the [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry). This means that a feature might be * > returned from the query, even though its footprint is not in a spatial relationship with the [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry). * * <span id="temporal"></span> * ## Temporal queries * * You can query features based on a given time range by specifying the [timeExtent](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#timeExtent) property. The temporal query will return * results only if the feature service is published with [FeatureLayer.timeInfo](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#timeInfo) information. The temporal * query can also be combined with attribute and geometry queries. * * For example, you can use [timeExtent](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#timeExtent) and [where](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#where) parameters to query specified hurricane tracks * within a given time extent. * * ```js * // query katrina tracks that took place in Aug 30 - Aug 31, 2005 * const query = new Query({ * outFields: ["Name, WindSpeed"], * where: "Name = 'Katrina'", * timeExtent: { * start: new Date(2005, 7, 30), * end: new Date(2005, 7, 31) * } * }); * const { features } = await featureLayer.queryFeatures(query); * ``` * * <span id="statistic"></span> * ## Statistic queries * * Rather than return individual features from a query, you can return statistics * for field attributes and expressions. Statistic queries are defined by the [outStatistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outStatistics) * parameter, which requires an array of [StatisticDefinition](https://developers.arcgis.com/javascript/latest/references/core/rest/support/StatisticDefinition/) objects. * * For example, you can query for the average and total population of counties in the layer mentioned above * in the following manner: * * ```js * * // query for the sum of the population in all features * const sumPopulation = { * onStatisticField: "POP_2015", // service field for 2015 population * outStatisticFieldName: "Pop_2015_sum", * statisticType: "sum" * }; * * // query for the average population in all features * const avgPopulation = { * onStatisticField: "POP_2015", // service field for 2015 population * outStatisticFieldName: "Pop_2015_avg", * statisticType: "avg" * }; * * // Notice that you can pass a SQL expression as a field name to calculate statistics * const populationChangeDefinition = { * onStatisticField: "POP_2015 - POP_2010", // service field for 2015 population * outStatisticFieldName: "avg_pop_change_2015_2010", * statisticType: "avg" * }; * * const query = layer.createQuery(); * query.where = "STATE_NAME = 'Washington'"; * query.outStatistics = [sumPopulation, avgPopulation, populationChangeDefinition]; * * const { feature } = await featureLayer.queryFeatures(query); * const { attributes } = features[0]; * * console.log(`The total population in WA is ${attributes.Pop_2015_sum}`); * console.log(`The average population in WA counties is ${attributes.Pop_2015_avg}`); * console.log(`The average population change in WA counties is ${attributes.avg_pop_change_2015_2010}`); * ``` * * <span id="working-with-results"></span> * ## Working with results * * Query results can be used in a number of ways depending on the use case. Consider the following * parameters which impact the format of the resulting feature set. * * * [returnGeometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnGeometry) - Returning a geometry is useful for displaying results back * in the view as graphics, or for conducting further spatial analysis. If the geometry isn't necessary * in your workflow, then don't request it to improve app performance. * * [outStatistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outStatistics) - Querying for statistics will never return features from the layer, * only an object with number properties for the requested statistics. * * [returnDistinctValues](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnDistinctValues) - Returns the unique values that exist in a field as an * array of strings, so no features are returned when this parameter is true. * * > [!WARNING] * > * > The fields in the query needs to be available and listed in the [FeatureLayerView.availableFields](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLayerView/#availableFields) or [SceneLayerView.availableFields](https://developers.arcgis.com/javascript/latest/references/core/views/layers/SceneLayerView/#availableFields). * > Define them either in [FeatureLayer.outFields](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#outFields) or [SceneLayer.outFields](https://developers.arcgis.com/javascript/latest/references/core/layers/SceneLayer/#outFields). * * @since 4.20 * @see [FeatureLayer.createQuery()](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#createQuery) * @see [FeatureLayer.queryFeatures()](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#queryFeatures) * @see [FeatureLayerView.queryFeatures()](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLayerView/#queryFeatures) * @see [CSVLayer.queryFeatures()](https://developers.arcgis.com/javascript/latest/references/core/layers/CSVLayer/#queryFeatures) * @see [SceneLayer.queryFeatures()](https://developers.arcgis.com/javascript/latest/references/core/layers/SceneLayer/#queryFeatures) * @see [SceneLayerView.queryFeatures()](https://developers.arcgis.com/javascript/latest/references/core/views/layers/SceneLayerView/#queryFeatures) * @see [Query and filter guide](https://developers.arcgis.com/javascript/latest/query-filter/) * @see [Sample - Query statistics client-side by distance](https://developers.arcgis.com/javascript/latest/sample-code/featurelayerview-query-distance/) * @see [Sample - Query statistics by geometry](https://developers.arcgis.com/javascript/latest/sample-code/featurelayerview-query-geometry/) * @see [Sample - Query statistics client-side](https://developers.arcgis.com/javascript/latest/sample-code/featurelayerview-query-stats/) * @see [query](https://developers.arcgis.com/javascript/latest/references/core/rest/query/) */ export default class Query extends JSONSupport { constructor(properties?: QueryProperties); /** * An array of Object IDs representing [aggregate](https://developers.arcgis.com/javascript/latest/references/core/Graphic/#isAggregate) (i.e. cluster) graphics. This property should be used to query features represented * by one or more cluster graphics with the given Object IDs. * * This is useful in the following scenarios: * * - To display features included in the cluster as a collection of graphics. * - To push clustered features to the view's popup for browsing. * - To display statistics of features included in the cluster in the popup. * * > [!WARNING] * > * > **Known Limitations** * > * > This property only applies to [LayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/LayerView/) query methods. Support for server-side * > queries is being considered for a future release. * * @example * // Will execute query for features represented by the clusterGraphic * if (clusterGraphic.isAggregate) { * query.aggregateIds = [clusterGraphic.getObjectId()]; * } */ accessor aggregateIds: ObjectId[] | null | undefined; /** * Indicates if the service should cache the query results. It only applies if the layer's * [capabilities.query.supportsCacheHint](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#capabilities) is set to `true`. * Use only for queries that have the same parameters every time the app is used. * Some examples of cacheable queries: * * Queries that fetch [statistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outStatistics) or [features](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnGeometry) on app load. * * Queries based on [preset input](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#where), for example, a drop-down list of US states. * * Queries based on [preset extents](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry), for example bookmarks, in web maps. */ accessor cacheHint: boolean | null | undefined; /** * Datum transformation used for projecting geometries in the query results when * [outSpatialReference](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outSpatialReference) is different from the layer's spatial reference. * Requires ArcGIS Server service 10.5 or greater. */ accessor datumTransformation: DatumTransformation | GeographicTransformation | null | undefined; /** * Specifies a search distance from a given [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry) in a spatial query. * The [units property](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#units) indicates the unit of measurement. In essence, setting this property * creates a buffer at the specified size around the input [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry). The query will use that * buffer to return features in the layer or layer view that adhere to the to the indicated [spatial relationship](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#spatialRelationship). * * If querying a feature service, the [supportsQueryWithDistance](https://developers.arcgis.com/rest/services-reference/query-feature-service-layer-.htm) * capability must be `true`. */ accessor distance: number | null | undefined; /** Specifies the geodatabase version to display for feature service queries. */ accessor gdbVersion: string | null | undefined; /** * The geometry to apply to the spatial filter. The [spatialRelationship](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#spatialRelationship) * will indicate how the geometry should be used to query features. * * > [!WARNING] * > * > **Known Limitations** * > * > [Mesh](https://developers.arcgis.com/javascript/latest/references/core/geometry/Mesh/) geometry types are currently not supported. */ get geometry(): GeometryUnion | null | undefined; set geometry(value: ((ExtentProperties & { type: "extent" }) | (MultipointProperties & { type: "multipoint" }) | (PointProperties & { type: "point" }) | (PolygonProperties & { type: "polygon" }) | (PolylineProperties & { type: "polyline" }) | (MeshProperties & { type: "mesh" })) | null | undefined); /** Specifies the number of decimal places for geometries returned by the [JSON query operation](https://developers.arcgis.com/javascript/latest/references/core/rest/query/#executeQueryJSON). */ accessor geometryPrecision: number | null | undefined; /** * Used only in [statistical queries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#statistic). When one or more field names are provided in this property, the output * statistics will be grouped based on unique values from those fields. This is only valid when * [outStatistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outStatistics) has been defined. * * @example * query.outStatistics = [{ * onStatisticField: "CUSTOMERS", * outStatisticFieldName: "avg_customers", * statisticType: "avg" * }, { * onStatisticField: "RATING", * outStatisticFieldName: "min_rating", * statisticType: "min" * }, { * onStatisticField: "1=1", * outStatisticFieldName: "total_businesses", * statisticType: "count" * }]; * query.groupByFieldsForStatistics = [ "region" ]; * * // query the above stats for each region in the layer * layer.queryFeatures(query).then(displayResults); */ accessor groupByFieldsForStatistics: string[] | null | undefined; /** * A condition used with [outStatistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outStatistics) and [groupByFieldsForStatistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#groupByFieldsForStatistics) * to limit query results to groups that * satisfy the aggregation function(s). * * The following aggregation functions are supported in this clause: `MIN` | `MAX` | `AVG` | `SUM` | `STDDEV` | `COUNT` | `VAR` * * Aggregation functions used in `having` must be included in the `outStatistics` as well. See the snippet below for an example * of how this works. * * For service-based layer queries, this parameter applies only if the [supportsHavingClause](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#capabilities) property of the layer is `true`. * This property is supported on all [LayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/LayerView/) queries. * * @see [ArcGIS Blog - Querying Feature Services: Having Clause](https://www.esri.com/arcgis-blog/products/api-rest/data-management/querying-feature-services-having-clause/) * @see [ArcGIS REST API documentation](https://developers.arcgis.com/rest/services-reference/query-feature-service-layer-.htm) * @example * query.outStatistics = [{ * onStatisticField: "CUSTOMERS", * outStatisticFieldName: "avg_customers", * statisticType: "avg" * }, { * onStatisticField: "RATING", * outStatisticFieldName: "min_rating", * statisticType: "min" * }, { * onStatisticField: "1=1", * outStatisticFieldName: "total_businesses", * statisticType: "count" * }]; * query.groupByFieldsForStatistics = [ "region" ]; * query.having = "AVG(CUSTOMERS) >= 1,000 AND MIN(RATING) >= 3"; * * // query the above stats for all regions where * // the average number of daily customers per business is * // greater than 1,000 and the minimum customer rating * // for a business within the region is 3 * layer.queryFeatures(query).then(displayResults); */ accessor having: string | null | undefined; /** * The historic moment to query. This parameter applies only if the `supportsQueryWithHistoricMoment` * capability of the service being queried is `true`. This setting is provided in the layer resource. */ get historicMoment(): Date | null | undefined; set historicMoment(value: (Date | number | string) | null | undefined); /** * The maximum distance in units of [outSpatialReference](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outSpatialReference) used for * generalizing geometries returned by the query operation. It limits how far any part of the * generalized geometry can be from the original geometry. If `outSpatialReference` is not defined, * the spatialReference of the data is used. * * > [!WARNING] * > * > **Known Limitations** * > * > This property does not apply to [LayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/LayerView/) or [CSVLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/CSVLayer/) queries. */ accessor maxAllowableOffset: number | null | undefined; /** * When set, the maximum number of features returned by the query will equal the * `maxRecordCount` of the service multiplied by this factor. The value of this * property may not exceed `5`. * * For example, if the `maxRecordCount` of your feature service is `2000`, and you set * the `maxRecordCountFactor` to `5`, then the maximum number of features that could be * returned by the query is `10000`. * * > [!WARNING] * > * > **Known Limitations** * > * > Only supported with ArcGIS Online hosted services or ArcGIS Enterprise 10.6 services and higher. * * @default 1 */ accessor maxRecordCountFactor: number; /** * Parameter dictates how the geometry of a multipatch feature will be returned. * Currently, the only supported value is `xyFootprint`. If indicated, the xy footprint of each multipatch geometry will be * returned in the result. * * @example * // url to the layer of interest to query * const queryUrl = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Notes/FeatureServer/0"; * * const queryObject = new Query({ * objectIds: [22], * multipatchOption: "xyFootprint", * outFields: ["*"], * returnGeometry: true * }); * * // call the executeQueryJSON() method * query.executeQueryJSON(queryUrl, queryObject).then(function(results){ * // results.graphics contains the graphics returned from query * }); */ accessor multipatchOption: "xyFootprint" | null | undefined; /** * The number of features to retrieve. This option should be used in conjunction with the [start property](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#start). Use this to * implement paging (i.e. to retrieve "pages" of results when querying). * * If not provided, but an instance of Query has a `start` property, then the default value of `num` is 10. * If neither `num` nor `start` properties are provided, then the default value of `num` is equal to the * `maxRecordCount` of the service, which can be found at the REST endpoint of the FeatureLayer. */ accessor num: number | null | undefined; /** An array of ObjectIDs to be used to query for features in a layer. */ accessor objectIds: ObjectId[] | null | undefined; /** * One or more field names used to order the query results. Specify `ASC` (ascending) or `DESC` * (descending) after the field name to control the order. The default order is `ASC`. * * > [!WARNING] * > * > **Known Limitations** * > * > If querying a [MapImageLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/), then `supportsAdvancedQueries` must be `true` on the service. * > For [FeatureLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/), `FeatureLayer.capabilities.queryRelated.supportsOrderBy` must be `true`. * * @see [FeatureLayer.capabilities](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#capabilities) * @example query.orderByFields = ["STATE_NAME DESC"]; */ accessor orderByFields: string[] | null | undefined; /** * Attribute fields to include in the [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/). Fields must exist in the service layer. You must list actual * field names rather than field aliases. You may, however, use field aliases when you display * the results of the query. * * When specifying the output fields, you should limit the fields to only those you expect to use in the * query or the results. The fewer fields you include, the smaller the payload size, and therefore the faster the response of the query. * * You can also specify SQL expressions as `outFields` to calculate new values server side for the query results. See the * example snippets below for an example of this. * * Each query must have access to the `Shape` and `ObjectId` fields for a layer. However, the list of outFields does * not need to include these two fields. * * > [!WARNING] * > * > **Known Limitations** * > * > If specifying outFields as expressions on a feature service-based [FeatureLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/), the service capabilities * > `advancedQueryCapabilities.supportsOutFieldSQLExpression` and `useStandardizedQueries` must both be true. * * @example * // query for field attributes * query.outFields = [ "NAME", "STATE_ABBR", "POP04" ]; * @example * // query for data returned from an expressions and other fields as the following field names * // POP_CHANGE_2020, NAME, POP2020 * // where POP_CHANGE_2020 represents the population change from 2010 - 2020 * query.outFields = [ "( (POP2020 - POP2010) / POP2010 ) * 100 as POP_CHANGE_2020", "NAME", "POP2020" ] */ accessor outFields: string[] | null | undefined; /** * The spatial reference for the returned geometry. If not specified, the geometry is returned in the spatial * reference of the queried layer. */ get outSpatialReference(): SpatialReference | null | undefined; set outSpatialReference(value: SpatialReferenceProperties | null | undefined); /** * The definitions for one or more field-based statistics to be calculated. If `outStatistics` is specified the only other query parameters * that should be used are [groupByFieldsForStatistics](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#groupByFieldsForStatistics), [orderByFields](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#orderByFields), [returnDistinctValues](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnDistinctValues), * [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry), [text](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#text), [timeExtent](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#timeExtent) and [where](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#where). * * > [!WARNING] * > * > **Known Limitations** * > * > For service-based queries, `outStatistics` is only supported on layers where `supportsStatistics = true`. * * @example * let query = new Query(); * let statisticDefinition = new StatisticDefinition({ * statisticType: "sum", * onStatisticField: "POP2000", * outStatisticFieldName: "TotalPop" * }); * * query.outStatistics = [ statisticDefinition ]; */ get outStatistics(): StatisticDefinition[] | null | undefined; set outStatistics(value: StatisticDefinitionProperties[] | null | undefined); /** * Filters features from the layer based on pre-authored parameterized filters. * When value is not specified for any parameter in a request, the default value, * that is assigned during authoring time, gets used. * Requires an ArcGIS Enterprise service 10.5 or greater. This parameter is only supported with * [MapImageLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/) pointing to a [map service](https://enterprise.arcgis.com/en/server/latest/publish-services/windows/what-is-a-map-service.htm). * * @see [ArcGIS Pro - creating a query layer](https://pro.arcgis.com/en/pro-app/latest/help/mapping/layer-properties/creating-a-query-layer.htm) * @see [ArcGIS REST API - query a map service layer](https://developers.arcgis.com/rest/services-reference/enterprise/query-map-service-layer-.htm) */ accessor parameterValues: Record<string, ParameterValueType> | null | undefined; /** * Specifies the pixel level to be identified on the X and Y axis. Defaults to the base resolution of the * dataset if not specified. Applicable only to Image Service layers. */ get pixelSize(): Point | null | undefined; set pixelSize(value: PointProperties | null | undefined); /** * Used to project the geometry onto a virtual grid, likely representing * pixels on the screen. Geometry coordinates are converted to integers * by building a grid with a resolution matching the `quantizationParameters.tolerance`. * Each coordinate is then snapped to one pixel on the grid. * * > [!WARNING] * > * > **Known Limitations** * > * > Only supported with ArcGIS Online hosted services or ArcGIS Enterprise 10.6.1 services. * * @example * let query = new Query(); * query.quantizationParameters = { * mode: "view", * originPosition: "upper-left", * tolerance: 4820, * extent: layer.fullExtent * }; */ get quantizationParameters(): QuantizationParameters | null | undefined; set quantizationParameters(value: QuantizationParametersProperties | null | undefined); /** * Filters features from the layer that are within the specified range values. * Requires ArcGIS Enterprise services 10.5 or greater. This parameter is only supported with * [MapImageLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/) pointing to a [map service](https://enterprise.arcgis.com/en/server/latest/publish-services/windows/what-is-a-map-service.htm). * * @see [ArcGIS Pro - creating a query layer](https://pro.arcgis.com/en/pro-app/latest/help/mapping/layer-properties/creating-a-query-layer.htm) * @see [ArcGIS REST API - query a map service layer](https://developers.arcgis.com/rest/services-reference/enterprise/query-map-service-layer-.htm) */ accessor rangeValues: RangeValue[] | null | undefined; /** * The Dimensionally Extended 9 Intersection Model (DE-9IM) matrix relation (encoded as a string) to query * the spatial relationship of the input [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry) to the layer's features. This * string contains the test result of each intersection represented in the DE-9IM matrix. Each result is * one character of the string and may be represented as either a number (maximum dimension returned: 0,1,2), * a Boolean value (T or F), or a mask character (for ignoring results: '*'). * * Set this parameter when the [spatialRelationship](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#spatialRelationship) is `relation`. * The [Relational functions for ST_Geometry](https://pro.arcgis.com/en/pro-app/latest/help/data/databases/pdf/stgeometry_reference.pdf) topic has additional details * on how to construct these strings. * * > [!WARNING] * > * > **Known Limitations** * > * > This property does not apply to layer view or [CSVLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/CSVLayer/) queries. * * @example * let query = new Query({ * relationParameter: "FFFTTT***" * }); */ accessor relationParameter: string | null | undefined; /** * If `true`, each feature in the returned [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/) will be returned with a centroid. * This property only applies to queries against polygon [FeatureLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/). * * > [!WARNING] * > * > **Known Limitations** * > * > Only supported with ArcGIS Online hosted services or ArcGIS Enterprise 10.6.1 services. * * @default false */ accessor returnCentroid: boolean; /** * If `true` then the query returns distinct values based on the field(s) specified in [outFields](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outFields). * * > [!WARNING] * > * > **Known Limitations** * > * > For service-based queries, this parameter applies only if the `supportsAdvancedQueries` capability of the layer is `true`. * > Make sure to set [returnGeometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnGeometry) to `false` when `returnDistinctValues` is true. Otherwise, reliable results will not be returned. * * @default false */ accessor returnDistinctValues: boolean; /** * If `true`, then all features are returned for each tile request, even if they exceed the * maximum record limit per query indicated on the service by `maxRecordCount`. If `false`, the * tile request will not return any features if the `maxRecordCount` limit is exceeded. * * > [!WARNING] * > * > **Known Limitations** * > * > Only supported with ArcGIS Online hosted services or ArcGIS Enterprise 10.6 services and higher. * * @default true */ accessor returnExceededLimitFeatures: boolean; /** * If `true`, each feature in the returned [FeatureSet](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/) includes the geometry. * * > [!WARNING] * > * > **Known Limitations** * > * > For [FeatureLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLayerView/) queries, the precision of the returned geometries will only be * > as high as the view's scale resolution since geometries are quantized for improved performance on the view. * > The smaller the scale, the lower the resolution of the geometries. * > * > This limitation does not apply to [FeatureLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/), [CSVLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/CSVLayer/), * > and [CSVLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/CSVLayerView/) queries. * * @default false */ accessor returnGeometry: boolean; /** If `true`, and [returnGeometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnGeometry) is `true`, then m-values are included in the geometry. */ accessor returnM: boolean | null | undefined; /** * If `true`, the [query geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/FeatureSet/#queryGeometry) will be returned with the query results. * It is useful for getting the buffer geometry generated when querying features by [distance](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#distance) * or getting the query geometry projected in the [outSpatialReference](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#outSpatialReference) of the query. * The query geometry is returned only for [client-side queries](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLayerView/#queryFeatures) * and [hosted feature services](https://doc.arcgis.com/en/arcgis-online/share-maps/hosted-web-layers.htm) * and if the layer's [capabilities.query.supportsQueryGeometry](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#capabilities) * is `true`. * * @default false */ accessor returnQueryGeometry: boolean; /** * When `true` output geometry will include curves. If `false`, curves (if any) will be converted to * densified polylines or polygons. * * This option only applies when [returnGeometry](#returnGeometry) is set to `true` and the output geometry is * non-quantized polylines or polygons. * * @since 5.0 * @see [ArcGIS REST API | Query Feature Service/Layer | returnTrueCurves](https://developers.arcgis.com/rest/services-reference/enterprise/query-feature-service-layer/#:~:text=returntruecurves) */ accessor returnTrueCurves: boolean | null | undefined; /** * If `true`, and [returnGeometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#returnGeometry) is `true`, then z-values are included in the geometry. * * > [!WARNING] * > * > **Known Limitations** * > * > [FeatureLayerView.queryFeatures()](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLayerView/#queryFeatures), * > [GeoJSONLayerView#queryFeatures](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#queryFeatures), and * > [OGCFeatureLayerView#queryFeatures](https://developers.arcgis.com/javascript/latest/references/core/views/layers/FeatureLikeLayerView/#queryFeatures) results do not * > include the z-values when called in [2D MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/) even if `returnZ` is set to `true`. */ accessor returnZ: boolean | null | undefined; /** * For spatial queries, this parameter defines the spatial relationship to query features in the layer or layer view against the input [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry). * The spatial relationships discover how features are spatially related to each other. * For example, you may want to know if a polygon representing a county completely contains points representing settlements. * * The spatial relationship is determined by whether the boundaries or interiors of a geometry intersect. * * Boundary — The endpoints of all linear parts for line features, or the linear outline of a polygon. Only lines and polygons have boundaries. * * Interior — Points are entirely interior and have no boundary. For lines and polygons, the interior is any part of the geometry that is not part of the boundary. * * The possible values for this parameter are described below and the images highlight the geometries returned for the specified spatial * relationship for given geometries. * * The `intersects` spatial relationship returns features in the layer view that intersect the query [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry). * * ![intersects](https://developers.arcgis.com/javascript/latest/assets/img/apiref/layers/spatialRelationships/intersects.png) * * The `contains` spatial relationship returns features in the layer view that are completely contained by the query [geometry](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/#geometry). * * ![c