Question

I have about 10K city, st, zip rows. I need the Lat/Long for them. I have tried a few different addins, but they all use Google. I have heard Yahoo has a little bit more generous limitations but i cannot find any as well written as the Google ones. Is there any free batch geocoders for excel that have high limits(at least 10K a day requests)? or am i just wanderlust?

Était-ce utile?

La solution

Use this code, it worked for me, i found it online when i had same issue you may need to twist it to match your specific requirements as well as to feed the address array from excel.

// delay between geocode requests - at the time of writing, 100 miliseconds seems to work well
var delay = 40;


  // ====== Create map objects ======
  var infowindow = new google.maps.InfoWindow();
  var latlng = new google.maps.LatLng(-34.397, 150.644);
  var mapOptions = {
    zoom: 8,
    center: latlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  var geo = new google.maps.Geocoder(); 
  var map = new google.maps.Map(document.getElementById("map"), mapOptions);
  var bounds = new google.maps.LatLngBounds();

  // ====== Geocoding ======
  function getAddress(search, next) {
    geo.geocode({address:search}, function (results,status)
      { 
        // If that was successful
        if (status == google.maps.GeocoderStatus.OK) {
          // Lets assume that the first marker is the one we want
          var p = results[0].geometry.location;
          var lat=p.lat();
          var lng=p.lng();
          // Output the data
            var msg = 'address="' + search + '" lat=' +lat+ ' lng=' +lng+ '(delay='+delay+'ms)<br>';
            document.getElementById("messages").innerHTML += msg;
          // Create a marker
          createMarker(search,lat,lng);
        }
        // ====== Decode the error status ======
        else {
          // === if we were sending the requests to fast, try this one again and increase the delay
          if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
            nextAddress--;
            delay++;
          } else {
            var reason="Code "+status;
            var msg = 'address="' + search + '" error=' +reason+ '(delay='+delay+'ms)<br>';
            document.getElementById("messages").innerHTML += msg;
          }   
        }
        next();
      }
    );
  }

 // ======= Function to create a marker
 function createMarker(add,lat,lng) {
   var contentString = add;
   var marker = new google.maps.Marker({
     position: new google.maps.LatLng(lat,lng),
     map: map,
     zIndex: Math.round(latlng.lat()*-100000)<<5
   });

  google.maps.event.addListener(marker, 'click', function() {
     infowindow.setContent(contentString); 
     infowindow.open(map,marker);
   });

   bounds.extend(marker.position);

 }

  // ======= An array of locations that we want to Geocode ========
  var addresses = [
           'General Roberto Fierro Airport Zona Hangares hangar 12 CHIHUAHUA MEXICO ',
'DURANGO MEXICO ', 'ENSENADA MEXICO ', 'GUADALAJARA MEXICO ', 'GUAYMAS MEXICO ',     'HERMOSILLO MEXICO ', 'HUATULCO MEXICO ', 'LA PAZ MEXICO ', 'LORETO MEXICO ','LOS MOCHIS     MEXICO ',
'MANZANILLO MEXICO ', 'MATAMOROS MEXICO ', 'MAZATLAN MEXICO ', 'MERIDA MEXICO ',
'MEXICALI MEXICO ', 'MINATITLAN MEXICO ', 'MONCLOVA MEXICO '      ];

  // ======= Global variable to remind us what to do next
  var nextAddress = 0;

  // ======= Function to call the next Geocode operation when the reply comes back

  function theNext() {
    if (nextAddress < addresses.length) {
      setTimeout('getAddress("'+addresses[nextAddress]+'",theNext)', delay);
      nextAddress++;
    } else {
      // We're done. Show map bounds
      map.fitBounds(bounds);
    }
  }

  // ======= Call that function for the first time =======
  theNext();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top