Utilisez Geo Location pour donner à vos clients des itinéraires routiers

Ce tutoriel est une mise à jour d'un précédent dans lequel nous avons expliqué comment afficher des instructions de conduite directement sur un site Web WordPress à l'aide de l'API Google Maps..

Dans le premier tutoriel, nos utilisateurs devaient saisir manuellement leur adresse dans un formulaire sur le site Web - les instructions seraient ensuite affichées. C’était un bon exemple de l’utilisation de l’API de Google Maps, mais la possibilité de détecter les Localisation actuelle, en plus de pouvoir entrer une adresse manuellement, était une fonctionnalité souvent demandée.

Il y a beaucoup de chemin à parcourir ici, mais une grande partie a été abordée dans le didacticiel précédent. Pour éviter que je ne me répète, consultez le premier didacticiel "Donnez à vos clients des itinéraires routiers" où vous trouverez tout ce qui n’est pas expliqué dans celui-ci..

Ce que nous avons couvert dans l'original

Ceci est une liste de choses que nous sommes ne pas va couvrir dans ce tutoriel. Alors n'hésitez pas à consulter le didacticiel original pour des explications détaillées:

  1. Comment enregistrer des paramètres personnalisés dans le panneau d'administration WordPress. Les trois champs de paramètres étaient pour:
    • La destination
    • Le texte à afficher dans la fenêtre d'information
    • Le niveau de zoom initial de la carte lors du premier chargement
  2. Comment obtenir une valeur Lat / Lon très précise pour votre destination à l'aide de l'exemple Google Maps API V3
  3. Comment configurer les codes abrégés utilisés dans ce tutoriel

Remarque: La lecture du premier tutoriel vous aidera à comprendre les parties qui ne sont pas expliquées dans ce tutoriel. Cependant, le code fourni dans le la source les fichiers contiennent tout ce dont vous avez besoin.


Ce que nous allons créer


Pourquoi est-ce mieux que l'original?

En plus de ce que nous avons réalisé dans le tutoriel précédent, nous allons également:

  1. Détecter si le navigateur de l'utilisateur dispose ou non de capacités de géolocalisation
  2. Si tel est le cas, autorisez-les à l'utiliser au lieu de saisir une adresse manuellement
  3. Fournissez un lien spécial vers Google Maps. Lorsque vous cliquez dessus (ou appuyez dessus), ce lien ouvrira l'application Cartes native sur l'appareil si elle est disponible et planifiera automatiquement l'itinéraire. Ceci est particulièrement utile sur les appareils iOS et Android.

Autres améliorations à l'original:

  1. Nous examinerons la gestion améliorée des erreurs
  2. Auparavant, l'administrateur du site devait saisir les valeurs de latitude et de longitude de la destination dans les paramètres WordPress. Aujourd'hui, nous allons voir comment accepter ces valeurs de latitude et longitude. ou une adresse régulière. Cela signifie que l'administrateur peut fournir un point précis sur la carte (la position exacte d'un bâtiment, par exemple) ou simplement l'adresse de la rue..

Étape 1 Créer un fichier CSS

Nous allons ajouter un minuscule un peu de CSS pour améliorer l'apparence / la présentation de notre carte et de nos boutons, nous allons donc créer une feuille de style CSS externe dans notre carte annuaire.

Dans votre dossier de thème, votre carte Le répertoire devrait maintenant ressembler à ceci:

  • map.php
  • map.js
  • map.css

Étape 2 Ajouter du CSS

Dans le premier tutoriel, nous avons ajouté quelques lignes de CSS dans la feuille de style principale du thème., style.css. Saisissez ces lignes et insérez-les dans ce nouveau fichier CSS avec tout ce que vous voyez ci-dessous.

