Desenhar o polígono com o rato no google maps

preciso desenhar o polígono usando o rato e marcar uma área específica no Google maps. O objetivo é marcar uma área no Google maps e, em seguida, mostrar hotéis e atrações nessa área. O usuário marcará os hotéis no Google map enquanto os cria para que o db tenha sua latitude e longitudes.

Como posso desenhar o polígono e preenchê-lo com uma cor como fundo para marcar a área no Google Maps? Li o Manual da API " como desenhar polígonos?"basicamente você precisa marque vários pontos e depois combine-os num polígono. Mas eu vou precisar fazer isso usando o arrasto do mouse, assim como desenhar uma forma. Por favor, ajude-me a conseguir isto.

Author: Drew Noakes, 2010-02-24

9 answers

Pode usar as ferramentas de edição do polígono do Google MyMaps na sua aplicação, talvez isto esteja bem para si?

Ver http://googlemapsapi.blogspot.com/2008/05/love-my-maps-use-its-line-and-shape.html

No entanto, se você quiser implementar isso você mesmo é basicamente isto:

Adicionar carregue em ouvinte ao mapa.

Repetir: armazenar pontos que o usuário clica em um array, e adicionar um marcador neste ponto. se for o primeiro marcador, adicione o ouvinte ao click it

Quando o utilizador clica no primeiro marcador, analisar use a lista de pontos para construir o seu polígono

Não tenho nenhum código para vos mostrar, mas eu próprio implementei isto numa empresa anterior, para que possa ser feito:)

 16
Author: Richard, 2010-02-24 12:10:24

Aqui está algum código (para a API JavaScript do Google Maps versão 3) que consegue o que você quer. Ele suporta:

  • clicando para adicionar vértices.
  • clicando no primeiro vértice novamente para fechar o caminho.
  • Arrastar vértices.
É indocumentado, mas espero que consigas ver o que está a fazer com facilidade.
$(document).ready(function () {
    var map = new google.maps.Map(document.getElementById('map'), { center: new google.maps.LatLng(21.17, -86.66), zoom: 9, mapTypeId: google.maps.MapTypeId.HYBRID, scaleControl: true });
    var isClosed = false;
    var poly = new google.maps.Polyline({ map: map, path: [], strokeColor: "#FF0000", strokeOpacity: 1.0, strokeWeight: 2 });
    google.maps.event.addListener(map, 'click', function (clickEvent) {
        if (isClosed)
            return;
        var markerIndex = poly.getPath().length;
        var isFirstMarker = markerIndex === 0;
        var marker = new google.maps.Marker({ map: map, position: clickEvent.latLng, draggable: true });
        if (isFirstMarker) {
            google.maps.event.addListener(marker, 'click', function () {
                if (isClosed)
                    return;
                var path = poly.getPath();
                poly.setMap(null);
                poly = new google.maps.Polygon({ map: map, path: path, strokeColor: "#FF0000", strokeOpacity: 0.8, strokeWeight: 2, fillColor: "#FF0000", fillOpacity: 0.35 });
                isClosed = true;
            });
        }
        google.maps.event.addListener(marker, 'drag', function (dragEvent) {
            poly.getPath().setAt(markerIndex, dragEvent.latLng);
        });
        poly.getPath().push(clickEvent.latLng);
    });
});
 25
Author: Drew Noakes, 2011-11-10 04:15:51

A API JavaScript do Google Maps v3 fornece uma biblioteca de desenho, http://code.google.com/apis/maps/documentation/javascript/overlays.html#drawing_tools

Só precisa de activar as ferramentas de desenho (como mostra o exemplo nos documentos) e adicionar ouvintes de eventos para a criação de tipos de sobreposição (como é mostrado na secção "desenhar eventos").

Um exemplo rápido da sua utilização seria:: http://gmaps-samples-v3.googlecode.com/svn/trunk/drawing/drawing-tools.html

 19
Author: Michael Hellein, 2012-06-26 17:39:54

Poderá querer verificar os controlos de geometriada biblioteca de utilidade GMaps.

Para mais referências, pode querer ver a referência dos GeometryControls .

 9
Author: Daniel Vassallo, 2015-08-20 02:26:12

Os novos motores de mapa Lite é exatamente a ferramenta que você está procurando Eu acho: https://mapsengine.google.com/map/

 3
Author: Steve Midgley, 2013-07-28 01:53:04
Fiz um exemplo para mim. o código está abaixo e também jsfiddle é avaible
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&libraries=drawing&callback=initMap" async defer></script>

<script>

function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
center: {
  lat: -34.397,
  lng: 150.644
},
zoom: 8
});

var drawingManager = new google.maps.drawing.DrawingManager({
drawingMode: google.maps.drawing.OverlayType.POLYGON,
drawingControl: false,
drawingControlOptions: {
  position: google.maps.ControlPosition.TOP_CENTER,
  drawingModes: ['polygon', 'circle']
},
polygonOptions: {
  editable: true
}

});
drawingManager.setMap(map);

google.maps.event.addListener(drawingManager, 'overlaycomplete', 
function(event) {
event.overlay.set('editable', false);
drawingManager.setMap(null);
console.log(event.overlay);
});

}
</script>

Https://jsfiddle.net/zgmdvsrz/

Poderá definir o drawingcontrol como true se quiser mostrar o Gestor de desenho

 2
