Skip to content
View on GitHubSample viewer app

Create a raster layer from a raster image service.

Image of add raster from service

Use case

Accessing a raster image from an online service can be useful for analysing the most up-to-date data available for an area. For example, retrieving recent results of bathymetry surveys within a shipping channel monitored for its sediment build-up would allow planners to assess dredging needs.

How to use the sample

Simply launch the sample to see a raster from an image service being used on a map.

How it works

  1. Create an ImageServiceRaster using the service's URL.
  2. Create a RasterLayer from the image service raster.
  3. Add the raster layer to the map.

Relevant API

  • ImageServiceRaster
  • RasterLayer

About the data

This sample uses a NOAA raster image service. The service computes a hillshade image from the depth (in meters) of U.S. coastal waters.

Tags

image service, raster

Sample Code

AddRasterFromServiceViewModel.ktAddRasterFromServiceViewModel.ktMainActivity.ktAddRasterFromServiceScreen.kt
Use dark colors for code blocksCopy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/* Copyright 2025 Esri
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.esri.arcgismaps.sample.addrasterfromservice.components

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import com.arcgismaps.LoadStatus
import com.arcgismaps.geometry.Point
import com.arcgismaps.geometry.SpatialReference
import com.arcgismaps.mapping.ArcGISMap
import com.arcgismaps.mapping.BasemapStyle
import com.arcgismaps.mapping.Viewpoint
import com.arcgismaps.mapping.layers.RasterLayer
import com.arcgismaps.raster.ImageServiceRaster
import com.esri.arcgismaps.sample.sampleslib.components.MessageDialogViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch

/**
 * ViewModel for the Add raster from service sample.
 */
class AddRasterFromServiceViewModel(application: Application) : AndroidViewModel(application) {

    // Map used by the Compose MapView
    var arcGISMap = ArcGISMap(BasemapStyle.ArcGISDarkGray).apply {
        initialViewpoint = Viewpoint(
            center = Point(-13637000.0, 4550000.0, SpatialReference.webMercator()),
            scale = 100000.0
        )
    }


    // The image service raster (NOAA bathymetry service)
    private val imageServiceRaster = ImageServiceRaster(
        url = "https://gis.ngdc.noaa.gov/arcgis/rest/services/bag_bathymetry/ImageServer"
    )

    // Raster layer that will display the image service raster
    private val rasterLayer = RasterLayer(imageServiceRaster)

    // Flow exposing the current load status of the raster layer for the UI to observe
    private val _rasterLoadStatus = MutableStateFlow<LoadStatus>(LoadStatus.NotLoaded)
    val rasterLoadStatus = _rasterLoadStatus.asStateFlow()

    // Message dialog view model for error reporting
    val messageDialogVM = MessageDialogViewModel()

    init {
        // Add the raster layer to the map's operational layers
        arcGISMap.operationalLayers.add(rasterLayer)

        // Start loading the raster layer and observe its load status
        viewModelScope.launch {
            // Attempt to load the raster layer and report any immediate failures
            rasterLayer.load().onFailure { throwable ->
                messageDialogVM.showMessageDialog(throwable)
            }.onSuccess {
                _rasterLoadStatus.value = LoadStatus.Loaded
            }
        }
    }
}

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.