Create a feature collection layer from a portal item.

Use case
Feature collection layers are often used to hold features with mixed geometry or unstructured data. You can display feature collections stored in a Portal, which are often used for showing content from a CSV or map notes.
How to use the sample
The feature collection is loaded from the Portal item when the sample starts.
How it works
- Create a
Portal. - Create the
PortalItem, referring to the portal and an item ID. - Verify that the item represents a feature collection.
- Create a
FeatureCollectionfrom the item. - Create a
FeatureCollectionLayer, referring to the feature collection. - Add the feature collection layer to the map’s
operationalLayerscollection.
Relevant API
- FeatureCollection
- FeatureCollectionLayer
- Portal
- PortalItem
About the data
The sample uses a sample layer depicting World Cities Population Rank.
Tags
collection, feature collection, feature collection layer, id, item, map notes, portal
Sample Code
/* 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.addfeaturecollectionlayerfromportalitem
import android.os.Bundleimport androidx.activity.ComponentActivityimport androidx.activity.compose.setContentimport androidx.compose.material3.MaterialThemeimport androidx.compose.material3.Surfaceimport androidx.compose.runtime.Composableimport com.arcgismaps.ApiKeyimport com.arcgismaps.ArcGISEnvironmentimport com.esri.arcgismaps.sample.sampleslib.theme.SampleAppThemeimport com.esri.arcgismaps.sample.addfeaturecollectionlayerfromportalitem.screens.AddFeatureCollectionLayerFromPortalItemScreen
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.ACCESS_TOKEN)
setContent { SampleAppTheme { AddFeatureCollectionLayerFromPortalItemApp() } } }
@Composable private fun AddFeatureCollectionLayerFromPortalItemApp() { Surface(color = MaterialTheme.colorScheme.background) { AddFeatureCollectionLayerFromPortalItemScreen( sampleName = getString(R.string.add_feature_collection_layer_from_portal_item_app_name) ) } }}/* 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.addfeaturecollectionlayerfromportalitem.components
import android.app.Applicationimport androidx.lifecycle.AndroidViewModelimport androidx.lifecycle.viewModelScopeimport com.arcgismaps.data.FeatureCollectionimport com.arcgismaps.mapping.ArcGISMapimport com.arcgismaps.mapping.BasemapStyleimport com.arcgismaps.mapping.PortalItemimport com.arcgismaps.mapping.Viewpointimport com.arcgismaps.mapping.layers.FeatureCollectionLayerimport com.arcgismaps.portal.Portalimport com.esri.arcgismaps.sample.sampleslib.components.MessageDialogViewModelimport kotlinx.coroutines.launch
/** * ViewModel that loads a [FeatureCollection] from a [PortalItem] and adds a [FeatureCollectionLayer] * to the ArcGISMap. */class AddFeatureCollectionLayerFromPortalItemViewModel(app: Application) : AndroidViewModel(app) {
// Create a Portal pointing to ArcGIS Online and the feature collection portal item private val portalItem = PortalItem( portal = Portal("https://www.arcgis.com"), itemId = "32798dfad17942858d5eef82ee802f0b" )
// Create a FeatureCollection from the portal item and add it to a FeatureCollectionLayer private val featureCollectionLayer = FeatureCollectionLayer( featureCollection = FeatureCollection(item = portalItem) )
// Map with an ocean basemap and an initial viewpoint and add the featureCollectionLayer val arcGISMap = ArcGISMap(BasemapStyle.ArcGISOceans).apply { initialViewpoint = Viewpoint(latitude = 39.8, longitude = -98.6, scale = 10e7) // Add the layer to the map's operational layers operationalLayers.add(featureCollectionLayer) }
// Message dialog view model for error reporting val messageDialogVM = MessageDialogViewModel()
init { // Load the map which loads the portal item to then load feature collection layer viewModelScope.launch { arcGISMap.load().onFailure { messageDialogVM.showMessageDialog(it) } } }}/* 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.addfeaturecollectionlayerfromportalitem.screens
import androidx.compose.foundation.layout.fillMaxSizeimport androidx.compose.foundation.layout.paddingimport androidx.compose.material3.Scaffoldimport androidx.compose.runtime.Composableimport androidx.compose.ui.Modifierimport androidx.lifecycle.viewmodel.compose.viewModelimport com.arcgismaps.toolkit.geoviewcompose.MapViewimport com.esri.arcgismaps.sample.addfeaturecollectionlayerfromportalitem.components.AddFeatureCollectionLayerFromPortalItemViewModelimport com.esri.arcgismaps.sample.sampleslib.components.MessageDialogimport com.esri.arcgismaps.sample.sampleslib.components.SampleTopAppBar
/** * Composable screen that shows the MapView. The ViewModel loads a FeatureCollectionLayer * from a PortalItem and adds it to the map's operational layers. */@Composablefun AddFeatureCollectionLayerFromPortalItemScreen(sampleName: String) { val mapViewModel: AddFeatureCollectionLayerFromPortalItemViewModel = viewModel() Scaffold( topBar = { SampleTopAppBar(title = sampleName) }, content = { MapView( modifier = Modifier .fillMaxSize() .padding(it), arcGISMap = mapViewModel.arcGISMap ) // Show any errors surfaced by the ViewModel mapViewModel.messageDialogVM.apply { if (dialogStatus) { MessageDialog( title = messageTitle, description = messageDescription, onDismissRequest = ::dismissDialog ) } } } )}