Interactive Demo

Draw polygons on the map and watch the event log update in real time. Every geometry change fires onDrawChange with the current GeoJSON.

Source

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>GeoCertaMap — Live Demo</title>
  <link rel="stylesheet" href="https://cdn.geocerta.io/geocerta-map/v0.1.0/geocerta-map.css" />
  <style>
    * { box-sizing: border-box; margin: 0; padding: 0; }
    body { display: flex; height: 100vh; font-family: sans-serif; overflow: hidden; }
    #map { flex: 1; }
    #event-log {
      width: 280px;
      display: flex;
      flex-direction: column;
      background: #0f172a;
      border-left: 1px solid #1e293b;
    }
    /* ... styles omitted for brevity, see CDN Installation for full CSS */
  </style>
</head>
<body>
  <div id="map"></div>
  <aside id="event-log">
    <header>
      <span>Event log</span>
      <button id="btn-clear-log">Clear</button>
    </header>
    <div id="messages"></div>
  </aside>

  <script src="https://cdn.geocerta.io/geocerta-map/v0.1.0/geocerta-map.umd.js"></script>
  <script>
    const messages = document.getElementById('messages');

    function log(eventName, cssClass, payload) {
      const time = new Date().toLocaleTimeString('en-GB', {
        hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit',
      });
      const el = document.createElement('div');
      el.className = 'msg';
      const payloadText = payload === undefined ? '' : '\n' + JSON.stringify(payload, null, 2);
      el.innerHTML =
        '<span class="msg-time">' + time + '</span> ' +
        '<span class="msg-event ' + cssClass + '">' + eventName + '</span>' +
        (payloadText ? '<div class="msg-payload">' + payloadText + '</div>' : '');
      messages.prepend(el);
    }

    const geomap = new GeoCertaMap.GeoCertaMap({
      container: '#map',
      center: [-0.118, 51.509],
      zoom: 12,
      toolbar: {
        modes: ['polygon', 'select'],
        position: 'top-right',
      },
      onReady:         ()  => log('ready',           'ready',    undefined),
      onFeatureCreate: (f) => log('feature:create',  'create',   { id: f.id, type: f.geometry.type }),
      onFeatureUpdate: (f) => log('feature:update',  'update',   { id: f.id }),
      onFeatureDelete: (f) => log('feature:delete',  'delete',   { id: f.id }),
      onModeChange:    (m) => log('mode:change',     'mode',     m),
      onDrawChange:    (g) => log('geometry:change', 'geometry', g),
    });

    document.getElementById('btn-clear-log').addEventListener('click', () => {
      messages.innerHTML = '';
    });
  </script>
</body>
</html>