Remarque: Ces styles ont été écrits pour fonctionner avec le thème de stock Twenty Eleven. Vous constaterez peut-être que le rembourrage, les marges ou les couleurs ne conviennent pas parfaitement à votre thème. Par conséquent, vous devriez vous sentir libre d'ajuster cela - cela n'affectera pas la fonctionnalité :)

 # map-container img max-width: none;  / * Extrait de l'original * / # map-container width: 100%; hauteur: 400px;  / * À partir du texte original * / / * réduit la hauteur de la carte sur des écrans plus petits * / @média uniquement les écrans et (largeur maximale: 767px) # map-container height: 235px;  / * Une classe que nous utiliserons pour cacher certains éléments plus tard * / .hidden display: none;  / * Styles de boutons - modifier à volonté! * / .map-button display: block; rembourrage: 5px; arrière-plan: # d9edf7; bordure: 1px solide # bce8f1; couleur: # 3a87ad; marge: 5px 0; border-radius: 3px; texte-ombre: 1px 1px 1px blanc;  .map-button: survol, .map-button: focus background: # b1dce5; texte-décoration: aucun;  / * Annuler tout remplissage par défaut sur les éléments 'p' * / #directions p margin-bottom: 0;  / * Ajuste l'affichage de l'élément d'entrée * / # from-input margin: 5px 0; border-radius: 3px; rembourrage: 5px; 

Maintenant, vous pouvez aller de l'avant et mettre en file d'attente le fichier à l'intérieur du wpmap_map petit code.

 wp_register_style ('wptuts-style', get_template_directory_uri (). '/map/map.css', ",", false); wp_enqueue_style ('wptuts-style');

Étape 3 Ajouter le nouveau code HTML pour les boutons

Ajoutons maintenant le balisage pour les boutons dans notre wpmap_directions_input petit code.

  1. Parce que nous souhaitons uniquement que nos nouveaux boutons «geo» apparaissent pour les utilisateurs qui en ont la capacité, nous allons envelopper nos boutons dans un div et appliquer le 'caché'classe que nous avons définie dans notre CSS. Ensuite, nous pouvons supprimer cette classe plus tard si l'emplacement géographique est activé.
  2. Cette fois, nous envoyons un paramètre au WPmap.getDirections méthode ('Manuel' ou 'géo') - cela nous permet d'avoir la fonctionnalité d'origine (où un utilisateur entre une adresse manuellement) avec la nouvelle méthode de géolocalisation.
  3. Le vide envergure tag est l'endroit où nous allons insérer le lien spécial qui ouvrira l'application Carte sur les mobiles et les tablettes. La construction du lien nécessite un peu de travail, nous allons donc l'examiner de plus près dans la section JavaScript de ce tutoriel..
 fonction wpmap_directions_input () $ address_to = get_option ('map_config_address'); $ output = '

Pour les itinéraires routiers, entrez votre adresse ci-dessous:

Obtenir des itinéraires routiers

Alternativement, vous pouvez

Utilisez votre position actuelle
'; return $ output;

Récapitulation rapide

Jusqu'ici, par rapport au tutoriel original, nous avons:

  1. Création d'un fichier CSS avec un style de base et mise en file d'attente.
  2. Ajout de balises supplémentaires pour permettre de nouveaux boutons qui ne seront visibles que par les navigateurs modernes.

Ensuite, nous examinerons les modifications de JavaScript. Il y a beaucoup de choses dans cette section suivante, alors au lieu de faire une comparaison directe avec l'original, je vais simplement faire de mon mieux pour expliquer ce qui se passe dans chaque méthode / fonction et vous pouvez consulter l'intégralité des fichiers source à la fin pour voir. comment tout cela va ensemble.


Étape 4 Le JavaScript

Maintenant, voici la partie amusante. Dans le premier tutoriel, notre init () méthode était responsable de l’instanciation de la carte dans le même format pour chaque chargement de page. Cela signifiait que tout le monde recevrait exactement la même fonctionnalité, quelles que soient les capacités de l'appareil. Il est temps de changer cela.!

Lorsqu'un utilisateur visite notre site Web à l'aide d'un smartphone, par exemple, nous voulons pouvoir lui offrir la possibilité d'utiliser son emplacement actuel au lieu de le saisir manuellement. Nous souhaitons également pouvoir lancer l'application Maps native sur le téléphone et planifier automatiquement l'itinéraire..

Un mot rapide sur la prise en charge du navigateur

L'API JavaScript de GeoLocation est l'une des nouvelles fonctionnalités HTML5 les mieux supportées. Selon caniuse.com, plus de 75% des navigateurs semblent le supporter. Je pense que cela signifie que nous sommes assez en sécurité! (Nous fournirons quand même une solution de rechange pour les anciens navigateurs :))

Maintenant, creusons dans le JavaScript.

Comprendre le code

En termes simples, tout ce que nous cherchons à faire ici est de fournir la possibilité d’utiliser la géolocalisation si elle est disponible. Si ce n'est pas le cas, les utilisateurs pourront toujours entrer une adresse manuellement.

