简体   繁体   中英

InfoWindow on multiple marker on google maps is not working - angularjs

I am trying to implement a function like this maps: http://www.geocodezip.com/SO_OverQueryLimitC.html

However, I didn't manage to show the InfoWindow on it. I want to show the InfoWindow with data that has multiple exact location.

this is my code:

  1. html:

     <section id="GoogleMaps" ng-controller="MapsController"> <div class="container"> <div> <div id="map_canvas"></div> </div> </div> </section> 
  2. controller:

     .controller('MapsController', ['$scope', '$http', function ($scope, $http) { $scope.loadData = function () { var url = 'data/LatLng.json'; return $http.get(url).then(function (response) { return response.data; }); }; $scope.initMap = function (data) { var mapOptions = { zoom: 7, center: new google.maps.LatLng(3.9443, 101.6954), mapTypeId: google.maps.MapTypeId.ROADMAP } var map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions); var infowindow = new google.maps.InfoWindow(); var markers = []; var LatLng; var text; var marker; data.forEach(function (item) { var icons; LatLng = new google.maps.LatLng(item.LAT, item.LON); text = item.TYPE1; if (item.TYPE1 == '1' && item.TYPE2 == '1') { icons = 'http://www.googlemapsmarkers.com/v1/' + '1' + '/FD7567'; } else if (item.TYPE1 == '1' && item.TYPE2 == '2') { icons = 'http://www.googlemapsmarkers.com/v1/' + '2' + '/FD7567'; } else if (item.TYPE1 == '1' && item.TYPE2 == '3') { icons = 'http://www.googlemapsmarkers.com/v1/' + '3' + '/FD7567'; } else if (item.TYPE1 == '2' && item.TYPE2 == '1') { icons = 'http://www.googlemapsmarkers.com/v1/' + '1' + '/6991FD'; } else if (item.TYPE1 == '2' && item.TYPE2 == '2') { icons = 'http://www.googlemapsmarkers.com/v1/' + '2' + '/6991FD'; } else { icons = 'http://www.googlemapsmarkers.com/v1/' + '3' + '/6991FD'; } marker = new google.maps.Marker({ position: LatLng, icon: icons, clickable: true, }); markers.push(marker); }); var options = { imagePath: 'images/m' }; var markerCluster = new MarkerClusterer(map, markers, options); ///get array of markers currently in cluster var allMarkers = markerCluster.getMarkers(); //check to see if any of the existing markers match the latlng of the new marker if (allMarkers.length != 0) { for (var i = 0; i < allMarkers.length; i++) { var existingMarker = allMarkers[i]; var pos = existingMarker.getPosition(); if (LatLng.equals(pos)) { text = text + " & " + text; } } } google.maps.event.addListener(marker, 'click', function () { console.log('hi'); //return nothing infowindow.close(); infowindow.setContent(text); infowindow.open(map, marker); }); markerCluster.addMarker(marker); return marker; }; $scope.loadData() .then($scope.initMap); }]) 
  3. scripts:

     addTag('script', { src: 'http://maps.googleapis.com/maps/api/js' }, sync); addTag('script', { src: 'assets/js/markerclusterer.js' }, sync); 

Update: I tried to add console.log() inside click event, but it shows nothing. When I clicked, it did not go to the function.

Any ideas how to solve it?

Thank You.

In order to display info window once the MarkerClusterer is clicked, the following changes needs to be applied:

1) set zoomOnClick to false to disable default click handler:

var options = {
 zoomOnClick: false
};

2) register custom click event handler for MarkerClusterer object:

 google.maps.event.addListener(markerCluster, "click", function (mCluster) {
     infowindow.setContent("<h2>Some content goes here...</h2>");
     infowindow.setPosition(mCluster.getCenter());
     infowindow.open(map);
 });

Example

Update : has been updated to demonstrate how to handle marker click event

 angular.module('MapsApp', []) .controller('MapsController', ['$scope', '$http', function ($scope, $http) { $scope.loadData = function () { var url = 'https://gist.githubusercontent.com/vgrem/2bea7539ff81168adf2a0bb8056972c3/raw/LatLng.json'; return $http.get(url).then(function (response) { return response.data; }); }; var createMarker = function (map, pos,infowindow,content) { var marker = new google.maps.Marker({ position: pos, map: map }); google.maps.event.addListener(marker, 'click', function () { infowindow.close(); infowindow.setContent(content); infowindow.open(map, marker); }); return marker; } $scope.initMap = function (data) { var mapOptions = { zoom: 4, center: new google.maps.LatLng(39.8282, -98.5795), mapTypeId: google.maps.MapTypeId.ROADMAP } var map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions); var infowindow = new google.maps.InfoWindow(); var markers = data.map(function (value,idx) { var coords = value.split(","); var latlng = new google.maps.LatLng(parseFloat(coords[0]), parseFloat(coords[1])); return createMarker(map, latlng,infowindow,'Info for marker ' + idx ); }); var options = { imagePath: 'https://cdn.rawgit.com/googlemaps/v3-utility-library/master/markerclustererplus/images/m', //zoomOnClick: false }; var markerCluster = new MarkerClusterer(map, markers, options); /*google.maps.event.addListener(markerCluster, "click", function (mCluster) { infowindow.setContent("<h2>Some content goes here...</h2>"); infowindow.setPosition(mCluster.getCenter()); infowindow.open(map); });*/ }; $scope.loadData() .then($scope.initMap); }]); 
 #map_canvas { height: 420px; width: 100%; margin: 0; padding: 0; } 
 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script> <script type="text/javascript" src="http://maps.google.com/maps/api/js"></script> <script src="https://cdn.rawgit.com/googlemaps/v3-utility-library/master/markerclustererplus/src/markerclusterer.js"></script> <section ng-app="MapsApp" ng-controller="MapsController"> <div class="container"> <div> <div id="map_canvas"></div> </div> </div> </section> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM