Skip to content

Commit e5cde6a

Browse files
committed
Rebvased and removed the getFieldType and getFieldDomain overrides for EsriImage that were recently added
1 parent e898c9a commit e5cde6a

File tree

2 files changed

+36
-95
lines changed

2 files changed

+36
-95
lines changed

packages/geoview-core/src/geo/layer/geoview-layers/esri-layer-common.ts

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import type {
2626
TypeMetadataEsriLayerSummary,
2727
TypeMetadataEsriImage,
2828
TypeMosaicRule,
29+
TypeLayerMetadataFields,
2930
} from '@/api/types/layer-schema-types';
3031
import { Fetch } from '@/core/utils/fetch-helper';
3132
import type { ConfigBaseClass } from '@/api/config/validation-classes/config-base-class';
@@ -377,7 +378,7 @@ export class EsriUtilities {
377378
throw new LayerServiceMetadataUnableToFetchError(layerConfig.getGeoviewLayerId(), layerConfig.getLayerName(), formatError(error));
378379
}
379380
} else {
380-
// The layer metadata was alredy queried (same as the service metadata), use that
381+
// In the case of an EsriImage, the layer metadata was already queried (same as the service metadata), use that
381382
layerMetadata = layerConfig.getServiceMetadata()!;
382383
}
383384

