Processing math: 100%

34 votos

¿Evitar el límite de geocodificación de Google Maps?

Estoy creando un mapa de google personalizado que tiene 125 marcadores trazados a través de un cms. Al cargar el mapa me aparece este mensaje:

La geocodificación no ha tenido éxito por el siguiente motivo: OVER_QUERY_LIMIT

Estoy bastante seguro de que es la forma en que he geocodificado los marcadores.

¿Cómo puedo evitar estos avisos y hay una forma más eficaz de geocodificar los resultados?

ACTUALIZACIÓN: Este es mi intento de respuesta de Casey, de momento me sale una página en blanco.

<script type="text/javascript"> 
(function() { 

window.onload = function() { 
 var mc;
// Creating an object literal containing the properties we want to pass to the map 
var options = { 
zoom: 10, 
center: new google.maps.LatLng(52.40, -3.61), 
mapTypeId: google.maps.MapTypeId.ROADMAP 
}; 

// Creating the map 
var map = new google.maps.Map(document.getElementById('map'), options); 

// Creating a LatLngBounds object 
var bounds = new google.maps.LatLngBounds(); 

// Creating an array that will contain the addresses 
var places = []; 

// Creating a variable that will hold the InfoWindow object 
var infowindow; 
mc = new MarkerClusterer(map);
<?php
$pages = get_pages(array('child_of' => $post->ID, 'sort_column' => 'menu_order'));
$popup_content = array();
foreach($pages as $post)
    {
    setup_postdata($post);
    $fields = get_fields(); 
    $popup_content[] = '<p>'.$fields->company_name.'</p><img src="'.$fields->company_logo.'" /><br /><br /><a href="'.get_page_link($post->ID).'">View profile</a>';
    $comma = ", ";
    $full_address = "{$fields->address_line_1}{$comma}{$fields->address_line_2}{$comma}{$fields->address_line_3}{$comma}{$fields->post_code}";
    $address[] = $full_address;
    }
wp_reset_query();
echo 'var popup_content = ' . json_encode($popup_content) . ';';
echo 'var address = ' . json_encode($address) . ';';
?>

var geocoder = new google.maps.Geocoder(); 

var markers = [];

// Adding a LatLng object for each city  
for (var i = 0; i < address.length; i++) { 
    (function(i) { 
        geocoder.geocode( {'address': address[i]}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                places[i] = results[0].geometry.location;

                // Adding the markers 
                var marker = new google.maps.Marker({position: places[i], map: map});
                markers.push(marker);
                mc.addMarker(marker);

                // Creating the event listener. It now has access to the values of i and marker as they were during its creation
                google.maps.event.addListener(marker, 'click', function() {
                    // Check to see if we already have an InfoWindow
                    if (!infowindow) {
                        infowindow = new google.maps.InfoWindow();
                    }

                    // Setting the content of the InfoWindow
                    infowindow.setContent(popup_content[i]);

                    // Tying the InfoWindow to the marker 
                    infowindow.open(map, marker);
                });

                // Extending the bounds object with each LatLng 
                bounds.extend(places[i]); 

                // Adjusting the map to new bounding box 
                map.fitBounds(bounds) 
            } else { 
            alert("Geocode was not successful for the following reason: " + status); 
            }

        });

    })(i);

} 
var markerCluster = new MarkerClusterer(map, markers); 
} 
})
(); 
</script> 

No importa realmente cuál sea la solución, siempre que los marcadores se carguen al instante y no se incumplan los términos y condiciones.

3voto

Jon Galloway Puntos 28243

Utilizando geocodificadores geopy Soy capaz de geocodificar un gran número de direcciones sin problemas (no estoy seguro de la configuración de los carteles, o si puede incluir una dependencia de python a su proyecto)

aquí está mi prueba:

from geopy import geocoders

g = geocoders.GoogleV3()  #https://geopy.readthedocs.io/en/latest/#geopy.geocoders.GoogleV3

for x in xrange(1,10000):
    print x
    a = g.geocode("AV JOAO NAVES DE AVILA " + str(x) + " UBERLANDIA MG BRASIL")
    print a

fragmento de resultado

7595 (u'Av. Jo \xe3o Naves de \xc1vila , 7595 - Segismundo Pereira, Uberl \xe2ndia - Minas Gerais, 38408-288, Brasil', (-18.9388154, -48.2220562))

7596 (u'Av. Jo \xe3o Naves de \xc1vila , 7596 - Segismundo Pereira, Uberl \xe2ndia - Minas Gerais, 38408-680, Brasil', (-18.938814, -48.2217423))

7597 (u'Av. Jo \xe3o Naves de \xc1vila , 7597 - Segismundo Pereira, Uberl \xe2ndia - Minas Gerais, 38408-288, Brasil', (-18.9388128, -48.2220381))

7598 (u'Av. Jo \xe3o Naves de \xc1vila , 7598 - Segismundo Pereira, Uberl \xe2ndia - Minas Gerais, 38408-680, Brasil', (-18.9388114, -48.2217242))