Si vous regardez le flux de contrôle simplifié (ci-dessous), vous constaterez que nous utilisons les mêmes méthodes pour configurer la carte, mais quelques-unes de plus si la géolocalisation est activée..

OK, je pense que nous avons une bonne compréhension de ce que nous essayons d'accomplir ici. Je vais maintenant vous expliquer chaque méthode individuellement. Comme toujours, veuillez vous reporter aux fichiers source pour voir comment tout s'intègre dans le même fichier..

Définir les propriétés

Ici, nous interrogeons le DOM pour récupérer certaines propriétés que nous utiliserons plus tard. Nous obtenons également quelques objets de l’API qui gèrent la requête 'get directions'.

 var WPmap = // éléments HTML que nous utiliserons plus tard! mapContainer: document.getElementById ('map-container'), dirContainer: document.getElementById ('dir-container'), toInput: document.getElementById ('map-config-address'), fromInput: document.getElementById ('from- input '), unitInput: document.getElementById (' unit-input '), geoDirections: document.getElementById (' geo-directions '), nativeLinkElem: document.getElementById (' native-link '), startLatLng: null, destination: null , geoLocation: null, geoLat: null, geoLon: null, // Objets de l'API Google Maps dirService: new google.maps.DirectionsService (), dirRenderer: new google.maps.DirectionsRenderer (), map: null, / ** Objet WPmap continue tout au long du tutoriel ** /

init ()

C'est la première méthode qui sera appelée quand notre page sera chargée.

  1. La première chose à faire est de vérifier les capacités de localisation géographique dans le navigateur..
    • Si cette option est disponible, nous utilisons quelques méthodes supplémentaires pour configurer les boutons supplémentaires de la page (nous les verrons bientôt)
    • S'il n'est pas disponible, nous sautons tout cela et passons directement à la configuration de la destination.
  2. La dernière partie de la init () La méthode est le gestionnaire d'événements que nous utilisons pour afficher un message à l'utilisateur lorsque des instructions sont demandées.. Remarque: Ceci est facultatif - n'hésitez pas à l'enlever.
 init: function () if (WPmap.geoLoc = WPmap.getGeo ()) // Que faire si le navigateur prend en charge la géolocalisation. WPmap.getGeoCoords ();  WPmap.getDestination (); // écoute lorsque les instructions sont demandées google.maps.event.addListener (WPmap.dirRenderer, 'directions_changed', function () infoWindow.close (); // ferme le premier infoWindow marker.setVisible (false); // remove le premier marqueur // les chaînes de configuration à utiliser. var distanceString = WPmap.dirRenderer.directions.routes [0] .legs [0] .distance.text; // définit le contenu de la fenêtre d'information avant de la rouvrir. setContent ('Merci!
On dirait que vous êtes sur le point '+ distanceString +' loin de nous.
Les directions sont juste en dessous de la carte '); // rouvre l'infoWindow infoWindow.open (WPmap.map, marqueur); setTimeout (function () infoWindow.close (), 8000); // le ferme après 8 secondes. ); // init

Ok, j'ai montré le init () méthode d'abord cette fois afin que vous puissiez comprendre comment fonctionne le flux de contrôle.

Maintenant, je vais vous montrer les méthodes impliquées lorsqu'un utilisateur a capacités de géolocalisation.


Détection de géolocalisation

getGeo ()

Tout commence avec la «détection de fonctionnalité» standard.

Pour déterminer si un navigateur prend en charge la géolocalisation ou non, nous ne faisons que vérifier l’existence du navigator.geolocation objet.

 getGeo: function () if (!! navigator.geolocation) renvoie navigator.geolocation; sinon, retourne non défini; ,

getGeoCoords ()

Maintenant que nous savons que le navigateur a une géolocalisation, nous pouvons aller de l'avant et demander les coordonnées actuelles.

  1. Nous appelons getCurrentPosition () et passez deux paramètres - une fonction de rappel de succès et une fonction de rappel d'erreur
 getGeoCoords: function () WPmap.geoLoc.getCurrentPosition (WPmap.setGeoCoords, WPmap.geoError),

setGeoCoords ()

