Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Matthieu Napoli

blog technique

Google Maps - InfoWindow.getPosition() ne marche pas, contournement

Comment récupérer la position (LatLng) d'une InfoWindow Google Maps ?

En utilisant InfoWindow.getPosition() me direz-vous. Mais cette méthode, pourtant bien présente dans la documentation officielle, ne marche pas (en tout cas chez moi, et visiblement pas que) : elle renvoie toujours null.

Ce problème a été remonté depuis Février 2011 à Google via un rapport de bug, mais en attendant qu'elle soit fixée, voici ma solution de contournement.

  • Lier l'InfoWindow à un marker (même si l'InfoWindow apparait au-dessus d'un marker, elle n'y est pas lié par défaut)
  • Récupérer la position du marker lié à l'InfoWindow grâce à Marker.getPosition()

Pour la première étape, on va ajouter ce lien au prototype InfoWindow :

(function () {
    google.maps.InfoWindow.prototype.marker = null;
    google.maps.InfoWindow.prototype.setMarker = function(marker) {
        this.marker = marker;
    };
    google.maps.InfoWindow.prototype.getMarker = function() {
        return this.marker;
    };
})();

Pour ceux qui ne comprennent pas, on ajoute des méthodes à la classe InfoWindow de Google Maps. Il suffit de placer ce code une fois dans la page pour que cela fonctionne.

Donc, lors de la création (ou l'affichage) de notre InfoWindow, on va la lier au marker correspondant :

var infowindow = new google.maps.InfoWindow();
infowindow.setMarker(marker);

Ensuite, pour la dernière étape, on récupère la position du marker :

var position = infoWindow.getMarker().getPosition();

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: mercredi 14 décembre 2011 00:11 par MadMatt
Classé sous : , ,

Commentaires

nicoboo a dit :

Bonjour Matthieu,

Cette technique n'est absolument pas supporté et j'ajouterai 2 points concernant ce besoin spécifique.

1 : Cette méthode est intéressante, et j'avoue que c'est une solution que j'adopte assez régulièrement. Seul hic, dans ta définition, tu ne testes aucunement le fait que les classes existent ou que les propriétés n'existent pas - du coup si un jour Google souhaite corriger ce point ou ajouter cette fonctionnalité, cela risque d'être délicat à gérer avec le code que tu présentes comme une solution aujourd'hui.

Cette méthode présente bien des avantages par ailleurs, car elle permets de lier des objets plus complexes pour la gestion des données à présenter.

2 : Pour récupérer la position de l'infowindow, il suffit de spécifier l'option correspondante au moment de l'affichage. Pour cela, l'API possède de manière native et supportée la méthode setOptions() sur la classe InfoWindow. http://code.google.com/intl/fr/apis/maps/documentation/javascript/reference.html#InfoWindow

Du coup, le code devient très simplement, à partir de l'exemple infowindow-simple :

google.maps.event.addListener(marker, 'click', function() {

 infowindow.open(map,marker);

 infowindow.setOptions({position: marker.getPosition()});  

});

Rien de tordu ou hasardeux, et il s'agit d'une méthode supportée. C'est à mon sens la méthode la plus simple à recommander.

Je te rejoins néanmoins sur les capacités d'extension de l'API qu'il faut exploiter avec prudence mais aussi avec beaucoup d'intérêts.

# décembre 14, 2011 10:48

MadMatt a dit :

Bonjour nicoboo, merci d'avoir pris le temps de commenter.

Tout d'abord, je tiens à préciser que je propose une technique de contournement d'un bug reconnu. Je n'ai jamais précisé que c'était supporté par Google Maps, c'est pour ça que j'appelle ça un "contournement".

La méthode que tu présente est très intéressante, et je pense qu'elle est meilleure que celle que j'utilise en effet. Cependant je ne pense pas qu'il s'agit du cas d'utilisation naturel, avoir à définir la position soit même relève selon moi d'un contournement également, car lorsque nous créons l'infoWindow, c'est à partir d'un marker (donc définir la position est redondant) :

infowindow.open(map, marker);

Également, plutôt que d'utiliser :

infowindow.setOptions({position: marker.getPosition()});

tu peux utiliser tout simplement :

infowindow.setPosition(marker.getPosition());

Tel que présenté dans le rapport de bug (lien dans l'article), la position de l'InfoWindow n'est jamais mise à jour ou calculée par Google, c'est (pour l'instant) un simple conteneur de la donnée qu'on veut y mettre.

D'un autre côté, en effet je ne teste pas l'existence des attributs/méthodes que je rajoute, merci de ta remarque, je n'y avais pas pensé !

# décembre 14, 2011 23:26

nicoboo a dit :

Oui la méthode setPosition() permet d'effectuer le même traitement. Je m'intéressais à setOptions() car elle est bien plus permissive notamment avec l'utilisation des informations du marker (size et anchor associés...).

Ce qu'il est important de retenir, c'est qu'il vaut mieux utiliser les méthodes disponibles dans l'API plutôt qu'ajouter ou étendre sans nécessairement pondérer les impacts de telles modifications ou, plutôt, extension.

Pour moi, ce n'est pas un bug, il me semble naturel de définir  (ou mettre à jour) la position au moment de l'ouverture de l'infowindow, surtout que dans la plupart des cas, ce traitement est effectué dans une méthode d'abstraction.

Pour moi, il se s'agit pas d'un bug, mais d'un choix de la part de Google. Justifié ou non, il existe une solution pour palier à ce besoin en utilisant une technique supportée.

Dans ton cas, avec cette solution de contournement que tu proposes, tu lies étroitement l'infowindow à un marker (setMarker()) alors que cette infowindow peut tout à fait être (et c'est ce qui est fait) mutualisé.

Après, c'est une question de point de vue. setMarker() en extension ou nativement setPosition() (ou setOptions()) sur l'infowindow, je dirai que j'opterai pour le second choix, mais encore une fois, le choix de la solution à utiliser dépasse le cadre de présentation de ta solution de contournement ici.

Ta solution fonctionne, mais n'est pas supportée alors qu'il existe une solution supportée pour faire ce qui est souhaité, même si ça ne suit pas ta logique de développement.

# décembre 15, 2011 00:51
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01