7599 (u'Av. Jo \xe3o Naves de \xc1vila , 7599 - Segismundo Pereira, Uberl \xe2ndia - Minas Gerais, 38408-288, Brasil', (-18.9388102, -48.2220201))

7600 (u'Av. Jo \xe3o Naves de \xc1vila , 7600 - Segismundo Pereira, Uberl \xe2ndia - Minas Gerais, 38408-680, Brasil', (-18.9388088, -48.2217062))

Esto sigue funcionando y estoy con 7k resultados.

EDIT: Después de un rato he dado con el final de la calle y google ha empezado a darme los mismos puntos, pero parece que sigue haciendo peticiones y dándome respuestas precisas.

1voto

nilbus Puntos 147

Esta función php (no sé en qué idioma estás trabajando, pero seguro que la puedes descifrar) utiliza la api del geolocalizador de Google. Dada una dirección, devolverá la dirección normalizada y la latlong. HTH.

// GEOLOCATEBYADDRESS
// @arg (string)address
// @return (array) ((int)flag,(array)address,array(rawresponse))

function geolocatebyaddress($lookupaddress){

    $lookupaddress=trim("$lookupaddress New Zealand");
    $lookupaddress=urlencode($lookupaddress);

    //send off google api lookup request
    $apiurl="http://maps.google.com/maps/api/geocode/json";
    $apiurl.="?address=$lookupaddress";
    $apiurl.="&region=NZ";
    $apiurl.="&sensor=false";

    if (function_exists("curl_init")) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $apiurl);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $json = curl_exec($ch);
        curl_close($ch);
    }
    else     $json= file_get_contents($apiurl);

    //process response
    $response= json_decode($json,true);
    $approxflag=0;
    if ($response['status']=='OK' and count($response['results'])) {

        $aa= array();
        foreach($response['results'] as $cc=>$result) {
            //set keys
            foreach(array('street_number','road','suburb','city','postcode','region','lat','long') as $t){
                $aa[$cc][$t]='';
            }
            if ($result['geometry']){
                $aa[$cc]['lat']= $result['geometry']['location']['lat'];
                $aa[$cc]['long']=$result['geometry']['location']['lng'];
         }

            if (count($result['address_components'])){
                foreach ($result['address_components'] as $acs){
                    if ($acs['types'][0]=='street_number')               $aa[$cc]['street_number']= $acs['long_name']; 
                    if ($acs['types'][0]=='route')                       $aa[$cc]['road']=      $acs['long_name']; 
                    if ($acs['types'][0]=='sublocality')                 $aa[$cc]['suburb']=   $acs['long_name']; 
                    if ($acs['types'][0]=='locality')                    $aa[$cc]['city']=    $acs['long_name']; 
                    if ($acs['types'][0]=='postal_code')                 $aa[$cc]['postcode']= $acs['long_name']; 
                    if ($acs['types'][0]=='administrative_area_level_1') $aa[$cc]['region']=   $acs['long_name']; 
                }    
            }
            //successful?
            if ($result['geometry']['location_type']=='APPROXIMATE') $approxflag++;
            if (isset($result['partial_match']))  $approxflag++;
            if (!$aa[$cc]['street_number'])         $approxflag++;
        }
        if ($approxflag) return (array(1,$aa,$response));
        else return (array(2,$aa,$response));
    }
    else return (array(0,array(),$response));
}

1voto

BioGeek Puntos 3724

Acabo de ver tu consulta. Puede probar el siguiente código. En la parte de comprobación del estado del geocódigo, llame recursivamente a la misma función con un intervalo de tiempo para las direcciones perdidas.

function spotPosition(address) {
        geocoder.geocode({ 'address': address }, function (results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var lat = results[0].geometry.location.lat();
                var lang = results[0].geometry.location.lng();
                setMarker(lat, lang);
            }
            else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                setTimeout(function () {
                    //Recursively calling spotPosition method for lost addresses
                    spotPosition(address);
                }, 1000);
            }
        });
    }

0voto

Skippy Puntos 71

Esta es mi solución:

dependencias: 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);
});

0voto

Banng Puntos 21

No se puede evitar el límite de geocodificación de los mapas de Google: hay que obtener y almacenar LatLng información.

Si tienes varias ciudades y no quieres obtener manualmente LatLng, puedes usar un tiempo de espera para llamar progresivamente a geocoder.geocode y guardar la información dentro de un objeto javascript y luego usar console.log(JSON.stringify(object, null, 4)); para obtener en la consola un bonito objeto impreso, así, por ejemplo

            var locationsPosition = {
                    "Johannesburg - ZA": {
                        "lat": -26.2041028,
                        "lng": 28.047305100000017
                    },
                    "Chennai - IN": {
                        "lat": 13.0826802,
                        "lng": 80.27071840000008
                    }
             }

por lo que ahora se puede añadir un marcador utilizando locationsPosition["Johannesburg - ZA"].lat y .lng

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X