@@ -435,7 +436,8 @@ export class EsriUtilities {
435436

436437
// Read variables
437438
const queryable = layerMetadata.capabilities.includes('Query') || layerMetadata.capabilities.includes('Catalog');
438-
const hasFields = !!layerMetadata.fields?.length;
439+
const { fields } = layerMetadata;
440+
const hasFields = !!fields?.length;
439441
const isGroupLayer = layerMetadataEsriDynamicLayer.type === 'Group Layer';
440442
const isMetadataGroup = layerConfig.getIsMetadataLayerGroup();
441443

@@ -444,7 +446,7 @@ export class EsriUtilities {
444446

445447
// Initialize the outfields
446448
// dynamic group layer doesn't have fields definition
447-
if (layerMetadata.fields && !isGroupLayer) {
449+
if (hasFields && !isGroupLayer) {
448450
// Get the outfields
449451
let outfields = layerConfig.getOutfields();
450452

@@ -454,7 +456,7 @@ export class EsriUtilities {
454456
outfields = [];
455457

456458
// Loop
457-
layerMetadata.fields.forEach((fieldEntry) => {
459+
fields.forEach((fieldEntry) => {
458460
// If the field is the geometry field
459461
if (layerMetadataEsriDynamicLayer.geometryField && fieldEntry?.name === layerMetadataEsriDynamicLayer.geometryField?.name) {
460462
// Keep the geometry field for future use
@@ -472,8 +474,8 @@ export class EsriUtilities {
472474
const newOutfield: TypeOutfields = {
473475
name: fieldEntry.name,
474476
alias: fieldEntry.alias || fieldEntry.name,
475-
type: this.esriGetFieldType(layerConfig, fieldEntry.name),
476-
domain: this.esriGetFieldDomain(layerConfig, fieldEntry.name),
477+
type: this.esriGetFieldType(layerConfig, fields, fieldEntry.name),
478+
domain: this.esriGetFieldDomain(fields, fieldEntry.name),
477479
};
478480

479481
outfields!.push(newOutfield);
@@ -782,18 +784,32 @@ export class EsriUtilities {
782784

783785
/**
784786
* Returns the type of the specified field.
785-
* @param {EsriDynamicLayerEntryConfig | EsriFeatureLayerEntryConfig | EsriImageLayerEntryConfig} layerConfig The ESRI layer config
786-
* @param {string} fieldName field name for which we want to get the type.
787-
* @returns {TypeOutfieldsType} The type of the field.
788-
* @static
787+
*
788+
* For ESRI Image layers, well-known pixel fields (`PixelValue`, `ProcessedValue`, `Name`)
789+
* are short-circuited to `'string'` because they have no metadata entry.
790+
*
791+
* @param layerConfig - The ESRI layer config, used to detect EsriImage-specific fields.
792+
* @param fields - The metadata field definitions to search.
793+
* @param fieldName - Field name for which we want to get the type.
794+
* @returns The mapped outfield type (`'date'`, `'oid'`, `'number'`, or `'string'`).
789795
*/
790796
static esriGetFieldType(
791797
layerConfig: EsriDynamicLayerEntryConfig | EsriFeatureLayerEntryConfig | EsriImageLayerEntryConfig,
798+
fields: TypeLayerMetadataFields[],
792799
fieldName: string
793800
): TypeOutfieldsType {
794-
const esriFieldDefinitions = layerConfig.getLayerMetadata()?.fields;
795-
const fieldDefinition = esriFieldDefinitions?.find((metadataEntry) => metadataEntry.name === fieldName);
801+
// For EsriImage layers, handle well-known pixel fields that have no metadata entry
802+
if (layerConfig instanceof EsriImageLayerEntryConfig) {
803+
const lowerFieldName = fieldName.toLowerCase();
804+
if (lowerFieldName === 'pixelvalue' || lowerFieldName === 'processedvalue' || lowerFieldName === 'name') {
805+
return 'string';
806+
}
807+
}
808+
809+
// Find the field definition in the provided fields array
810+
const fieldDefinition = fields?.find((metadataEntry) => metadataEntry.name === fieldName);
796811
if (!fieldDefinition) return 'string';
812+
797813
const esriFieldType = fieldDefinition.type;
798814
if (esriFieldType === 'esriFieldTypeDate') return 'date';
799815
if (esriFieldType === 'esriFieldTypeOID') return 'oid';
@@ -808,20 +824,16 @@ export class EsriUtilities {
808824

809825
/**
810826
* Returns the domain of the specified field.
811-
* @param {EsriDynamicLayerEntryConfig | EsriFeatureLayerEntryConfig | EsriImageLayerEntryConfig} layerConfig The ESRI layer config
812-
* @param {string} fieldName field name for which we want to get the domain.
813-
* @returns {codedValueType | rangeDomainType | null} The domain of the field.
814-
* @static
827+
*
828+
* @param fields - The metadata field definitions to search.
829+
* @param fieldName - Field name for which we want to get the domain.
830+
* @returns The domain of the field, or `null` if not found.
815831
*/
816832
// TODO: ESRI domains are translated to GeoView domains in the configuration. Any GeoView layer that support geoview domains can
817833
// TO.DOCONT: call a method getFieldDomain that use config.source.featureInfo.outfields to find a field domain.
818-
static esriGetFieldDomain(
819-
layerConfig: EsriDynamicLayerEntryConfig | EsriFeatureLayerEntryConfig | EsriImageLayerEntryConfig,
820-
fieldName: string
821-
): codedValueType | rangeDomainType | null {
822-
const esriFieldDefinitions = layerConfig.getLayerMetadata()?.fields;
823-
const fieldDefinition = esriFieldDefinitions?.find((metadataEntry) => metadataEntry.name === fieldName);
824-
return fieldDefinition ? fieldDefinition.domain : null;
834+
static esriGetFieldDomain(fields: TypeLayerMetadataFields[], fieldName: string): codedValueType | rangeDomainType | null {
835+
// Find the field definition in the provided fields array
836+
return fields?.find((metadataEntry) => metadataEntry.name === fieldName)?.domain ?? null;
825837
}
826838

827839
// #endregion PARSING METHODS

packages/geoview-core/src/geo/layer/gv-layers/raster/gv-esri-image.ts

Lines changed: 1 addition & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,13 @@ import { logger } from '@/core/utils/logger';
1414
import { Fetch } from '@/core/utils/fetch-helper';
1515
import type { EsriImageLayerEntryConfig } from '@/api/config/validation-classes/raster-validation-classes/esri-image-layer-entry-config';
1616
import type {
17-
codedValueType,
18-
rangeDomainType,
1917
TypeFeatureInfoEntry,
2018
TypeFeatureInfoResult,
2119
TypeFieldEntry,
2220
TypeIconSymbolVectorConfig,
2321
TypeLayerStyleConfig,
2422
TypeLayerStyleConfigInfo,
2523
TypeLayerStyleSettings,
26-
TypeOutfieldsType,
2724
} from '@/api/types/map-schema-types';
2825
import { CONST_LAYER_TYPES } from '@/api/types/layer-schema-types';
2926
import type { GeometryJson } from '@/geo/layer/gv-layers/utils';
@@ -32,7 +29,7 @@ import { AbstractGVRaster } from '@/geo/layer/gv-layers/raster/abstract-gv-raste
3229
import type { TypeLegend } from '@/core/stores/store-interface-and-intial-values/layer-state';
3330
import { GVWMS } from '@/geo/layer/gv-layers/raster/gv-wms';
3431
import type { LayerFilters } from '@/geo/layer/gv-layers/layer-filters';
35-
import type { TypeMetadataEsriImage, TypeMetadataEsriRasterFunctionInfos, TypeMosaicRule } from '@/api/types/layer-schema-types';
32+
import type { TypeMetadataEsriRasterFunctionInfos, TypeMosaicRule } from '@/api/types/layer-schema-types';
3633
import { GeometryApi } from '@/geo/layer/geometry/geometry';
3734
import type { TemporalMode } from '@/index';
3835

@@ -385,74 +382,6 @@ export class GVEsriImage extends AbstractGVRaster {
385382
return featureInfoResult;
386383
}
387384

388-
/**
389-
* Overrides the return of the field type from the metadata. If the type can not be found, return 'string'.
390-
* @param {string} fieldName - The field name for which we want to get the type.
391-
* @returns {TypeOutfieldsType} The type of the field.
392-
* @override
393-
*/
394-
protected override onGetFieldType(fieldName: string): TypeOutfieldsType {
395-
// Handle special ESRI Image pixel fields
396-
const lowerFieldName = fieldName.toLowerCase();
397-
398-
// Pixel-specific fields
399-
if (lowerFieldName === 'pixelvalue' || lowerFieldName === 'processedvalue') {
400-
return 'string';
401-
}
402-
403-
if (lowerFieldName === 'name') {
404-
return 'string';
405-
}
406-
407-
// Check catalog item fields from metadata
408-
const metadata = this.getLayerConfig().getServiceMetadata() as TypeMetadataEsriImage;
409-
410-
if (metadata?.fields) {
411-
const field = metadata.fields.find((f) => f.name.toLowerCase() === lowerFieldName);
412-
if (field) {
413-
// Map ESRI field types to our types
414-
switch (field.type) {
415-
case 'esriFieldTypeSmallInteger':
416-
case 'esriFieldTypeInteger':
417-
case 'esriFieldTypeOID':
418-
return 'number';
419-
case 'esriFieldTypeSingle':
420-
case 'esriFieldTypeDouble':
421-
return 'number';
422-
case 'esriFieldTypeDate':
423-
return 'date';
424-
case 'esriFieldTypeString':
425-
case 'esriFieldTypeGeometry':
426-
default:
427-
return 'string';
428-
}
429-
}
430-
}
431-
432-
// Default to string for unknown fields
433-
return 'string';
434-
}
435-
436-
/**
437-
* Overrides the return of the domain of the specified field.
438-
* @param {string} fieldName - The field name for which we want to get the domain.
439-
* @returns {null | codedValueType | rangeDomainType} The domain of the field.
440-
* @override
441-
*/
442-
protected override onGetFieldDomain(fieldName: string): null | codedValueType | rangeDomainType {
443-
// Get metadata
444-
const metadata = this.getLayerConfig().getServiceMetadata() as TypeMetadataEsriImage;
445-
446-
// If no fields in metadata, return null
447-
if (!metadata?.fields) return null;
448-
449-
// Find the field
450-
const field = metadata.fields.find((f) => f.name.toLowerCase() === fieldName.toLowerCase());
451-
452-
// Return the domain if found
453-
return field?.domain || null;
454-
}
455-
456385
/**
457386
* Overrides the formatting of feature info results to skip icon rendering for pixel-based queries.
458387
* ESRI Image layers return pixel values, not symbolized features, so we skip the icon source step.

0 commit comments

Comments
 (0)