CartoLayer auto refresh

by felixp

HTML

<!DOCTYPE html>
<html>

  <head>
    <title>Auto refresh</title>
    <script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>
    <script src="https://unpkg.com/deck.gl@latest/dist.min.js"></script>
    <script src="https://unpkg.com/@deck.gl/carto@latest/dist.min.js"></script>

    <script src="https://unpkg.com/[email protected]/dist/maplibre-gl.js"></script>
    <link href="https://unpkg.com/[email protected]/dist/maplibre-gl.css" rel="stylesheet" />
    <script src="https://unpkg.com/[email protected]/dist/html2canvas.min.js"></script>
  </head>

  <body>
    <div id="map">
      <div id="basemap"></div>
    </div>
    <div class="loading-container">
      <div id="loading-info">Loading data...</div>

      <div id="spinner" class="spinner">
        <div></div>
        <div></div>
        <div></div>
        <div></div>
      </div>
    </div>
  </body>

</html>

CSS

body {
  margin: 0;
  padding: 0;
}

#map {
  position: relative;
  width: 100vw;
  height: 100vh;
  z-index: 1;
}

#basemap {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

.loading-container {
  position: absolute;
  top: 10px;
  left: 10px;
  height: 24px;
  z-index: 100;
  background: white;
  border-radius: 24px;
  box-shadow: rgba(0, 0, 0, 0.2) 1px 1px 5px;
}

#loading-info {
  float: right;
  margin: 4px 12px;
  color: #2e71ff;
  font-family: sans-serif;
  font-size: 14px;
}

.spinner {
  display: inline-block;
  position: relative;
  top: 0;
  z-index: 100;
  width: 20px;
  height: 20px;
  transition: opacity 0.3s ease-in-out;
}

.spinner div {
  box-sizing: border-box;
  display: inline-block;
  position: absolute;
  width: 16px;
  height: 16px;
  margin: 4px;
  border: 2px solid #fff;
  border-radius: 50%;
  animation: spinner 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
  border-color: #2e71ff transparent transparent transparent;
  box-shadow: 2px black;
}

.spinner div:nth-child(1) {
  animation-delay: -0.45s;
}

.spinner div:nth-child(2) {
  animation-delay: -0.3s;
}

.spinner div:nth-child(3) {
  animation-delay: -0.15s;
}

@keyframes spinner {
  0% {
    transform: rotate(0deg);
  }

  100% {
    transform: rotate(360deg);
  }
}

JavaScript

const accessToken = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRVNGNZTHAwaThjYnVMNkd0LTE0diJ9.eyJodHRwOi8vYXBwLmNhcnRvLmNvbS9lbWFpbCI6InN1cHBvcnQtZW5naW5lZXJzK3BpbmVhQGNhcnRvZGIuY29tIiwiaHR0cDovL2FwcC5jYXJ0by5jb20vYWNjb3VudF9pZCI6ImFjX3BlcWZycDRqIiwiaXNzIjoiaHR0cHM6Ly9hdXRoLmNhcnRvLmNvbS8iLCJzdWIiOiJhdXRoMHw2MzNhYmQ5MTkyNzIwNTBjYmZiY2E5NmQiLCJhdWQiOlsiY2FydG8tY2xvdWQtbmF0aXZlLWFwaSIsImh0dHBzOi8vY2FydG8tcHJvZHVjdGlvbi51cy5hdXRoMC5jb20vdXNlcmluZm8iXSwiaWF0IjoxNjkyMjU4NzY0LCJleHAiOjE2OTIzNDUxNjQsImF6cCI6ImpDV25ISzZFMksyYU95OWpMeTNPN1pNcGhxR085QlBMIiwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBlbWFpbCByZWFkOmN1cnJlbnRfdXNlciB1cGRhdGU6Y3VycmVudF91c2VyIHJlYWQ6Y29ubmVjdGlvbnMgd3JpdGU6Y29ubmVjdGlvbnMgcmVhZDptYXBzIHdyaXRlOm1hcHMgcmVhZDphY2NvdW50IGFkbWluOmFjY291bnQiLCJwZXJtaXNzaW9ucyI6WyJhZG1pbjphY2NvdW50IiwiZXhlY3V0ZTp3b3JrZmxvd3MiLCJyZWFkOmFjY291bnQiLCJyZWFkOmFwcHMiLCJyZWFkOmNvbm5lY3Rpb25zIiwicmVhZDpjdXJyZW50X3VzZXIiLCJyZWFkOmltcG9ydHMiLCJyZWFkOmxpc3RlZF9hcHBzIiwicmVhZDptYXBzIiwicmVhZDp0aWxlc2V0cyIsInJlYWQ6dG9rZW5zIiwicmVhZDp3b3JrZmxvd3MiLCJ1cGRhdGU6Y3VycmVudF91c2VyIiwid3JpdGU6YXBwcyIsIndyaXRlOmNhcnRvLWR3LWdyYW50cyIsIndyaXRlOmNvbm5lY3Rpb25zIiwid3JpdGU6aW1wb3J0cyIsIndyaXRlOmxpc3RlZF9hcHBzIiwid3JpdGU6bWFwcyIsIndyaXRlOnRva2VucyIsIndyaXRlOndvcmtmbG93cyJdfQ.FtoInGIENRlhsq3LkXZ1eJR2iPe8DQIhkC2CJl12bNYYoDcPJso_hoaJ5AKBT6YjXPDgW6tE_DqeoiMDczQXTKx7Fk3rUj0MpTfRTX6mxlhcyyKkKyjdA-5YSds1BjqrUJQfhOkmsQsYjBpKZ-O3nRC5x-fn_iIW_2as1mQ5n2Zu7jzAE5H_8Ep4UYydaFh9-nIvGkb9pJ_GnU2DVZOT8DMKqGaa-Vt_bONMgSAGP61xrufBGRlnBs-cbXRUb0n3giq57hB9gyhH_Im_YjmieiXEflO9mdL-QIPeDkk16KRETOIJLTWjBUOPSFyyS3OTm9R7kzPIsanF7LzRNXZsYg';

deck.carto.setDefaultCredentials({
  apiBaseUrl: 'https://gcp-europe-west1.api.carto.com',
  accessToken
});

const spinner = document.getElementById('spinner');
const loadingInfo = document.getElementById('loading-info');

const deckgl = new deck.DeckGL({
  container: "basemap",
  map: maplibregl,
  mapStyle: deck.carto.BASEMAP.VOYAGER,
  initialViewState: {
    latitude: 40,
    longitude:...