Ceci est notre rappel de succès. Si nous en arrivons là, nous avons récupéré avec succès les coordonnées de l'utilisateur.

  1. position sera un objet contenant les informations de géolocalisation afin que nous puissions aller de l'avant et définir les valeurs Lat / Lon sur les propriétés de l'objet.
  2. Ensuite nous appelons showGeoButton () pour afficher le bouton permettant d'utiliser l'emplacement actuel.
  3. Enfin nous appelons setNativeMapLink () construire le lien qui ouvrira des applications cartographiques natives.
 setGeoCoords: fonction (position) WPmap.geoLat = position.coords.latitude; WPmap.geoLon = position.coords.longitude; WPmap.showGeoButton (); WPmap.setNativeMapLink (); ,

geoError ()

Ceci gérera toutes les erreurs reçues de getCurrentPosition () - ceci est très utile en développement, mais en production, vous voudrez peut-être le supprimer car nous fournissons quand même un repli sur la saisie d'adresse manuelle.

 geoError: function (error) var message = ""; // Vérifier les erreurs connues switch (error.code) case error.PERMISSION_DENIED: message = "Ce site Web n'a pas la permission d'utiliser l'API d'emplacement géographique"; Pause; case error.POSITION_UNAVAILABLE: message = "Désolé, votre position actuelle ne peut pas être déterminée, veuillez plutôt entrer votre adresse."; Pause; case error.PERMISSION_DENIED_TIMEOUT: message = "Désolé, nous ne parvenons pas à déterminer votre emplacement actuel. Veuillez plutôt entrer votre adresse."; Pause;  if (message == "") var strErrorCode = error.code.toString (); message = "La position n'a pas pu être déterminée en raison d'une erreur inconnue (Code:" + strErrorCode + ").";  console.log (message); ,

showGeoButton

Afficher le bouton 'obtenir l'emplacement actuel'.

  1. Notre approche consiste à toujours masquer le bouton, sauf si JavaScript et l'emplacement géographique sont activés. Nous accomplissons cela en supprimant le .caché classe utilisant .removeClass (). Il s'agit d'une méthode d'assistance qui simplifie considérablement la suppression de classes d'éléments HTML (ce sera au bas des fichiers sources).
 showGeoButton: function () var geoContainer = document.getElementById ('directions géographiques'); geoContainer.removeClass ('caché'); ,

setNativeMapLink ()

C'est le lien spécial qui ouvrira les applications cartographiques natives sur les appareils iOS et Android. Comme nous avions précédemment enregistré les valeurs actuelles Lat / Lon dans notre objet, nous pouvons maintenant générer facilement le lien avec le format correct..

 setNativeMapLink: function () var locString = WPmap.geoLat + ',' + WPmap.geoLon; var destination = WPmap.toInput.value; var newdest = destination.replace (","); WPmap.nativeLinkElem.innerHTML = ('Ouvrir dans Google Maps'); ,

getDestination ()

Nous déterminons ici si l'administrateur a saisi une valeur Lat / Lon ou une adresse normale dans la page Options:

  1. Nous testons d'abord pour voir si saisir est une valeur Lat / Lon en utilisant une expression régulière.
  2. Si tel est le cas, nous définissons WPmap.destination égal à un google.maps.LatLng objet.
  3. Si ce n'est pas le cas, nous utilisons google.maps.Geocoder () convertir l'adresse en un google.maps.LatLng objet et définir cela comme destination.
  4. De toute façon, tout est maintenant en place pour configurer la carte à l’aide de setupMap ()
 getDestination: function () var toInput = WPmap.toInput.value; var isLatLon = (/^(\-?\d+(\.\d+)?),\s*(\-?\d+(\.\d+)?)$/.test(toInput)); if (isLatLon) var n = WPmap.toInput.value.split (","); WPmap.destination = new google.maps.LatLng (n [0], n [1]); WPmap.setupMap ();  else geocoder = new google.maps.Geocoder (); geocoder.geocode ('address': WPmap.toInput.value, fonction (résultats, statut) WPmap.destination = results [0] .geometry.location; WPmap.setupMap ();); ,

setupMap ()

