<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<title>StreamLayer | Sample | ArcGIS Maps SDK for JavaScript</title>
<!-- Load the ArcGIS Maps SDK for JavaScript from CDN -->
<script type="module" src="https://js.arcgis.com/5.0/"></script>
<arcgis-map basemap="gray-vector" center="-117.98118, 34.00679" zoom="9">
<arcgis-zoom slot="top-left"></arcgis-zoom>
<calcite-panel slot="top-right">
<calcite-block expanded id="feaure-count-block" heading="Stream service url:">
id="stream-service-url-input"
value="https://geoeventsample1.esri.com:6443/arcgis/rest/services/LABus/StreamServer"></calcite-input-text
<calcite-button id="toggleStreamLayerButton" width="full">Add stream layer</calcite-button
Only display features within current extent: <br />
1. Zoom to a desired extent <br />
2. Click Apply spatial filter button
<calcite-button id="toggle-filter-button" disabled width="full">
<arcgis-layer-list slot="bottom-left"></arcgis-layer-list>
const [StreamLayer, Polygon, Graphic, reactiveUtils] = await $arcgis.import([
"@arcgis/core/layers/StreamLayer.js",
"@arcgis/core/geometry/Polygon.js",
"@arcgis/core/Graphic.js",
"@arcgis/core/core/reactiveUtils.js",
let streamLayer, streamLayerView;
const viewElement = document.querySelector("arcgis-map");
// Connect click events to UI buttons
const toggleLayerButton = document.getElementById("toggleStreamLayerButton");
/*************************************************
* Add or remove StreamLayer from a button click
*************************************************/
toggleLayerButton.addEventListener("click", () => {
viewElement.map.remove(streamLayer);
viewElement.graphics.removeAll();
/***********************************************************************
* Apply or remove FeatureEffect from StreamLayerView from a button click
***********************************************************************/
const geometryFilterButton = document.getElementById("toggle-filter-button");
geometryFilterButton.addEventListener("click", () => {
if (!streamLayerView) return;
const expandedExtent = viewElement.extent.clone().expand(0.8);
// set the effect to null if user clicks clear button
if (streamLayerView.featureEffect) {
streamLayerView.featureEffect = null;
viewElement.graphics.removeAll();
geometryFilterButton.textContent = "Apply spatial filter";
// apply an effect to the layer view if user clicks apply button
geometryFilterButton.textContent = "Clear spatial filter";
streamLayerView.featureEffect = {
geometry: expandedExtent,
excludedEffect: "grayscale(100%) opacity(30%)",
viewElement.graphics.removeAll();
viewElement.graphics.add(
geometry: expandedExtent,
async function addStreamLayer() {
const serviceUrl = document.getElementById("stream-service-url-input").value;
// Construct Stream Layer
streamLayer = new StreamLayer({
viewElement.map.add(streamLayer);
// When graphics controller created, register listeners for events
streamLayerView = await viewElement.whenLayerView(streamLayer);
() => streamLayerView.connectionStatus,
if (value === "connected") {
function processConnect() {
toggleLayerButton.textContent = "Remove stream layer";
geometryFilterButton.disabled = false;
function processDisconnect() {
toggleLayerButton.textContent = "Add stream layer";
geometryFilterButton.disabled = true;
geometryFilterButton.textContent = "Apply spatial filter";