Edit: I added a stackblitz for this. It is my first so I hope it works.
https://stackblitz.com/edit/angular-dlabgk
I've been using google maps for several years and recently migrating every to AgmMaps. Recently I've seen a few questions about polygon drawing on the map and wanted to create a very simple demo. I added this to a working map project:
<agm-polygon [strokeColor]="'red'" [strokeWeight]="4" [paths]="polygonPts">
</agm-polygon>
Declared my array like this:
polygonPts: Array<google.maps.LatLng>[] = [];
Then in my mapReady function I added some valid points:
this.polygonPts = [
new google.maps.LatLng(34.85052636946416, -117.40498588867183),
new google.maps.LatLng(36.28034702299417,-112.48311088867183),
new google.maps.LatLng(39.87662851819041, -114.76826713867183),
new google.maps.LatLng(38.03141086161898,-121.18428276367183)
];
All worked as expected as it drew a polygon in the SW part of the USA. Next step was to extend it a bit so I could click on the map and add points. I added a handler on the agm-map element for mapClick:
(mapClick)="mapClick($event)"
And then added points to the array:
mapClick(e) {
let latlng = new google.maps.LatLng(e.coords.lat, e.coords.lng);
this.polygonPts.push(latlng);
this.ptsString = JSON.stringify(this.polygonPts);
}
I add the ptsString to the template so I could visually see that my array was growing but can't seem to get the map to update. I checked NgZone to make sure I'm in zone and also tried this.zone.run to no avail. The docs seem very clear that you can do this stating in the paths section: "Inserting or removing LatLngs from the Array will automatically update the polygon on the map."
I went through the example on StackBlitz (https://stackblitz.com/edit/agm-polygon?file=app%2Fapp.component.html) but that seemed really complicated and was trying to do it with a lot less code. Is that the only way or am I missing something?
After some experiments I narrowed the problem to using the push function on the array. I wish I could explain why using push was a problem but changing to the spread operator to add items to the array cured the issue.
I updated the mapClick() function to this:
let ll = new google.maps.LatLng(event.coords.lat, event.coords.lng);
this.polygonPts = [...this.polygonPts, ll];
this.ptsList = JSON.stringify(this.polygonPts);
I also updated the stackbltiz: https://stackblitz.com/edit/angular-dlabgk