Très similaire à l'original - configurez la carte avec le marqueur centré sur notre destination et le texte des options de l'administrateur dans la fenêtre d'information.

 / * Initialise la carte * / setupMap: function () // récupère le contenu var infoWindowContent = WPmap.mapContainer.getAttribute ('data-map-infowindow'); var initialZoom = WPmap.mapContainer.getAttribute ('data-map-zoom'); WPmap.map = new google.maps.Map (WPmap.mapContainer, zoom: parseInt (initialZoom), // s’assure qu’il passe par un centre entier: WPmap.destination, mapTypeId: google.maps.MapTypeId.ROADMAP); marker = new google.maps.Marker (map: WPmap.map, position: WPmap.destination, draggable: false); // définir le contenu de l'infowindow infoWindow = new google.maps.InfoWindow (content: infoWindowContent); infoWindow.open (WPmap.map, marqueur); ,

obtenir des directions()

Ceci est appelé chaque fois que des instructions sont demandées. Son seul argument,demande', nous aidera à déterminer si l'utilisateur a cliqué sur le bouton pour utiliser une adresse saisie manuellement ou l'adresse "emplacement actuel".

 getDirections: function (request) // Récupère le code postal saisi. var fromStr = WPmap.fromInput.value; var dirRequest = origine: fromStr, destination: WPmap.destination, travelMode: google.maps.DirectionsTravelMode.DRIVING, unitSystem: WPmap.getSelectedUnitSystem (); // vérifie si l'utilisateur a cliqué sur 'utiliser l'emplacement actuel' if (request == 'geo') var geoLatLng = new google.maps.LatLng (WPmap.geoLat, WPmap.geoLon); dirRequest.origin = geoLatLng;  WPmap.dirService.route (dirRequest, WPmap.showDirections); ,

showDirections ()

Inchangé par rapport à l'original - il gère l'insertion des instructions dans la page.

 / ** * Affiche les instructions dans la page. * / showDirections: function (dirResult, dirStatus) if (dirStatus! = google.maps.DirectionsStatus.OK) switch (dirStatus) case "ZERO_RESULTS": alert ('Désolé, nous ne pouvons pas vous indiquer comment vous y rendre. (Vous êtes peut-être trop loin, êtes-vous dans le même pays que nous?) Veuillez réessayer. '); Pause; case "NOT_FOUND": alert ('Désolé, nous n'avons pas compris l'adresse que vous avez entrée - Veuillez réessayer.'); Pause; default: alert ('Désolé, un problème est survenu lors de la génération des directions. Veuillez réessayer.') return;  // Afficher les directions WPmap.dirRenderer.setMap (WPmap.map); WPmap.dirRenderer.setPanel (WPmap.dirContainer); WPmap.dirRenderer.setDirections (dirResult); ,

Finir le JavaScript

En dehors de l'objet, il n'y a que l'écouteur d'événement à ajouter qui chargera la carte lorsque la page sera prête et la fonction d'assistance dont nous avons parlé plus tôt..

 / * Charge la carte lorsque la page est prête * / google.maps.event.addDomListener (window, 'load', WPmap.init); / * Fonction permettant de supprimer facilement toute classe d'un élément. * / HTMLElement.prototype.removeClass = fonction (supprimer) var newClassName = ""; var i; var classes = this.className.split (""); pour (i = 0; i < classes.length; i++)  if(classes[i] !== remove)  newClassName += classes[i] + " ";   this.className = newClassName; 

Et enfin…

Maintenant, pour que tout fonctionne, il vous suffit de mettre le carte dossier dans votre thème et ensuite parcourir les choses que nous avons couvertes dans le premier tutoriel.

  1. Comprendre map.php dans votre thème functions.php

     / ** Dans functions.php ** / include ('map / map.php');
  2. Entrez votre destination, le texte de l'infowindow et le niveau de zoom dans les champs que nous avons créés dans Paramètres. Vous les trouverez sous Paramètres -> Général -> Configuration de la carte
  3. Puis, sur une page ou un post, entrez les trois codes courts
    1. [wpmap_map]
    2. [wpmap_directions_input]
    3. [wpmap_directions_container]

Conclusion

Comme je l'ai mentionné c'est un mettre à jour à ce tutoriel et vous devez donc vraiment les examiner tous les deux pour bien comprendre le processus. Peut-être le moyen le plus simple de comprendre comment tout cela fonctionne-t-il consiste à afficher les fichiers source fournis.

Après tout cela, vous devriez avoir une petite application de carte très soignée qui répondra à différentes tailles d'écran et ajoutera également des fonctionnalités supplémentaires aux utilisateurs avec des navigateurs modernes. Tout en offrant une bonne solution de repli à tous les autres.