25

I have 4 days of experience with Google Maps Javascript API and i find their documentation and information sharing confusing at best.

Does anyone have experience or knowledge on how to draw polygons/polylines on a google map (using Javascript API V3) similar to this example? (which i found on this blogPost from 2008)

So far as my research can tell me the example uses the Javascript API V2 directly or uses the GeometryControl utility library from V2 (which can be found here for reference). I cannot seem to find if the Javascript API V3 has any way of allowing such interface.

I will be continuing my research but would appreciate any helpful comment or link or suggestion. Even if you point me in the correct direction for further research. :)

Lightness Races in Orbit
  • 378,754
  • 76
  • 643
  • 1,055
David 'the bald ginger'
  • 1,296
  • 3
  • 20
  • 38

6 Answers6

22

After much research i came across this example. Which, after discovering it and googling it, seems the general answer to questions like mine. This is very basic but correct according to the V3 API.

Using the code in this example i am successfully building a prototype that i need. The code is basic but i have found that it can be extended to better fit my specifications, which is good.

The link provided in my comment to plexer's answer would be the best solution but the person developing it states that it is still under development and thus not stable enough for use in release applications.

David 'the bald ginger'
  • 1,296
  • 3
  • 20
  • 38
  • 1
    your example is not working, can you provide another working URL – HKumar Feb 14 '17 at 12:05
  • This answer and related link was given over 6years ago. From what I understand Google has since then done some decent work on drawing tool capability in the maps "API". I suggest visiting https://developers.google.com and see what's up. – David 'the bald ginger' Feb 15 '17 at 10:57
12

For Google Maps v3.7, you can use Drawing Library

Another good library: polygonEdit/polylineEdit by ryshkin@gmail.com

helmi03
  • 169
  • 1
  • 7
  • 2
    @Phaed: The polygonEdit link you are recommending is flagged as a Phishing site by Comodo: Site may be criminally fraudulent attempting to collect your personal information by masquerading as a legitimate site. This website has been reported as unsafe by various users and we do NOT recommend you to continue browsing. – Yster Apr 27 '15 at 08:25
5

Take a look at my script for curved lines: http://curved_lines.overfx.net/

Here are the functions that I use:

function curved_line_generate(LatStart, LngStart, LatEnd, LngEnd, Color, Horizontal, Multiplier) {

  var LastLat = LatStart;
  var LastLng = LngStart;

  var PartLat;
  var PartLng;

  var Points = new Array(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9);
  var PointsOffset = new Array(0.2, 0.35, 0.5, 0.55, 0.60, 0.55, 0.5, 0.35, 0.2);

  var OffsetMultiplier = 0;

  if (Horizontal == 1) {
    var OffsetLenght = (LngEnd - LngStart) * 0.1;
  } else {
    var OffsetLenght = (LatEnd - LatStart) * 0.1;
  }

  for (var i = 0; i < Points.length; i++) {
    if (i == 4) {
      OffsetMultiplier = 1.5 * Multiplier;
    }

    if (i >= 5) {
      OffsetMultiplier = (OffsetLenght * PointsOffset[i]) * Multiplier;
    } else {
      OffsetMultiplier = (OffsetLenght * PointsOffset[i]) * Multiplier;
    }

    if (Horizontal == 1) {
      PartLat = (LatStart + ((LatEnd - LatStart) * Points[i])) + OffsetMultiplier;
      PartLng = (LngStart + ((LngEnd - LngStart) * Points[i]));
    } else {
      PartLat = (LatStart + ((LatEnd - LatStart) * Points[i]));
      PartLng = (LngStart + ((LngEnd - LngStart) * Points[i])) + OffsetMultiplier;
    }

    curved_line_create_segment(LastLat, LastLng, PartLat, PartLng, Color);

    LastLat = PartLat;
    LastLng = PartLng;
  }

  curved_line_create_segment(LastLat, LastLng, LatEnd, LngEnd, Color);

}

function curved_line_create_segment(LatStart, LngStart, LatEnd, LngEnd, Color) {
  var LineCordinates = new Array();

  LineCordinates[0] = new google.maps.LatLng(LatStart, LngStart);
  LineCordinates[1] = new google.maps.LatLng(LatEnd, LngEnd);

  var Line = new google.maps.Polyline({
    path: LineCordinates,
    geodesic: false,
    strokeColor: Color,
    strokeOpacity: 1,
    strokeWeight: 3
  }); 

  Line.setMap(map);
}

Here is your html content + initializing script:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">

  var map;
  google.maps.event.addDomListener(window, 'load', initialize);

  function initialize() {

    /* Create Google Map */ 

    var myOptions = {
      zoom: 6,
      center: new google.maps.LatLng(41, 19.6),
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    map = new google.maps.Map(document.getElementById('map_canvas'), myOptions);

    /* Add Sample Lines */

    /* Sofia - Burgas */
    curved_line_generate(42.68243562027229, 23.280029421875042, 42.488302202180364, 27.432861453125042,"#F00", true, 1);

    /* Sofia - Varna */
    curved_line_generate(42.68243562027229, 23.280029421875042, 43.19716750254011, 27.894287234375042,"#1a8809", true, 1);

    /* Ancona - Sofia */
    curved_line_generate(43.61221698671215, 13.458252078125042,42.68243562027229, 23.280029421875042, "#00F", true, 1);

    /* Sofia - Florence */
    curved_line_generate(42.68243562027229, 23.280029421875042, 43.73935229722859, 11.217041140625042,"#666", true, 1);

    /* Sofia - Athens */
    curved_line_generate(42.68243562027229, 23.280029421875042, 37.97884527841534, 23.719482546875042,"#ffa200", false, 2);
  }

</script>
Walery Strauch
  • 6,792
  • 8
  • 50
  • 57
Daniel Nanovski
  • 201
  • 4
  • 3
4

Take a look at this example, from the Maps API v3 examples page:

http://code.google.com/apis/maps/documentation/javascript/examples/polyline-complex.html

The code listens to clicks on the map, and on each click adds an extra lat/lng pair into the array of a polyline. This results in a polyline which joins each clicked point.

Extending this to polygon should be relatively simple. At some point you will need to close the polygon. You could do this by listening to a click on the polygon or a marker (indicating an intersection) or by having a button the user can click, and setting the polygon to autoclose.

plexer
  • 4,542
  • 2
  • 23
  • 27
  • thanks for the info plexer. I found two things of interest, one which i will mark as an 'answer' to the question. But FYI look at http://www.shanetomlinson.com/2010/enabledrawing-enableediting-for-gmap-v3/ and his example. Its still a bit unstable so not the best solution but he seems to be heading in the right direction. – David 'the bald ginger' Aug 11 '10 at 08:49
  • Just an update - the above comment link no longer works. So [HERE](https://shanetomlinson.com/2010/enabledrawing-enableediting-for-gmap-v3/) seems to be the updated version. :) – David 'the bald ginger' Mar 10 '14 at 09:41
3

I found this one quite easy.. You can draw polygons, can find their length and its quite easy.. http://geojason.info/demos/line-length-polygon-area-google-maps-v3/

here is a bit of code in case link goes down.

var map;

// Create a meausure object to store our markers, MVCArrays, lines and polygons
var measure = {
  mvcLine: new google.maps.MVCArray(),
  mvcPolygon: new google.maps.MVCArray(),
  mvcMarkers: new google.maps.MVCArray(),
  line: null,
  polygon: null
};

// When the document is ready, create the map and handle clicks on it
jQuery(document).ready(function() {

  map = new google.maps.Map(document.getElementById("map"), {
    zoom: 15,
    center: new google.maps.LatLng(39.57592, -105.01476),
    mapTypeId: google.maps.MapTypeId.ROADMAP,
    draggableCursor: "crosshair" // Make the map cursor a crosshair so the user thinks they should click something
  });

  google.maps.event.addListener(map, "click", function(evt) {
    // When the map is clicked, pass the LatLng obect to the measureAdd function
    measureAdd(evt.latLng);
  });

});

function measureAdd(latLng) {

  // Add a draggable marker to the map where the user clicked
  var marker = new google.maps.Marker({
      map: map,
      position: latLng,
      draggable: true,
      raiseOnDrag: false,
      title: "Drag me to change shape",
      icon: new google.maps.MarkerImage(
        "/images/demos/markers/measure-vertex.png", 
        new google.maps.Size(9, 9),
        new google.maps.Point(0, 0),
        new google.maps.Point(5, 5)
      )
  });

  // Add this LatLng to our line and polygon MVCArrays
  // Objects added to these MVCArrays automatically update the line and polygon shapes on the map
  measure.mvcLine.push(latLng);
  measure.mvcPolygon.push(latLng);

  // Push this marker to an MVCArray
  // This way later we can loop through the array and remove them when measuring is done
  measure.mvcMarkers.push(marker);

  // Get the index position of the LatLng we just pushed into the MVCArray
  // We'll need this later to update the MVCArray if the user moves the measure vertexes
  var latLngIndex = measure.mvcLine.getLength() - 1;

  // When the user mouses over the measure vertex markers, change shape and color to make it obvious they can be moved
  google.maps.event.addListener(marker, "mouseover", function() {
    marker.setIcon(
      new google.maps.MarkerImage("/images/demos/markers/measure-vertex-hover.png",
        new google.maps.Size(15, 15), 
        new google.maps.Point(0, 0), 
        new google.maps.Point(8, 8)
      )
    );
  });

  // Change back to the default marker when the user mouses out
  google.maps.event.addListener(marker, "mouseout", function() {
    marker.setIcon(
      new google.maps.MarkerImage(
        "/images/demos/markers/measure-vertex.png",
        new google.maps.Size(9, 9),
        new google.maps.Point(0, 0),
        new google.maps.Point(5, 5)
      )
    );
  });

  // When the measure vertex markers are dragged, update the geometry of the line and polygon by resetting the
  //     LatLng at this position
  google.maps.event.addListener(marker, "drag", function(evt) {
    measure.mvcLine.setAt(latLngIndex, evt.latLng);
    measure.mvcPolygon.setAt(latLngIndex, evt.latLng);
  });

  // When dragging has ended and there is more than one vertex, measure length, area.
  google.maps.event.addListener(marker, "dragend", function() {
    if (measure.mvcLine.getLength() > 1) {
      measureCalc();
    }
  });

  // If there is more than one vertex on the line
  if (measure.mvcLine.getLength() > 1) {

    // If the line hasn't been created yet
    if (!measure.line) {

      // Create the line (google.maps.Polyline)
      measure.line = new google.maps.Polyline({
        map: map,
        clickable: false,
        strokeColor: "#FF0000",
        strokeOpacity: 1,
        strokeWeight: 3,
        path:measure. mvcLine
      });

    }

    // If there is more than two vertexes for a polygon
    if (measure.mvcPolygon.getLength() > 2) {

      // If the polygon hasn't been created yet
      if (!measure.polygon) {

        // Create the polygon (google.maps.Polygon)
        measure.polygon = new google.maps.Polygon({
          clickable: false,
          map: map,
          fillOpacity: 0.25,
          strokeOpacity: 0,
          paths: measure.mvcPolygon
        });

      }

    }

  }

  // If there's more than one vertex, measure length, area.
  if (measure.mvcLine.getLength() > 1) {
      measureCalc();
  }
}
Walery Strauch
  • 6,792
  • 8
  • 50
  • 57
Raza Ahmed
  • 2,661
  • 2
  • 35
  • 46
  • Thanks TheRaaaZ for the code. I will be touching Geo-location projects soon and this will definitely help to get back on the ball. It does seem that a few things have changed and i assume much of it ha been due to their major upgrades of Google Maps in general of late? – David 'the bald ginger' Jul 16 '13 at 07:18
2

This looks to be the closest implementation to the polygon editor I've found: http://snipplr.com/view/38270/google-maps-api-v3--enableediting-polylines/

Kevin
  • 11,521
  • 22
  • 81
  • 103