0

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.

avdnowhere
  • 177
  • 2
  • 16

1 Answers1

0

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>
Vadim Gremyachev
  • 57,952
  • 20
  • 129
  • 193
  • thanks for your reply, however I want to implement like this answer: http://stackoverflow.com/a/17710624/1903766. So the info window will pop up when click on the marker, but if the marker has more than one with same location, it will pop up more than one data. You can see the example on this site: http://www.geocodezip.com/SO_OverQueryLimitC.html. Thank You. – avdnowhere Feb 10 '17 at 00:09
  • @CoolTips2u, the example has been updated to demonstrate how to handle click event – Vadim Gremyachev Feb 10 '17 at 12:58