---
title: "How to trigger actions in the AR control | Augmented reality | JavaScript maps SDK"
description: "Trigger AR map control actions using keyboard input."
---

> For AI agents: a documentation index is available at [/llms.txt](https://docs.maptiler.com/llms.txt). Markdown versions of all pages are available by appending .md to any URL.

# How to trigger actions in the AR control

Learn how to activate functions in the [Augmented reality (AR) control](https://docs.maptiler.com/sdk-js/modules/ar/) by utilizing the keyboard. This method will enable you to generate a three-dimensional viewport model through augmented reality (AR), which includes not only a 3D terrain but also any additional layers you have incorporated. This feature is compatible with both **WebXR** and **Apple Quick Look** platforms.

### NPM module setup

```bash
npm install --save @maptiler/sdk @maptiler/ar-control
```

#### main.js

```js
import { Map, MapStyle, config } from '@maptiler/sdk';
import '@maptiler/sdk/dist/maptiler-sdk.css';
import { MaptilerARControl } from '@maptiler/ar-control';

config.apiKey = 'YOUR_MAPTILER_API_KEY_HERE';

// Creating a map
const map = new Map({
  container: 'map',
  style: MapStyle.SATELLITE,
  zoom: 12,
  center: [-116.22335, 51.4117],
});

// Waiting for the map to be ready
map.on("load", (e) => {
  const arControl = new MaptilerARControl({
    showButton: false,
  });

  document.addEventListener('keypress', async (event) => {
    console.log(event.key);

    if (event.key === "a") {
      await arControl.run()
    }

    if (event.key === "q") {
      try{
        await arControl.close();
      } catch(e) {}
    }

  }, false);

  arControl.on("computeStart", (e) => {
    overlay.style.display = "inherit";
  })

  arControl.on("computeEnd", (e) => {
    overlay.style.display = "none";
  })

  map.addControl(arControl, "top-left");
})
```

#### index.html

```html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="robots" content="noindex">
  <title>How to trigger actions in the AR control | NPM example</title>
  <link rel="stylesheet" href="./style.css">
</head>
<body>
  <div id="overlay">
    <div class="blink_me">computing model</div>
  </div>

  <div id="instruction">
    <span>Press the <span class="key">A</span> key to show the AR model, and <span class="key">Q</span> to close it.</span>
  </div>

  <div id="map"></div>
  <script type="module" src="./main.js"></script>
</body>
</html>
```

#### style.css

```css
html, body {
  margin: 0;
}

#map {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 100%;
}

#overlay {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 100vw;
  height: 100vh;
  background-color: #ffffff;
  z-index: 3;
  display: none;
}

#overlay div {
  color: rgb(71, 76, 87);
  position: absolute;
  width: fit-content;
  height: fit-content;
  right: 0;
  left: 0;
  bottom: 0;
  top: 0;
  margin: auto;
  padding: 30px;
  font: 12px/20px Helvetica Neue,Arial,Helvetica,sans-serif;
}

.blink_me {
  animation: blinker 1s linear infinite;
}

@keyframes blinker {
  50% {
    opacity: 0.2;
  }
}

#instruction {
  z-index: 2;
  position: absolute;
  font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
  background: #fff;
  padding: 10px 25px;
  bottom: 25px;
  margin: auto;
  width: fit-content;
  height: fit-content;
  left: 0;
  right: 0;
  border-top-left-radius: 6px;
  border-top-right-radius: 6px;
  filter: drop-shadow(0 0 0.75rem #0005);
}

.key {
  background: #eeeee5;
  padding: 4px 9px;
  color: #5c5c53;
  border-radius: 3px;
  border: solid 1px #68685d;
  border-bottom-width: 2px;
}
```

### Basic JavaScript setup

```html
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>MapTiler AR Control</title>
    <script src="https://cdn.maptiler.com/maptiler-sdk-js/v4.2.0/maptiler-sdk.umd.min.js"></script>
    <link href="https://cdn.maptiler.com/maptiler-sdk-js/v4.2.0/maptiler-sdk.css" rel="stylesheet" />
    <script src="https://cdn.maptiler.com/maptiler-ar-control/v3.0.3/maptiler-ar-control.umd.min.js"></script>

    <style>
      html, body {
        margin: 0;
      }

      #map {
        position: absolute;
        top: 0;
        bottom: 0;
        width: 100%;
      }

      #overlay {
        position: absolute;
        top: 0;
        bottom: 0;
        width: 100vw;
        height: 100vh;
        background-color: #ffffff;
        z-index: 3;
        display: none;
      }

      #overlay div {
        color: rgb(71, 76, 87);
        position: absolute;
        width: fit-content;
        height: fit-content;
        right: 0;
        left: 0;
        bottom: 0;
        top: 0;
        margin: auto;
        padding: 30px;
        font: 12px/20px Helvetica Neue,Arial,Helvetica,sans-serif;
      }

      .blink_me {
        animation: blinker 1s linear infinite;
      }

      @keyframes blinker {
        50% {
          opacity: 0.2;
        }
      }

      #instruction {
        z-index: 2;
        position: absolute;
        font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
        background: #fff;
        padding: 10px 25px;
        bottom: 25px;
        margin: auto;
        width: fit-content;
        height: fit-content;
        left: 0;
        right: 0;
        border-top-left-radius: 6px;
        border-top-right-radius: 6px;
        filter: drop-shadow(0 0 0.75rem #0005);
      }

      .key {
        background: #eeeee5;
        padding: 4px 9px;
        color: #5c5c53;
        border-radius: 3px;
        border: solid 1px #68685d;
        border-bottom-width: 2px;
      }
    </style>
  </head>
  <body>
    <div id="overlay">
      <div class="blink_me">computing model</div>
    </div>

    <div id="instruction">
      <span>Press the <span class="key">A</span> key to show the AR model, and <span class="key">Q</span> to close it.</span>
    </div>

    <div id="map"></div>
    <script>
      maptilersdk.config.apiKey = 'YOUR_MAPTILER_API_KEY_HERE';
      
      // Creating a map
      const map = new maptilersdk.Map({
        container: 'map',
        style: maptilersdk.MapStyle.SATELLITE,
        zoom: 12,
        center: [-116.22335, 51.4117],
      });

      // Waiting for the map to be ready
      map.on("load", (e) => {
        const arControl = new maptilerarcontrol.MaptilerARControl({
          showButton: false,
        });

        document.addEventListener('keypress', async (event) => {
          console.log(event.key);

          if (event.key === "a") {
            await arControl.run()
          }

          if (event.key === "q") {
            try{
              await arControl.close();
            } catch(e) {}
          }

        }, false);

        arControl.on("computeStart", (e) => {
          overlay.style.display = "inherit";
        })

        arControl.on("computeEnd", (e) => {
          overlay.style.display = "none";
        })

        map.addControl(arControl, "top-left");
      })

    </script>
  </body>
</html>
```

## Related examples

### [Custom AR experience](https://docs.maptiler.com/sdk-js/examples/ar-control-custom/)

Examples

Customize the appearance of the augmented reality map control.

### [Add GeoJSON to AR maps](https://docs.maptiler.com/sdk-js/examples/ar-control-geojson-line/)

Examples

Display GeoJSON biking or hiking routes in AR maps.

### [Start with AR maps](https://docs.maptiler.com/sdk-js/examples/ar-control/)

Examples

Add an AR control button to map 3D viewports.

### [QR code to access AR maps](https://docs.maptiler.com/sdk-js/examples/ar-control-qr/)

Examples

Provide a QR code to access mobile AR maps.
