Développement web

Google Map API v3 : hack pour contourner le « OVER QUERY LIMIT »

Google Map API v3 : hack pour contourner le « OVER QUERY LIMIT »

En tant que développeur web, il y a forcément un jour où vous serez amené à utiliser Google Map API v3. Une belle carte Google où l’on doit placer des « Markers » et bien entendu ils seront placés suivant des adresses que vous aurez en base de données.

Le problème est que pour placer un « Marker » il faut utiliser l’option « position » qui s’attend à recevoir un objet contenant la latitude et la longitude. Bien entendu, lorsque l’on conçoit son application et sa base de données il est rare de prévoir des champs pour la latitude et la longitude dès le début de la conception. Vous vous dîtes que finalement le mieux est de les calculer à la volée et a façon la plus simple pour calculer la latitude et longitude d’une adresse c’est d’utiliser « Geocoder » de Google Map.

L’API peut s’utiliser en JavaScript mais également en PHP. C’est ce dernier que j’ai retenu puisque lorsque je récupère mes adresses je calcule leur latitude et longitude. Pour optimiser mon code et le traitement, je calcule uniquement les latitudes et longitudes que je ne connais pas puis je les stocke en base de données pour ne pas les recalculer.

En PHP, j’utilise cURL pour appeler l’API et tout naturellement le tout dans une boucle foreach pour parcourir chaque adresse que je récupère de ma base de données. Si je n’ai qu’une dizaine d’adresses, pas de problème. Mais si je dois en calculer une centaine, là c’est le drame et j’ai le droit au beau message de l’API : « You have exceeded your rate-limit for this API. », suspendant ainsi pendant un petit laps de temps l’utilisation de l’API.

C’est très contraignant lorsque l’on doit calculer énormément d’adresses via un script mais j’ai une astuce à vous partager pour pallier à cela.

Tout d’abord, il faut savoir que le « OVER QUERY LIMIT » se déclenche après une certaine quantité de requêtes et qu’il s’estompe après quelques secondes. Le problème c’est que le nombre de secondes peut varier et qu’il est donc difficile de le prévoir.

J’ai trouvé une solution simple et efficace pour contourner ce problème : une bonne vieille boucle while.

$response_a = new \stdClass();
$response_a->error_message = 'You have exceeded your rate-limit for this API.';
while (isset($response_a->error_message) && $response_a->error_message == 'You have exceeded your rate-limit for this API.') {
   $address_url = "https://maps.google.com/maps/api/geocode/json?address=$address";
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $address_url);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
   $response = curl_exec($ch);
   curl_close($ch);
   $response_a = json_decode($response);
}

Explication du code :

« Geocoder » nous fourni un JSON et lorsque l’on obtient un « OVER_QUERY_LIMIT », le message d’erreur est le suivant : « You have exceeded your rate-limit for this API. ». Le while va tester si l’objet (issue de la fonction json_decode) contient cette valeur. Tant qu’elle existe, la boucle continuera de s’exécuter. Fonctionnement garanti je peux vous l’assurer.

Le but étant bien entendu de récupérer la latitude et la longitude de notre adresse et de la stocker en base de données pour ne pas refaire la boucle la prochaine fois que vous appelez votre page.

Laisser un Commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.