ImageServer Integration

Converting ArcGIS ImageServer services to STAC collections

ArcGIS ImageServer services provide access to raster datasets, satellite imagery, and multidimensional scientific data. This page covers ImageServer-specific configuration and examples.

Note

Prerequisites: Before using ImageServer integration, complete the ArcGIS Server Integration setup including pyarc2stac installation and basic usage patterns.

ImageServer Specialization

ImageServer integration is specifically designed for:

  • Multidimensional Data: Time series datasets with multiple variables and datacube extensions
  • Scientific Rasters: Climate data with complex temporal dimensions
  • Variable-Rich Datasets: Services with multiple data variables requiring individual render configurations
  • Temporal Analysis: Datasets requiring sophisticated time series handling

Example: Soil Moisture ImageServer

This example demonstrates ImageServer integration using a NASA disasters test service with multidimensional soil moisture data:

# Soil moisture ImageServer with multidimensional data
image_server_url = "https://gis.earthdata.nasa.gov/UAT/rest/services/disasters_test/lis_vsm_percentile_10cm/ImageServer"

# ImageServer-specific inspection
collection = reader.generate_stac()

# Check datacube variables (ImageServer specialty)
if 'cube:variables' in collection.extra_fields:
    variables = collection.extra_fields['cube:variables']
    print(f"Variables: {list(variables.keys())}")
    
    for var_name, var_info in variables.items():
        print(f"  {var_name}: {var_info.get('dimensions', [])}")

# Check temporal dimensions (key for ImageServer)
if 'cube:dimensions' in collection.extra_fields:
    dimensions = collection.extra_fields['cube:dimensions']
    time_dim = dimensions.get('StdTime', {})
    print(f"Time step: {time_dim.get('step', 'Unknown')}")
    print(f"Time extent: {time_dim.get('extent', 'Unknown')}")

Configuration Structure

Complete Example Configuration

Based on the disasters test soil moisture ImageServer:

{
  "type": "Collection",
  "id": "disasters_test_lis_vsm_percentile_10cm",
  "stac_version": "1.1.0",
  "description": "Soil moisture percentile data for disaster monitoring",
  "stac_extensions": [
    "https://stac-extensions.github.io/render/v2.0.0/schema.json",
    "https://stac-extensions.github.io/datacube/v2.2.0/schema.json"
  ],
  "links": [
    {
      "rel": "wms",
      "href": "https://gis.earthdata.nasa.gov/UAT/services/disasters_test/lis_vsm_percentile_10cm/ImageServer/WMSServer",
      "type": "image/png", 
      "title": "Visualized through a WMS",
      "wms:layers": [
        "lis_vsm_percentile_10cm",
        "VSM_Percentile_0_10cm"
      ],
      "wms:styles": ["default"]
    },
    {
      "rel": "via",
      "href": "https://gis.earthdata.nasa.gov/UAT/rest/services/disasters_test/lis_vsm_percentile_10cm/ImageServer",
      "type": "text/html",
      "title": "Parent ArcGIS server url"
    }
  ],
  "renders": {
    "lis_vsm_percentile_10cm": {
      "layers": "lis_vsm_percentile_10cm"
    },
    "vsm_percentile_0_10cm": {
      "layers": "VSM_Percentile_0_10cm"  
    }
  },
  "cube:variables": {
    "lis_vsm_percentile_10cm": {
      "type": "data",
      "attrs": {
        "Count": 27,
        "Minimum": 45857,
        "Maximum": 45886,
        "Interval": 1,
        "IntervalUnit": "Days",
        "HasRegularIntervals": False,
        "HasRanges": False
      },
      "dimensions": ["StdTime"]
    },
    "VSM_Percentile_0_10cm": {
      "type": "data", 
      "attrs": {
        "Count": 31,
        "Minimum": 45857,
        "Maximum": 45887,
        "Interval": 1,
        "IntervalUnit": "Days",
        "HasRegularIntervals": True
      },
      "dimensions": ["StdTime"]
    }
  },
  "cube:dimensions": {
    "StdTime": {
      "type": "temporal",
      "step": "P1D",
      "extent": ["2025-07-19T00:00:00Z", "2025-08-17T00:00:00Z"],
      "values": [
        "2025-07-19T00:00:00Z",
        "2025-07-20T00:00:00Z",
        "2025-07-21T00:00:00Z"
      ]
    }
  },
  "dashboard:is_periodic": true,
  "dashboard:time_density": "day", 
  "dashboard:time_interval": "P1D",
  "extent": {
    "spatial": {
      "bbox": [[-124.94, 25.05, -67.07, 52.93]]
    },
    "temporal": {
      "interval": [["2025-07-19T00:00:00Z", "2025-08-18T00:00:00Z"]]
    }
  },
  "license": "not-applicable",
  "item_assets": {}
}

Key Configuration Elements

Datacube Extension

The datacube extension describes multidimensional data structure:

{
  "cube:variables": {
    "variable_name": {
      "type": "data",
      "attrs": {
        "Count": 31,
        "Minimum": 45857,
        "Maximum": 45887,
        "Interval": 1,
        "IntervalUnit": "Days",
        "HasRegularIntervals": true
      },
      "dimensions": ["StdTime"]
    }
  },
  "cube:dimensions": {
    "StdTime": {
      "type": "temporal",
      "step": "P1D", 
      "extent": ["2025-07-19T00:00:00Z", "2025-08-17T00:00:00Z"],
      "values": ["2025-07-19T00:00:00Z", "2025-07-20T00:00:00Z"]
    }
  }
}

Render Configuration

Defines how variables should be visualized:

{
  "renders": {
    "variable_name": {
      "layers": "ArcGIS_Layer_Name"
    }
  }
}

WMS Integration

Provides Web Map Service endpoints for visualization:

{
  "links": [{
    "rel": "wms",
    "href": "https://server.com/WMSServer",
    "type": "image/png",
    "title": "Visualized through a WMS",
    "wms:layers": ["layer1", "layer2"],
    "wms:styles": ["default"]
  }]
}

ImageServer-Specific Best Practices

Multidimensional Data Handling

  1. Variable Validation: Ensure all variables have proper dimensions

    if 'cube:variables' in collection.extra_fields:
        variables = collection.extra_fields['cube:variables']
        for var_name, var_info in variables.items():
            if 'dimensions' not in var_info:
                print(f"⚠️  Variable {var_name} missing dimensions")
  2. Temporal Dimension Verification: Check time series configuration

    if 'cube:dimensions' in collection.extra_fields:
        dimensions = collection.extra_fields['cube:dimensions']
        if 'StdTime' in dimensions:
            time_info = dimensions['StdTime']
            if 'step' not in time_info:
                print("⚠️  Missing temporal step information")

ImageServer-Specific Troubleshooting

Multidimensional Data Issues

Missing Variable Information

Warning: No variables found in multidimensional service

Solution: Check multidimensional configuration:

md_info = requests.get(f"{image_server_url}/multidimensionalInfo?f=pjson").json()
variables = md_info.get('multidimensionalInfo', {}).get('variables', [])
if not variables:
    print("⚠️  Service may not be properly configured for multidimensional access")

Datacube Extension Issues

Error: Unable to create datacube dimensions

Solution: Verify temporal dimension configuration and ensure service has time-enabled data.

ImageServer Resources

Tip

For general ArcGIS Server integration support, troubleshooting, and additional resources, see the ArcGIS Server Integration page.