@esri/arcgis-rest-feature-service
Version:
Feature layer query and edit helpers for @esri/arcgis-rest-js
193 lines • 7.21 kB
JavaScript
;
/* Copyright (c) 2017-2018 Environmental Systems Research Institute, Inc.
* Apache-2.0 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.queryAllFeatures = exports.queryFeatures = exports.getFeature = void 0;
const arcgis_rest_request_1 = require("@esri/arcgis-rest-request");
/**
* Get a feature by id.
*
* ```js
* import { getFeature } from '@esri/arcgis-rest-feature-service';
*
* const url = "https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/Landscape_Trees/FeatureServer/0";
*
* getFeature({
* url,
* id: 42
* }).then(feature => {
* console.log(feature.attributes.FID); // 42
* });
* ```
*
* @param requestOptions - Options for the request
* @returns A Promise that will resolve with the feature or the [response](https://developer.mozilla.org/en-US/docs/Web/API/Response) itself if `rawResponse: true` was passed in.
*/
function getFeature(requestOptions) {
const url = `${(0, arcgis_rest_request_1.cleanUrl)(requestOptions.url)}/${requestOptions.id}`;
// default to a GET request
const options = Object.assign({ httpMethod: "GET" }, requestOptions);
return (0, arcgis_rest_request_1.request)(url, options).then((response) => {
if (options.rawResponse) {
return response;
}
return response.feature;
});
}
exports.getFeature = getFeature;
/**
* Query a feature service. See [REST Documentation](https://developers.arcgis.com/rest/services-reference/query-feature-service-layer-.htm) for more information.
*
* ```js
* import { queryFeatures } from '@esri/arcgis-rest-feature-service';
*
* queryFeatures({
* url: "http://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3",
* where: "STATE_NAME = 'Alaska'"
* })
* .then(result)
* ```
*
* @param requestOptions - Options for the request
* @returns A Promise that will resolve with the query response.
*/
function queryFeatures(requestOptions) {
const queryOptions = (0, arcgis_rest_request_1.appendCustomParams)(requestOptions, [
"where",
"objectIds",
"relationParam",
"time",
"distance",
"units",
"outFields",
"geometry",
"geometryType",
"spatialRel",
"returnGeometry",
"maxAllowableOffset",
"geometryPrecision",
"inSR",
"outSR",
"gdbVersion",
"returnDistinctValues",
"returnIdsOnly",
"returnCountOnly",
"returnExtentOnly",
"orderByFields",
"groupByFieldsForStatistics",
"outStatistics",
"returnZ",
"returnM",
"multipatchOption",
"resultOffset",
"resultRecordCount",
"quantizationParameters",
"returnCentroid",
"resultType",
"historicMoment",
"returnTrueCurves",
"sqlFormat",
"returnExceededLimitFeatures",
"f"
], {
httpMethod: "GET",
params: Object.assign({
// set default query parameters
where: "1=1", outFields: "*" }, requestOptions.params)
});
return (0, arcgis_rest_request_1.request)(`${(0, arcgis_rest_request_1.cleanUrl)(requestOptions.url)}/query`, queryOptions);
}
exports.queryFeatures = queryFeatures;
/**
* Query a feature service to retrieve all features. See [REST Documentation](https://developers.arcgis.com/rest/services-reference/query-feature-service-layer-.htm) for more information.
*
* ```js
* import { queryAllFeatures } from '@esri/arcgis-rest-feature-service';
*
* queryAllFeatures({
* url: "http://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3",
* where: "STATE_NAME = 'Alaska'"
* })
* .then(result)
* ```
*
* @param requestOptions - Options for the request
* @returns A Promise that will resolve with the query response.
*/
async function queryAllFeatures(requestOptions) {
var _a, _b;
let offset = 0;
let hasMore = true;
let allFeaturesResponse = null;
// retrieve the maxRecordCount for the service
const pageSizeResponse = await (0, arcgis_rest_request_1.request)(requestOptions.url, {
httpMethod: "GET",
authentication: requestOptions.authentication
});
// default the pageSize to 2000 if it is not provided
const pageSize = pageSizeResponse.maxRecordCount || 2000;
const userRecordCount = (_a = requestOptions.params) === null || _a === void 0 ? void 0 : _a.resultRecordCount;
// use the user defined count only if it's less than or equal to the page size, otherwise use pageSize
const recordCountToUse = userRecordCount && userRecordCount <= pageSize ? userRecordCount : pageSize;
while (hasMore) {
const pagedOptions = Object.assign(Object.assign({}, requestOptions), { params: Object.assign(Object.assign({ where: "1=1", outFields: "*" }, (requestOptions.params || {})), { resultOffset: offset, resultRecordCount: recordCountToUse }) });
const queryOptions = (0, arcgis_rest_request_1.appendCustomParams)(pagedOptions, [
"where",
"objectIds",
"relationParam",
"time",
"distance",
"units",
"outFields",
"geometry",
"geometryType",
"spatialRel",
"returnGeometry",
"maxAllowableOffset",
"geometryPrecision",
"inSR",
"outSR",
"gdbVersion",
"orderByFields",
"groupByFieldsForStatistics",
"outStatistics",
"returnZ",
"returnM",
"multipatchOption",
"resultOffset",
"resultRecordCount",
"quantizationParameters",
"resultType",
"historicMoment",
"returnTrueCurves",
"sqlFormat",
"f"
], {
httpMethod: "GET",
params: Object.assign({ where: "1=1", outFields: "*", returnExceededLimitFeatures: true }, pagedOptions.params)
});
const response = await (0, arcgis_rest_request_1.request)(`${(0, arcgis_rest_request_1.cleanUrl)(requestOptions.url)}/query`, queryOptions);
// save the first response structure
if (!allFeaturesResponse) {
allFeaturesResponse = Object.assign({}, response);
}
else {
// append features of subsequent requests
allFeaturesResponse.features = allFeaturesResponse.features.concat(response.features);
}
const returnedCount = response.features.length;
// check if the response has exceededTransferLimit handles both the standard json and geojson responses
const exceededTransferLimit = response.exceededTransferLimit ||
((_b = response.properties) === null || _b === void 0 ? void 0 : _b.exceededTransferLimit);
// check if there are more features
if (returnedCount < pageSize || !exceededTransferLimit) {
hasMore = false;
}
else {
offset += pageSize;
}
}
return allFeaturesResponse;
}
exports.queryAllFeatures = queryAllFeatures;
//# sourceMappingURL=query.js.map