Je crée une carte google personnalisée avec 125 marqueurs tracés via un cms. En chargeant la carte, je reçois ce message:
Le géocode a échoué pour la raison suivante: OVER_QUERY_LIMIT
Je suis à peu près sûr que c'est la façon dont j'ai géocodé les marqueurs.
Comment puis-je éviter ces avertissements et existe-t-il un moyen plus efficace de géocoder les résultats?
UPDATE: Ceci est ma tentative de réponse de Casey, je suis en train de recevoir une page blanche pour le moment.
<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>
Peu importe la solution, tant que les marqueurs se chargent instantanément et que les termes et conditions ne sont pas brisés.
Réponses:
Comme tout le monde, je pourrais vous donner une réponse avec du code, mais je ne pense pas que quelqu'un vous ait expliqué que vous agissiez dans le mauvais sens .
Pourquoi frappez-vous cette erreur? Parce que vous appelez le géocodage à chaque fois que quelqu'un visualise votre page et que vous ne mettez pas vos résultats en cache dans la base de données!
La raison de cette limite est d'empêcher l'utilisation abusive des ressources de Google (que ce soit de gré ou de force) - c'est exactement ce que vous faites :)
Bien que le géocodage de Google soit rapide, si tout le monde l'utilisait de cette façon, ses serveurs ne fonctionneraient plus. La raison pour laquelle les tables de fusion de Google existent est de faire beaucoup de gros travaux de levage du côté serveur pour vous. Le géocodage et la mise en cache des mosaïques sont effectués sur leurs serveurs. Si vous ne souhaitez pas l'utiliser, vous devez les mettre en cache sur votre serveur.
Si, quand même, 2500 demandes par jour, c'est trop peu, vous devez regarder la licence Google Maps Premier (payante) qui vous donne 100 000 demandes de géocodage par jour pour environ 10 000 euros par an (c'est beaucoup, avec la mise en cache côté serveur, vous devriez n'atteignez pas cette limite, sauf si vous êtes un site énorme ou si vous effectuez un traitement de données volumineux). Sans la mise en cache côté serveur et l'utilisation de votre approche actuelle, vous ne pourriez faire que 800 pages vues par jour!
Une fois que vous vous rendrez compte que les autres fournisseurs facturent chaque géocode , vous comprendrez que vous devez mettre en cache les résultats dans la base de données. Avec cette approche, cela vous coûterait environ 10 cents américains par page affichée!
Votre question est la suivante: pouvez-vous contourner la limite d'accélération que Google vous a donnée? Sûr. Il suffit de faire une demande à partir de différentes adresses IP. Heck, vous pouvez proxy les appels via ips amazon élastique et aurait toujours un nouveau 2500 appels alloués. Mais bien sûr, en plus d'être illégal (vous contournez effectivement la restriction imposée par les conditions d'utilisation de Google Maps), vous feriez un bidouillage pour couvrir le défaut de conception inhérent à votre système.
Alors, quel est le bon moyen pour ce cas d'utilisation? Avant d'appeler l'api google geocode, envoyez-le à votre serveur et demandez s'il se trouve dans votre cache. Si ce n'est pas le cas, appelez le géocode, stockez-le dans votre cache et renvoyez le résultat.
Il existe d'autres approches, mais cela devrait vous aider à démarrer dans la bonne direction.
Mise à jour: d' après vos commentaires ci-dessous, vous indiquez que vous utilisez PHP. Voici donc un exemple de code expliquant comment le faire correctement (recommandation de l'équipe Google): https://developers.google.com/maps/articles/phpsqlsearch_v3.
la source
Je pense que Sasa a raison, dans les deux cas.
En ce qui concerne l'envoi simultané de toutes vos adresses, une option consiste à envoyer les demandes à intervalles réguliers. Dans le passé, en utilisant JavaScript, j’avais choisi de retarder les demandes de 0,25 seconde (semble fonctionner!) En utilisant le
méthode.
En .NET j'ai opté pour:
Semble travailler.
EDIT: Je ne peux pas vraiment le tester, mais cela devrait / pourrait fonctionner!
Exemple Javascript. AddressArray contient des chaînes qui sont des adresses ...
MODIFIER:
la source
On dirait que vous atteignez la limite de requêtes simultanées imposée par Google (bien que je ne puisse pas trouver de référence à la limite actuelle). Vous devrez espacer vos demandes afin de ne pas envoyer 125 demandes en même temps. Notez qu'il existe également une limite de 2 500 requêtes de géocodage par jour.
Consultez le document Google Geocoding Strategies pour plus d'informations.
Mise à jour: En tant que solution ajoutée inspirée par un message de Mapperz, vous pouvez envisager de créer une nouvelle table Google Fusion , de stocker votre adresse et toutes les données connexes dans la table, et de géocoder la table via leur interface Web. Il y a une limite au nombre de requêtes de géocodage qu'une table Fusion fera, mais la limite est assez grande. Une fois que vous avez atteint la limite, vous devrez soumettre à nouveau la demande de géocodage, et Fusion Tables reprendra à la place. Le bonus à cette approche est une énorme amélioration de la vitesse, car vous n'aurez besoin que de géocoder UNE FOIS, alors qu'avec votre solution actuelle, vous aurez besoin de géocoder sur chaque chargement, atteignant rapidement les limites quotidiennes.
la source
Voici comment j'étouffe mes requêtes de géocodage en javascript, les adresses étant un tableau contenant chaque adresse à géocoder:
Cela ajoute essentiellement une seconde et demie entre chaque demande de géocodage.
la source
J'ai essayé la page maintenant et elle semble fonctionner maintenant .
Bien que je pense que l'approche du minuteur que vous utilisez actuellement soit correcte et que je sache le seul qui fonctionnera sans nécessiter un support côté serveur, je suggérerais les modifications suivantes (j'ai pris la liberté de réécrire vos fonctions de géocodage) profiter de la conservation locale .
LocalStorage est une technologie relativement nouvelle intégrée à la plupart des navigateurs qui permet à la page Web de stocker des données sur le client. Il ressemble un peu aux cookies, mais il est beaucoup plus puissant et n’est pas toujours renvoyé au serveur (contrairement aux cookies).
Mon objectif est de sauvegarder l'adresse géocodée sur le client afin que, si un utilisateur actualise la page, il ne soit pas nécessaire d'appeler à nouveau les fonctions de géocodeur de Google. L’implémentation ci-dessous est grossière (nous devrions ajouter du code pour vérifier les enregistrements obsolètes et nous avons probablement besoin d’une meilleure clé de mise en cache que celle de l’index), mais cela devrait suffire à vous aider à démarrer. J'espère que ça aide.
la source
en utilisant des géocodeurs geopy, je suis capable de géocoder un grand nombre d'adresses sans accroc (je ne suis pas sûr de la configuration des affiches, ou s'il peut inclure une dépendance python à son projet)
voici mon test:
Ceci est toujours en cours et je suis avec 7k résultats.
EDIT: Après un moment, j'ai frappé le bout de la rue et Google a commencé à me donner les mêmes points, mais on dirait que c'est toujours faire des demandes et me donner des réponses précises.
la source
Cette fonction php (je ne sais pas dans quelle langue vous travaillez, mais vous pouvez la choisir séparément) utilise google geolocator api. Étant donné une adresse, il retournera l'adresse normalisée et latlong. HTH.
la source
Vous venez de voir votre requête. Vous pouvez essayer de suivre le code. Dans la partie vérification de l'état du géocode, appelez de manière récursive la même fonction avec un intervalle de temps pour les adresses perdues.
la source
Voici ma solution:
dépendances: Gmaps.js, jQuery
la source
Vous ne pouvez pas éviter la limite de géocodage de Google Map: vous devez obtenir et stocker des informations LatLng .
Si vous avez plusieurs villes et que vous ne voulez pas obtenir manuellement LatLng, vous pouvez utiliser un délai pour appeler progressivement geocoder.geocode et enregistrer les informations dans un objet javascript, puis utiliser
console.log(JSON.stringify(object, null, 4));
pour obtenir dans la console un bel objet imprimé. Exemplealors maintenant vous pouvez ajouter un marqueur en utilisant
locationsPosition["Johannesburg - ZA"].lat
et.lng
la source
Il semble que vous deviez faire l'une des deux choses suivantes:
Comme les gens l'ont mentionné à maintes reprises, mais je n'ai aucune expérience personnelle avec, il semblerait qu'une licence de Google pour 100 000 euros par jour coûte environ 10 000 euros par an.
Si vous voulez le même niveau de précision ou mieux (et ne pas avoir à payer ce prix), vous pouvez essayer notre service. Pour beaucoup moins que Google (presque un dixième du coût), vous pourriez obtenir une limite beaucoup plus élevée que 2500 (notre limite la plus basse est de 25 000 / jour).
Bien sûr, l’utilisation de notre API Paid Geocoding n’est pas la solution que je recommanderais d’être honnête à 100%, même si c’est un mauvais sens des affaires de l’admettre. Je suggérerais plutôt d’utiliser l’option 1, d’optimiser votre service en cache. Sauf si vous avez besoin de plus de 2500 géocodes UNIQUES par jour.
Disclaimer : Je travaille pour Geocode Farm (le service que je recommande).
la source