Drawing Tools

by Christian Bonato

HTML

<div id="map"></div>
<!-- Replace the value of the key parameter with your own API key. -->
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&libraries=drawing"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/src/maplabel.js"></script>

CSS

html,
body,
#map {
  height: 100%;
  margin: 0;
  padding: 0;
}

JavaScript

var labels = [];
var allOverlays = [];

function setSelection(shape) {
  selectedShape = shape;
  shape.setEditable(true);
}

function initMap() {
  var options = {
    zoom: 14,
    center: {
      lat: 52.250618,
      lng: 20.9774
    }
  };

  var map = new google.maps.Map(document.getElementById("map"), options);

  var drawingManager = new google.maps.drawing.DrawingManager({
    polygonOptions: {
      draggable: false,
      fillColor: "#5C6BC0",
      fillOpacity: 0.45,
      strokeWeight: 0,
      editable: true,
      zIndex: 1
    },
    drawingControl: true,
    drawingControlOptions: {
      position: google.maps.ControlPosition.TOP_CENTER,
      drawingModes: ["polygon"]
    },
    map: map,
    drawingMode: 'polygon'
  });

  function attachPolygonInfoWindow(polygon) {
    if (!polygon.labels) polygon.labels = [];
    for (var i = 0; i < polygon.labels.length; i++) {
      polygon.labels[i].setMap(null);
    }
    polygon.labels = [];
    var path = polygon.getPath();
    var points = path.getArray();
    var area = google.maps.geometry.spherical
      .computeArea(path.getArray())
      .toFixed(0);
    var bounds = new google.maps.LatLngBounds();
    var i;

    for (i = 0; i < points.length; i++) {
      bounds.extend(points[i]);
    }

    var boundsCenter = bounds.getCenter();
    var centerLabel = new MapLabel({
      map: map,
      fontSize: 20,
      align: "left"
    });

    polygon.labels.push(centerLabel);

    centerLabel.set("position", bounds.getCenter());
    centerLabel.set("text", area + "m2");
    if (path.getLength() < 2) return;
    for (var i = 0; i < polygon.getPath().getLength(); i++) {
      // for each side in path, compute center and length
      var start = polygon.getPath().getAt(i);
      var end = polygon.getPath().getAt(i < polygon.getPath().getLength() - 1 ? i + 1 : 0);
      var sideLength = google.maps.geometry.spherical.computeDistanceBetween(start, end);
      var sideCenter =...