Multiple markers Google Map API v3 from array of addresses and avoid OVER_QUERY_LIMIT while geocoding on pageLoad

前端 未结 3 1814
误落风尘
误落风尘 2020-11-27 10:47

I have to implement the multiple markers functionality from array of addresses. The string of addresses are being fetched from the database.

My array of addresses lo

相关标签:
3条回答
  • 2020-11-27 11:26

    Here is my solution:

    dependencies: Gmaps.js, jQuery

    var Maps = function($) {
       var lost_addresses = [],
           geocode_count  = 0;
    
       var addMarker = function() { console.log('Marker Added!') };
    
       return {
         getGecodeFor: function(addresses) {
            var latlng;
            lost_addresses = [];
            for(i=0;i<addresses.length;i++) {
              GMaps.geocode({
                address: addresses[i],
                callback: function(response, status) {
                  if(status == google.maps.GeocoderStatus.OK) {
                    addMarker();
                  } else if(status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                    lost_addresses.push(addresses[i]);
                  }
    
                   geocode_count++;
                   // notify listeners when the geocode is done
                   if(geocode_count == addresses.length) {
                     $.event.trigger({ type: 'done:geocoder' });
                   }
                }
              });
            }
         },
         processLostAddresses: function() {
           if(lost_addresses.length > 0) {
             this.getGeocodeFor(lost_addresses);
           }
         }
       };
    }(jQuery);
    
    Maps.getGeocodeFor(address);
    
    // listen to done:geocode event and process the lost addresses after 1.5s
    $(document).on('done:geocode', function() {
      setTimeout(function() {
        Maps.processLostAddresses();
      }, 1500);
    });
    
    0 讨论(0)
  • 2020-11-27 11:37

    Answer to add multiple markers.

    UPDATE (GEOCODE MULTIPLE ADDRESSES)

    Here's the working Example Geocoding with multiple addresses.

     <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false">
     </script> 
     <script type="text/javascript">
      var delay = 100;
      var infowindow = new google.maps.InfoWindow();
      var latlng = new google.maps.LatLng(21.0000, 78.0000);
      var mapOptions = {
        zoom: 5,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
      }
      var geocoder = new google.maps.Geocoder(); 
      var map = new google.maps.Map(document.getElementById("map"), mapOptions);
      var bounds = new google.maps.LatLngBounds();
    
      function geocodeAddress(address, next) {
        geocoder.geocode({address:address}, function (results,status)
          { 
             if (status == google.maps.GeocoderStatus.OK) {
              var p = results[0].geometry.location;
              var lat=p.lat();
              var lng=p.lng();
              createMarker(address,lat,lng);
            }
            else {
               if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                nextAddress--;
                delay++;
              } else {
                            }   
            }
            next();
          }
        );
      }
     function createMarker(add,lat,lng) {
       var contentString = add;
       var marker = new google.maps.Marker({
         position: new google.maps.LatLng(lat,lng),
         map: map,
               });
    
      google.maps.event.addListener(marker, 'click', function() {
         infowindow.setContent(contentString); 
         infowindow.open(map,marker);
       });
    
       bounds.extend(marker.position);
    
     }
      var locations = [
               'New Delhi, India',
               'Mumbai, India',
               'Bangaluru, Karnataka, India',
               'Hyderabad, Ahemdabad, India',
               'Gurgaon, Haryana, India',
               'Cannaught Place, New Delhi, India',
               'Bandra, Mumbai, India',
               'Nainital, Uttranchal, India',
               'Guwahati, India',
               'West Bengal, India',
               'Jammu, India',
               'Kanyakumari, India',
               'Kerala, India',
               'Himachal Pradesh, India',
               'Shillong, India',
               'Chandigarh, India',
               'Dwarka, New Delhi, India',
               'Pune, India',
               'Indore, India',
               'Orissa, India',
               'Shimla, India',
               'Gujarat, India'
      ];
      var nextAddress = 0;
      function theNext() {
        if (nextAddress < locations.length) {
          setTimeout('geocodeAddress("'+locations[nextAddress]+'",theNext)', delay);
          nextAddress++;
        } else {
          map.fitBounds(bounds);
        }
      }
      theNext();
    
    </script>
    

    As we can resolve this issue with setTimeout() function.

    Still we should not geocode known locations every time you load your page as said by @geocodezip

    Another alternatives of these are explained very well in the following links:

    How To Avoid GoogleMap Geocode Limit!

    Geocode Multiple Addresses Tutorial By Mike Williams

    Example by Google Developers

    0 讨论(0)
  • 2020-11-27 11:44

    Regardless of your situation, heres a working demo that creates markers on the map based on an array of addresses.

    http://jsfiddle.net/P2QhE/

    Javascript code embedded aswell:

    $(document).ready(function () {
        var map;
        var elevator;
        var myOptions = {
            zoom: 1,
            center: new google.maps.LatLng(0, 0),
            mapTypeId: 'terrain'
        };
        map = new google.maps.Map($('#map_canvas')[0], myOptions);
    
        var addresses = ['Norway', 'Africa', 'Asia','North America','South America'];
    
        for (var x = 0; x < addresses.length; x++) {
            $.getJSON('http://maps.googleapis.com/maps/api/geocode/json?address='+addresses[x]+'&sensor=false', null, function (data) {
                var p = data.results[0].geometry.location
                var latlng = new google.maps.LatLng(p.lat, p.lng);
                new google.maps.Marker({
                    position: latlng,
                    map: map
                });
    
            });
        }
    
    }); 
    
    0 讨论(0)
提交回复
热议问题