<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Jetpack compose Add WMS layer on map in Kotlin Maps SDK Questions</title>
    <link>https://community.esri.com/t5/kotlin-maps-sdk-questions/jetpack-compose-add-wms-layer-when-wms-layer-names/m-p/1544091#M492</link>
    <description>&lt;P&gt;Thank you for the quick response &lt;a href="https://community.esri.com/t5/user/viewprofilepage/user-id/476225"&gt;@Shubham_Sharma&lt;/a&gt;, I have the context and apikey for ArcGIS environement provided from the app's application class.&lt;BR /&gt;What I am struggling with is displaying the WMS overlay on the map.&amp;nbsp;&lt;BR /&gt;For instance, if I follow the sample example provided and add the WMS layer the following way:&lt;/P&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;val &lt;/SPAN&gt;map =&lt;BR /&gt;    ArcGISMap(Basemap(WebTiledLayer.create(&lt;SPAN&gt;"https://tile.openstreetmap.org/{level}/{col}/{row}.png"&lt;/SPAN&gt;)))&lt;BR /&gt;&lt;SPAN&gt;val &lt;/SPAN&gt;wmsLayer = WmsLayer(url = "&lt;A href="https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms&amp;quot;,layerNames" target="_blank" rel="noopener"&gt;https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms",layerNames&lt;/A&gt; = listOf("conus_base_reflectivity_mosaic"))&lt;BR /&gt;map.&lt;SPAN&gt;operationalLayers&lt;/SPAN&gt;.add(wmsLayer)&lt;BR /&gt;&lt;SPAN&gt;_mapStateDataFlow&lt;/SPAN&gt;.&lt;SPAN&gt;update &lt;/SPAN&gt;&lt;SPAN&gt;{ &lt;/SPAN&gt;dataState &lt;SPAN&gt;-&amp;gt;&lt;BR /&gt;&lt;/SPAN&gt; dataState.copy(&lt;SPAN&gt;map = &lt;/SPAN&gt;map)&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;wmsLayer.load().&lt;SPAN&gt;onSuccess &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR /&gt;&lt;/SPAN&gt; Timber.d(&lt;SPAN&gt;"load successful"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;.&lt;SPAN&gt;onFailure &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR /&gt;&lt;/SPAN&gt; Timber.d(&lt;SPAN&gt;"Failed to load"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;P&gt;&amp;nbsp;It loads and displays the WMS layer on the map.&lt;/P&gt;&lt;P&gt;But, if I do not know the layerNames, then&amp;nbsp;&lt;BR /&gt;I will need to use&amp;nbsp;&lt;/P&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms?service=WMS&amp;amp;request=GetCapabilities&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;P&gt;as specified in&amp;nbsp;&lt;A href="https://developers.arcgis.com/android/api-reference/reference/com/esri/arcgisruntime/layers/WmsLayer.html#:~:text=Web%20Map%20Service%20(WMS)%20is%20an" target="_blank" rel="noopener"&gt;WmsLayer (ArcGIS Runtime SDK for Android 100.15.6)&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;But when I do the following:&lt;/P&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;val &lt;/SPAN&gt;map =&lt;BR /&gt;    ArcGISMap(Basemap(WebTiledLayer.create(&lt;SPAN&gt;"https://tile.openstreetmap.org/{level}/{col}/{row}.png"&lt;/SPAN&gt;)))&lt;BR /&gt;&lt;SPAN&gt;val &lt;/SPAN&gt;wmsService =&lt;BR /&gt;    WmsService(&lt;SPAN&gt;url = &lt;/SPAN&gt;&lt;SPAN&gt;"https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms?service=WMS&amp;amp;request=GetCapabilities"&lt;/SPAN&gt;)&lt;BR /&gt;wmsService.load().&lt;SPAN&gt;onSuccess &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;if &lt;/SPAN&gt;(wmsService.&lt;SPAN&gt;serviceInfo &lt;/SPAN&gt;!= &lt;SPAN&gt;null&lt;/SPAN&gt;) {&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;wmsLayer = WmsLayer(wmsService.&lt;SPAN&gt;serviceInfo&lt;/SPAN&gt;!!.&lt;SPAN&gt;layerInfos&lt;/SPAN&gt;)&lt;BR /&gt;        wmsLayer.&lt;SPAN&gt;isVisible &lt;/SPAN&gt;= &lt;SPAN&gt;true&lt;BR /&gt;&lt;/SPAN&gt;        map.&lt;SPAN&gt;operationalLayers&lt;/SPAN&gt;.add(wmsLayer)&lt;BR /&gt;        &lt;SPAN&gt;_mapStateDataFlow&lt;/SPAN&gt;.&lt;SPAN&gt;update &lt;/SPAN&gt;&lt;SPAN&gt;{ &lt;/SPAN&gt;dataState &lt;SPAN&gt;-&amp;gt;&lt;BR /&gt;&lt;/SPAN&gt;            dataState.copy(&lt;SPAN&gt;map = &lt;/SPAN&gt;map)&lt;BR /&gt;        &lt;SPAN&gt;}&lt;BR /&gt;&lt;/SPAN&gt;        wmsLayer.load().&lt;SPAN&gt;onSuccess &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR /&gt;&lt;/SPAN&gt;            Timber.d(&lt;SPAN&gt;"load successful"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;}&lt;/SPAN&gt;.&lt;SPAN&gt;onFailure &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR /&gt;&lt;/SPAN&gt;            Timber.d(&lt;SPAN&gt;"Failed to load"&lt;/SPAN&gt;)&lt;BR /&gt;        &lt;SPAN&gt;}&lt;BR /&gt;&lt;/SPAN&gt;    }&lt;BR /&gt;&lt;SPAN&gt;}&lt;BR /&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;The log comes as load successful, but I don't see any overlay on the map.&amp;nbsp; I have attached screenshots below of when I do it as in the Kotlin Sample with known layerName (WMS overlay is displayed) and another where I do not know the layerNames (WMS overlay not displayed). Please do let me know if I am missing something.&lt;BR /&gt;&lt;BR /&gt;One thing I noticed is : when I do it as in the sample - and log the url from the &lt;STRONG&gt;WmsLayer &lt;/STRONG&gt;instance,&lt;/P&gt;&lt;PRE&gt;&lt;BR /&gt;&lt;SPAN&gt;val &lt;/SPAN&gt;wmsLayer = WmsLayer(url = "&lt;A href="https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms&amp;quot;,layerNames" target="_blank" rel="noopener"&gt;https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms",layerNames&lt;/A&gt; = listOf("conus_base_reflectivity_mosaic"))&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Timber.d("url is ${wmsLayer.url}") //prints above url&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;I get the provided url "&lt;A href="https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms&amp;quot;" target="_blank" rel="noopener"&gt;https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms"&lt;/A&gt;&amp;nbsp;from it.&lt;/P&gt;&lt;P&gt;But when I do the same thing after creating the WmsLayer from&amp;nbsp;&lt;STRONG&gt;WmsLayer(wmsService.serviceInfo!!.layerInfos),&lt;BR /&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;val &lt;/SPAN&gt;wmsService =&lt;BR /&gt;    WmsService(&lt;SPAN&gt;url = &lt;/SPAN&gt;&lt;SPAN&gt;"https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms?service=WMS&amp;amp;request=GetCapabilities"&lt;/SPAN&gt;)&lt;BR /&gt;wmsService.load().&lt;SPAN&gt;onSuccess &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;if &lt;/SPAN&gt;(wmsService.&lt;SPAN&gt;serviceInfo &lt;/SPAN&gt;!= &lt;SPAN&gt;null&lt;/SPAN&gt;) {&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;wmsLayer = WmsLayer(wmsService.&lt;SPAN&gt;serviceInfo&lt;/SPAN&gt;!!.&lt;SPAN&gt;layerInfos&lt;/SPAN&gt;)&lt;BR /&gt;        Timber.d(&lt;SPAN&gt;"url is &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;wmsLayer.&lt;SPAN&gt;url&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;) // prints empty string&lt;BR /&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;P&gt;&lt;STRONG&gt;&lt;BR /&gt;&amp;nbsp;&lt;/STRONG&gt;I get empty url. I wonder if that's why I do not get the overlays displayed as there is no url to fetch from.&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
    <pubDate>Tue, 01 Oct 2024 04:38:36 GMT</pubDate>
    <dc:creator>NishanKhadka</dc:creator>
    <dc:date>2024-10-01T04:38:36Z</dc:date>
    <item>
      <title>Jetpack compose Add WMS layer when WMS layer names are not known.</title>
      <link>https://community.esri.com/t5/kotlin-maps-sdk-questions/jetpack-compose-add-wms-layer-when-wms-layer-names/m-p/1543705#M490</link>
      <description>&lt;H5&gt;&lt;SPAN&gt;I migrated from Android View to Jetpack Compose for the esri map. But cannot seem to find a way to add WMS layer properly.&lt;/SPAN&gt;&lt;BR /&gt;Would appreciate it if I could be pointed towards the right direction.Is there some way to add WMS similar to graphic overlays, or grids or locations??&lt;/H5&gt;&lt;DIV&gt;&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;SPAN&gt;&lt;STRONG&gt;Data class:&lt;/STRONG&gt;&lt;BR /&gt;data class &lt;/SPAN&gt;ArcGisMapData(&lt;BR /&gt;    &lt;SPAN&gt;var &lt;/SPAN&gt;&lt;SPAN&gt;map&lt;/SPAN&gt;: ArcGISMap&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;    var &lt;/SPAN&gt;&lt;SPAN&gt;graphicOverlays&lt;/SPAN&gt;: List&amp;lt;GraphicsOverlay&amp;gt;&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;    var &lt;/SPAN&gt;&lt;SPAN&gt;locationDisplay&lt;/SPAN&gt;: LocationDisplay)&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;DIV&gt;&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;SPAN&gt;Composable function:&lt;BR /&gt;@Composable&lt;BR /&gt;fun EsriMap(map:ArcGISMap,locationDisplay:LocationDisplay,graphicsOverlays:List&amp;lt;GraphicOverlay&amp;gt;){&lt;BR /&gt;val mapState by mapViewModel.mapStateFlow.collectAsStateWithLifeCycle()&lt;BR /&gt;MapView&lt;/SPAN&gt;(&lt;BR /&gt;    &lt;SPAN&gt;modifier = &lt;/SPAN&gt;Modifier&lt;BR /&gt;        .&lt;SPAN&gt;fillMaxSize&lt;/SPAN&gt;()&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;arcGISMap = mapState.&lt;/SPAN&gt;map&lt;SPAN&gt;,&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;graphicsOverlays = mapState.&lt;/SPAN&gt;graphicOverlays&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;locationDisplay = mapState.&lt;/SPAN&gt;locationDisplay)&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;SPAN&gt;ViewModel Class&lt;BR /&gt;class &lt;/SPAN&gt;MapViewModel : ViewModel() {&lt;BR /&gt;&lt;SPAN&gt;private val _mapStateDataFlow = MutableStateFlow(&lt;BR /&gt;ArcGisMapData(&lt;BR /&gt;map = ArcGISMap(Basemap(WebTiledLayer.create("https://tile.openstreetmap.org/{level}/{col}/{row}.png"))),&lt;BR /&gt; graphicOverlays = listOf(GraphicsOverlay()),locationDisplay = LocationDisplay())&lt;BR /&gt;val mapStateFlow = _mapStateDataFlow.asStateFlow()&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;init{&lt;BR /&gt;viewmodelScope.launch{&lt;BR /&gt;&lt;SPAN&gt;val &lt;/SPAN&gt;wmsService =&lt;BR /&gt;WmsService(&lt;SPAN&gt;url = &lt;/SPAN&gt;&lt;SPAN&gt;"http://geodata.nationaalgeoregister.nl/cbsprovincies/ows?SERVICE=WMS&amp;amp;request=Getcapabilities&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;wmsService.load().&lt;SPAN&gt;onSuccess &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR /&gt;&lt;/SPAN&gt; &lt;SPAN&gt;val &lt;/SPAN&gt;wmsLayer = WmsLayer(wmsService.&lt;SPAN&gt;serviceInfo&lt;/SPAN&gt;!!.&lt;SPAN&gt;layerInfos&lt;/SPAN&gt;)&lt;BR /&gt;wmsLayer.load().&lt;SPAN&gt;onSuccess &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR /&gt;&lt;/SPAN&gt; Timber.d(&lt;SPAN&gt;"load success"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;SPAN&gt;// TODO("Load new instance of ArcGIS Map with wms added to operational layer")&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt; }&lt;/SPAN&gt;.&lt;SPAN&gt;onFailure &lt;/SPAN&gt;&lt;SPAN&gt;{ &lt;/SPAN&gt;exception &lt;SPAN&gt;-&amp;gt;&lt;BR /&gt;&lt;/SPAN&gt; Timber.e(&lt;BR /&gt;exception&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;"Failed to load WMS layer"&lt;BR /&gt;&lt;/SPAN&gt; )&lt;BR /&gt;&lt;SPAN&gt;// Handle error, e.g., show a message to the user&lt;BR /&gt;&lt;/SPAN&gt; &lt;SPAN&gt;}&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;.&lt;SPAN&gt;onFailure &lt;/SPAN&gt;&lt;SPAN&gt;{ &lt;/SPAN&gt;e &lt;SPAN&gt;-&amp;gt;&lt;BR /&gt;&lt;/SPAN&gt; Timber.e(&lt;BR /&gt;e&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;"Failed to load WMS Service: &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;entry.&lt;SPAN&gt;path&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;BR /&gt;&lt;/SPAN&gt; )&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;}&lt;BR /&gt;}&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;</description>
      <pubDate>Tue, 01 Oct 2024 04:40:11 GMT</pubDate>
      <guid>https://community.esri.com/t5/kotlin-maps-sdk-questions/jetpack-compose-add-wms-layer-when-wms-layer-names/m-p/1543705#M490</guid>
      <dc:creator>NishanKhadka</dc:creator>
      <dc:date>2024-10-01T04:40:11Z</dc:date>
    </item>
    <item>
      <title>Re: Jetpack compose Add WMS layer on map</title>
      <link>https://community.esri.com/t5/kotlin-maps-sdk-questions/jetpack-compose-add-wms-layer-when-wms-layer-names/m-p/1543904#M491</link>
      <description>&lt;P&gt;While reading the code I noticed that you are using a LocationDisplay with the Composable MapView. To be able to set a LocationDisplay, you would need to define an &lt;U&gt;ApplicationContext:&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="kotlin"&gt;ArcGISEnvironment.applicationContext = this

// Alternatively, you can set the application context using the 
// LocationDisplay helper function from a Composable scope:

// Checks that ArcGISEnvironment.applicationContext is set and if not, sets one.
val myLocationDisplay = rememberLocationDisplay()&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I can load a WMS layer by modifying your code using the above changes:&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="kotlin"&gt;
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.lifecycle.ViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewModelScope
import androidx.lifecycle.viewmodel.compose.viewModel
import com.arcgismaps.ApiKey
import com.arcgismaps.ArcGISEnvironment
import com.arcgismaps.mapping.ArcGISMap
import com.arcgismaps.mapping.Basemap
import com.arcgismaps.mapping.layers.WebTiledLayer
import com.arcgismaps.mapping.layers.WmsLayer
import com.arcgismaps.mapping.layers.WmsService
import com.arcgismaps.mapping.view.GraphicsOverlay
import com.arcgismaps.mapping.view.LocationDisplay
import com.arcgismaps.toolkit.geoviewcompose.MapView
import com.esri.arcgismaps.sample.sampleslib.theme.SampleAppTheme
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch

class MainActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // authentication with an API key or named user is
        // required to access basemaps and other location services
        ArcGISEnvironment.apiKey = ApiKey.create(BuildConfig.API_KEY)
        // application context is required for LocationDisplay
        ArcGISEnvironment.applicationContext = this

        setContent {
            SampleAppTheme {
                EsriMap()
            }
        }
    }

    @Composable
    fun EsriMap() {
        val mapViewModel: MapViewModel = viewModel()
        val mapState by mapViewModel.mapStateFlow.collectAsStateWithLifecycle()

        MapView(
            modifier = Modifier
                .fillMaxSize(),
            arcGISMap = mapState.map,
            graphicsOverlays = mapState.graphicOverlays,
            locationDisplay = mapState.locationDisplay
        )
    }
}

class MapViewModel : ViewModel() {
    private val _mapStateDataFlow = MutableStateFlow(
        ArcGisMapData(
            map = ArcGISMap(Basemap(WebTiledLayer.create("https://tile.openstreetmap.org/{level}/{col}/{row}.png"))),
            graphicOverlays = listOf(GraphicsOverlay()),
            locationDisplay = LocationDisplay()
        )
    )

    val mapStateFlow = _mapStateDataFlow.asStateFlow()

    init {
        viewModelScope.launch {
            val wmsService =
                WmsService(url = "http://geodata.nationaalgeoregister.nl/cbsprovincies/ows?SERVICE=WMS&amp;amp;request=Getcapabilities")
            wmsService.load().onSuccess {
                val wmsLayer = WmsLayer(wmsService.serviceInfo!!.layerInfos)
                wmsLayer.load().onSuccess {
                    Log.e("TAG", "load success")
                }.onFailure { exception -&amp;gt;
                    Log.e("TAG", "${exception.message}: Failed to load WMS layer")
                }
            }.onFailure { exception -&amp;gt;
                Log.e("TAG", "${exception.message}: Failed to load WMS layer")
            }
        }
    }
}

data class ArcGisMapData(
    var map: ArcGISMap,
    var graphicOverlays: List&amp;lt;GraphicsOverlay&amp;gt;,
    var locationDisplay: LocationDisplay
)
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 30 Sep 2024 17:32:21 GMT</pubDate>
      <guid>https://community.esri.com/t5/kotlin-maps-sdk-questions/jetpack-compose-add-wms-layer-when-wms-layer-names/m-p/1543904#M491</guid>
      <dc:creator>Shubham_Sharma</dc:creator>
      <dc:date>2024-09-30T17:32:21Z</dc:date>
    </item>
    <item>
      <title>Re: Jetpack compose Add WMS layer on map</title>
      <link>https://community.esri.com/t5/kotlin-maps-sdk-questions/jetpack-compose-add-wms-layer-when-wms-layer-names/m-p/1544091#M492</link>
      <description>&lt;P&gt;Thank you for the quick response &lt;a href="https://community.esri.com/t5/user/viewprofilepage/user-id/476225"&gt;@Shubham_Sharma&lt;/a&gt;, I have the context and apikey for ArcGIS environement provided from the app's application class.&lt;BR /&gt;What I am struggling with is displaying the WMS overlay on the map.&amp;nbsp;&lt;BR /&gt;For instance, if I follow the sample example provided and add the WMS layer the following way:&lt;/P&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;val &lt;/SPAN&gt;map =&lt;BR /&gt;    ArcGISMap(Basemap(WebTiledLayer.create(&lt;SPAN&gt;"https://tile.openstreetmap.org/{level}/{col}/{row}.png"&lt;/SPAN&gt;)))&lt;BR /&gt;&lt;SPAN&gt;val &lt;/SPAN&gt;wmsLayer = WmsLayer(url = "&lt;A href="https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms&amp;quot;,layerNames" target="_blank" rel="noopener"&gt;https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms",layerNames&lt;/A&gt; = listOf("conus_base_reflectivity_mosaic"))&lt;BR /&gt;map.&lt;SPAN&gt;operationalLayers&lt;/SPAN&gt;.add(wmsLayer)&lt;BR /&gt;&lt;SPAN&gt;_mapStateDataFlow&lt;/SPAN&gt;.&lt;SPAN&gt;update &lt;/SPAN&gt;&lt;SPAN&gt;{ &lt;/SPAN&gt;dataState &lt;SPAN&gt;-&amp;gt;&lt;BR /&gt;&lt;/SPAN&gt; dataState.copy(&lt;SPAN&gt;map = &lt;/SPAN&gt;map)&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;wmsLayer.load().&lt;SPAN&gt;onSuccess &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR /&gt;&lt;/SPAN&gt; Timber.d(&lt;SPAN&gt;"load successful"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;.&lt;SPAN&gt;onFailure &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR /&gt;&lt;/SPAN&gt; Timber.d(&lt;SPAN&gt;"Failed to load"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;P&gt;&amp;nbsp;It loads and displays the WMS layer on the map.&lt;/P&gt;&lt;P&gt;But, if I do not know the layerNames, then&amp;nbsp;&lt;BR /&gt;I will need to use&amp;nbsp;&lt;/P&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms?service=WMS&amp;amp;request=GetCapabilities&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;P&gt;as specified in&amp;nbsp;&lt;A href="https://developers.arcgis.com/android/api-reference/reference/com/esri/arcgisruntime/layers/WmsLayer.html#:~:text=Web%20Map%20Service%20(WMS)%20is%20an" target="_blank" rel="noopener"&gt;WmsLayer (ArcGIS Runtime SDK for Android 100.15.6)&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;But when I do the following:&lt;/P&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;val &lt;/SPAN&gt;map =&lt;BR /&gt;    ArcGISMap(Basemap(WebTiledLayer.create(&lt;SPAN&gt;"https://tile.openstreetmap.org/{level}/{col}/{row}.png"&lt;/SPAN&gt;)))&lt;BR /&gt;&lt;SPAN&gt;val &lt;/SPAN&gt;wmsService =&lt;BR /&gt;    WmsService(&lt;SPAN&gt;url = &lt;/SPAN&gt;&lt;SPAN&gt;"https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms?service=WMS&amp;amp;request=GetCapabilities"&lt;/SPAN&gt;)&lt;BR /&gt;wmsService.load().&lt;SPAN&gt;onSuccess &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;if &lt;/SPAN&gt;(wmsService.&lt;SPAN&gt;serviceInfo &lt;/SPAN&gt;!= &lt;SPAN&gt;null&lt;/SPAN&gt;) {&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;wmsLayer = WmsLayer(wmsService.&lt;SPAN&gt;serviceInfo&lt;/SPAN&gt;!!.&lt;SPAN&gt;layerInfos&lt;/SPAN&gt;)&lt;BR /&gt;        wmsLayer.&lt;SPAN&gt;isVisible &lt;/SPAN&gt;= &lt;SPAN&gt;true&lt;BR /&gt;&lt;/SPAN&gt;        map.&lt;SPAN&gt;operationalLayers&lt;/SPAN&gt;.add(wmsLayer)&lt;BR /&gt;        &lt;SPAN&gt;_mapStateDataFlow&lt;/SPAN&gt;.&lt;SPAN&gt;update &lt;/SPAN&gt;&lt;SPAN&gt;{ &lt;/SPAN&gt;dataState &lt;SPAN&gt;-&amp;gt;&lt;BR /&gt;&lt;/SPAN&gt;            dataState.copy(&lt;SPAN&gt;map = &lt;/SPAN&gt;map)&lt;BR /&gt;        &lt;SPAN&gt;}&lt;BR /&gt;&lt;/SPAN&gt;        wmsLayer.load().&lt;SPAN&gt;onSuccess &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR /&gt;&lt;/SPAN&gt;            Timber.d(&lt;SPAN&gt;"load successful"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;}&lt;/SPAN&gt;.&lt;SPAN&gt;onFailure &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR /&gt;&lt;/SPAN&gt;            Timber.d(&lt;SPAN&gt;"Failed to load"&lt;/SPAN&gt;)&lt;BR /&gt;        &lt;SPAN&gt;}&lt;BR /&gt;&lt;/SPAN&gt;    }&lt;BR /&gt;&lt;SPAN&gt;}&lt;BR /&gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;The log comes as load successful, but I don't see any overlay on the map.&amp;nbsp; I have attached screenshots below of when I do it as in the Kotlin Sample with known layerName (WMS overlay is displayed) and another where I do not know the layerNames (WMS overlay not displayed). Please do let me know if I am missing something.&lt;BR /&gt;&lt;BR /&gt;One thing I noticed is : when I do it as in the sample - and log the url from the &lt;STRONG&gt;WmsLayer &lt;/STRONG&gt;instance,&lt;/P&gt;&lt;PRE&gt;&lt;BR /&gt;&lt;SPAN&gt;val &lt;/SPAN&gt;wmsLayer = WmsLayer(url = "&lt;A href="https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms&amp;quot;,layerNames" target="_blank" rel="noopener"&gt;https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms",layerNames&lt;/A&gt; = listOf("conus_base_reflectivity_mosaic"))&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Timber.d("url is ${wmsLayer.url}") //prints above url&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;I get the provided url "&lt;A href="https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms&amp;quot;" target="_blank" rel="noopener"&gt;https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms"&lt;/A&gt;&amp;nbsp;from it.&lt;/P&gt;&lt;P&gt;But when I do the same thing after creating the WmsLayer from&amp;nbsp;&lt;STRONG&gt;WmsLayer(wmsService.serviceInfo!!.layerInfos),&lt;BR /&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;val &lt;/SPAN&gt;wmsService =&lt;BR /&gt;    WmsService(&lt;SPAN&gt;url = &lt;/SPAN&gt;&lt;SPAN&gt;"https://nowcoast.noaa.gov/geoserver/observations/weather_radar/wms?service=WMS&amp;amp;request=GetCapabilities"&lt;/SPAN&gt;)&lt;BR /&gt;wmsService.load().&lt;SPAN&gt;onSuccess &lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;if &lt;/SPAN&gt;(wmsService.&lt;SPAN&gt;serviceInfo &lt;/SPAN&gt;!= &lt;SPAN&gt;null&lt;/SPAN&gt;) {&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;wmsLayer = WmsLayer(wmsService.&lt;SPAN&gt;serviceInfo&lt;/SPAN&gt;!!.&lt;SPAN&gt;layerInfos&lt;/SPAN&gt;)&lt;BR /&gt;        Timber.d(&lt;SPAN&gt;"url is &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;wmsLayer.&lt;SPAN&gt;url&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;) // prints empty string&lt;BR /&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;P&gt;&lt;STRONG&gt;&lt;BR /&gt;&amp;nbsp;&lt;/STRONG&gt;I get empty url. I wonder if that's why I do not get the overlays displayed as there is no url to fetch from.&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
      <pubDate>Tue, 01 Oct 2024 04:38:36 GMT</pubDate>
      <guid>https://community.esri.com/t5/kotlin-maps-sdk-questions/jetpack-compose-add-wms-layer-when-wms-layer-names/m-p/1544091#M492</guid>
      <dc:creator>NishanKhadka</dc:creator>
      <dc:date>2024-10-01T04:38:36Z</dc:date>
    </item>
    <item>
      <title>Re: Jetpack compose Add WMS layer on map</title>
      <link>https://community.esri.com/t5/kotlin-maps-sdk-questions/jetpack-compose-add-wms-layer-when-wms-layer-names/m-p/1544595#M495</link>
      <description>&lt;P&gt;&lt;a href="https://community.esri.com/t5/user/viewprofilepage/user-id/738241"&gt;@NishanKhadka&lt;/a&gt;&amp;nbsp;Thanks for clarifying! I believe you would need to retrieve the &lt;U&gt;&lt;STRONG&gt;sublayerInfos&lt;/STRONG&gt;&lt;/U&gt; which should help load all the WMS layers from the service without providing the layerName:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="kotlin"&gt;val layerInfos = wmsService.serviceInfo!!.layerInfos[0].sublayerInfos
val wmsLayer = WmsLayer(layerInfos)
wmsLayer.load().onSuccess {
    // Add to map's operational layers...
}&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Just to note, each layerInfo may contain subLayers, and the subLayers may contain additional subLayers. I would inspect the service you are using to configure which layers to/not to display on the MapView.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 01 Oct 2024 23:33:34 GMT</pubDate>
      <guid>https://community.esri.com/t5/kotlin-maps-sdk-questions/jetpack-compose-add-wms-layer-when-wms-layer-names/m-p/1544595#M495</guid>
      <dc:creator>Shubham_Sharma</dc:creator>
      <dc:date>2024-10-01T23:33:34Z</dc:date>
    </item>
    <item>
      <title>Re: Jetpack compose Add WMS layer when WMS layer names are not known.</title>
      <link>https://community.esri.com/t5/kotlin-maps-sdk-questions/jetpack-compose-add-wms-layer-when-wms-layer-names/m-p/1544598#M496</link>
      <description>&lt;P&gt;&lt;a href="https://community.esri.com/t5/user/viewprofilepage/user-id/476225"&gt;@Shubham_Sharma&lt;/a&gt;&amp;nbsp;Thank you for your guidance!&amp;nbsp; It now make sense to use the WmsService class to load the layers available and configure which layers/sublayers to load on the map. Then load it using the WmsLayer class.&amp;nbsp; Accepting this as solution! Thanks again!&lt;/P&gt;</description>
      <pubDate>Wed, 02 Oct 2024 00:47:55 GMT</pubDate>
      <guid>https://community.esri.com/t5/kotlin-maps-sdk-questions/jetpack-compose-add-wms-layer-when-wms-layer-names/m-p/1544598#M496</guid>
      <dc:creator>NishanKhadka</dc:creator>
      <dc:date>2024-10-02T00:47:55Z</dc:date>
    </item>
  </channel>
</rss>