Author: Okan SARICA, 2016-10-28 06:37:24

Existe uma porta das ferramentas de desenho da API v2 para a API v3 @ http://nettique.free.fr/gmap/toolbar.html

 1
Author: Dennis, 2013-01-04 16:28:10

Usei o seguinte código para desenhar o polígono num mapa

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<meta charset="UTF-8">
<title>Drawing Tools</title>
<script type="text/javascript"  src="http://maps.google.com/maps/api/js?sensor=false&libraries=drawing"></script>
<style type="text/css">
  #map, html, body {
    padding: 0;
    margin: 0;
    height: 100%;
  }
  #panel {
    width: 200px;
    font-family: Arial, sans-serif;
    font-size: 13px;
    float: right;
    margin: 10px;
  }
  #color-palette {
    clear: both;
  }
  .color-button {
    width: 14px;
    height: 14px;
    font-size: 0;
    margin: 2px;
    float: left;
    cursor: pointer;
  }
  #delete-button {
    margin-top: 5px;
  }
  #map_canvas {
   height: 100%;
   width: 100%;
   margin: 0px;
   padding: 0px
 }

</style>
<script type="text/javascript">
 var geocoder;
 var map;
 var all_overlays = [];

 function initialize() {
     var map = new google.maps.Map(
     document.getElementById("map_canvas"), {
     center: new google.maps.LatLng(37.4419, -122.1419),
     zoom: 13,
     mapTypeId: google.maps.MapTypeId.ROADMAP
     });

var polyOptions = {
     strokeWeight: 0,
     fillOpacity: 0.45,
     editable: true,
     fillColor: '#FF1493'
   };
var selectedShape;

 var drawingManager = new google.maps.drawing.DrawingManager({
           drawingMode: google.maps.drawing.OverlayType.POLYGON,
           drawingControl: false,
           markerOptions: {
           draggable: true
       },
    polygonOptions: polyOptions
     });

  $('#enablePolygon').click(function() {
         drawingManager.setMap(map);
        drawingManager.setDrawingMode(google.maps.drawing.OverlayType.POLYGON);
  });

   $('#resetPolygon').click(function() {
        if (selectedShape) {
             selectedShape.setMap(null);
           }
        drawingManager.setMap(null);
        $('#showonPolygon').hide();
        $('#resetPolygon').hide();
    });

    google.maps.event.addListener(drawingManager, 'polygoncomplete', 

   function(polygon) {
         //  var area = google.maps.geometry.spherical.computeArea(selectedShape.getPath());
        //  $('#areaPolygon').html(area.toFixed(2)+' Sq meters');
      $('#resetPolygon').show();
    });

  function clearSelection() {
      if (selectedShape) {
            selectedShape.setEditable(false);
            selectedShape = null;
         }
    }


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

google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) {
all_overlays.push(e);
if (e.type != google.maps.drawing.OverlayType.MARKER) {
  // Switch back to non-drawing mode after drawing a shape.
  drawingManager.setDrawingMode(null);

  // Add an event listener that selects the newly-drawn shape when the user
  // mouses down on it.
  var newShape = e.overlay;
  newShape.type = e.type;
  google.maps.event.addListener(newShape, 'click', function() {
    setSelection(newShape);
  });
  setSelection(newShape);
   }
 });

 google.maps.event.addListener(drawingManager, 'polygoncomplete', function (polygon) {
var coordinates = (polygon.getPath().getArray());
console.log(coordinates);
alert(coordinates);
 });
}
 google.maps.event.addDomListener(window, "load", initialize);
</script>
</head>
   <body>
    <input type="button" id="enablePolygon" value="Calculate Area" />
    <input type="button" id="resetPolygon" value="Reset" style="display: none;" />
   <div id="showonPolygon" style="display:none;"><b>Area:</b> <span 
     id="areaPolygon">&nbsp;</span></div>
     <div id="map_canvas"></div>
     </html>

Resultado :enter image description here

 1
Author: Kishor N R, 2017-12-01 03:41:48
Houve algumas melhorias significativas no google.mapa.polígono desde que esta pergunta foi feita pela primeira vez. Aqui está uma implementação simples, usando todo o Google nativo.mapas V3 ferramentas. (Nota:Há um trabalho wonky JavaScript scope por aqui... mas funciona...)
var listener1 = google.maps.event.addListener(map, "click", function(e) {
    var latLng = e.latLng;
    var myMvcArray = new google.maps.MVCArray();
    myMvcArray.push(latLng); // First Point
    var myPolygon = new google.maps.Polygon({
        map: map,
        paths: myMvcArray, // one time registration reqd only
        strokeColor: "#FF0000",
        strokeOpacity: 1.0,
        strokeWeight: 2,
        fillColor: "#FF0000",
        fillOpacity: 0.10,
        editable: true,
        draggable: false,
        clickable: true
    });
    google.maps.event.removeListener(listener1);

    var listener2 = google.maps.event.addListener(map, 'click', function(e) {
        latLng = e.latLng;
        myMvcArray.push(latLng);
        myMvcArray.getArray().forEach(function(value, index) {
            console.log(" index: " + index + "    value: " + value);
        })
    });
});
Resposta com novo código enviado para a pergunta antiga, caso mais alguém chegue aqui!
 0
Author: zipzit, 2016-06-08 15:58:49