Comment générer une adresse numérique courte et unique pour n’importe quel emplacement en utilisant AngularJS et PHP

introduction

Les adresses postales sont généralement longues et parfois difficiles à retenir. Il existe un certain nombre de scénarios dans lesquels une adresse plus courte serait souhaitable. Par exemple, le fait d’être en mesure d’envoyer une courte adresse composée de quelques caractères seulement permettrait d’assurer une livraison plus rapide des services d’ambulance d’urgence. Pieter Geelen et Harold Goddijn ont développé leMapcode system en 2001 pour faciliter la création d'une adresse abrégée pour n'importe quelle adresse physique dans le monde.

Dans ce didacticiel, vous allez développer une application Web utilisant l’API de Google Maps pour générer une adresse numérique courte pour l’adresse de votre choix. Pour ce faire, clonez le code de base de cette application à partir de GitHub, puis ajoutez-y du code qui la rendra pleinement fonctionnelle. Cette application sera également capable de récupérer l'adresse physique d'origine à partir d'un mapcode donné.

Conditions préalables

Pour compléter ce tutoriel, vous aurez besoin des éléments suivants:

[[step-1 -—- getting-a-google-api-key]] == Étape 1 - Obtenir une clé API Google

Dans ce didacticiel, vous utiliserez JavaScript pour créer une interface avec Google Maps. Google attribue des clés d'API pour permettre aux développeurs d'utiliser l'API JavaScript sur Google Maps, que vous devrez obtenir et ajouter au code de votre application Web.

Pour obtenir votre propre clé API, accédez aux“Get API Key” page de Google. Cliquez sur le boutonGET STARTED à l'étape 1, et une fenêtre contextuelle s'ouvrira comme indiqué dans l'image suivante:

image

SélectionnezMaps en cliquant sur la case à cocher et appuyez surCONTINUE. Si vous n'êtes pas déjà connecté à un compte Google, vous serez invité à le faire. Ensuite, la fenêtre vous demandera de donner un nom au projet, qui peut être ce que vous voulez:

image

Ensuite, il vous sera demandé de saisir vos informations de facturation. Notez que Google fournit des clés d'API dans le cadre d'un essai gratuit, mais que vous devez configurer et activer la facturation pour les récupérer.

image

Après avoir entré ces informations, votre clé API apparaîtra à l'écran. Copiez-le et stockez-le dans un emplacement où vous pourrez le récupérer facilement, car vous devrez l'ajouter ultérieurement au code de votre projet.

Après avoir obtenu votre clé API, vous pouvez commencer à créer les bases de votre application en créant une base de données MySQL.

[[step-2 -—- creation-the-database]] == Étape 2 - Création de la base de données

L'application Web décrite dans ce didacticiel accepte une adresse de l'utilisateur et génère un code de carte pour celle-ci, ainsi que la latitude et la longitude de l'emplacement spécifié. Vous allez stocker ces données dans une base de données MySQL afin de pouvoir les récupérer ultérieurement en entrant simplement l'adresse numérique correspondante.

Commencez par ouvrir le shell MySQL et authentifier avec votre mot de passe:

mysql -u root -p

À l'invite, créez une base de données appeléedigitaladdress à l'aide de la commande suivante:

CREATE DATABASE IF NOT EXISTS `digitaladdress`;

Ensuite, sélectionnez cette nouvelle base de données pour pouvoir y créer une table:

USE `digitaladdress`;

Après avoir sélectionné la base de donnéesdigitaladdress, créez une table appeléelocations à l'intérieur pour y stocker l'adresse physique, sa longitude, sa latitude et le code de carte que votre application créera à partir de ces données. Exécutez l'instructionCREATE TABLE suivante pour créer la tablelocations dans la base de données:

CREATE TABLE `locations` (
  `digitaladdress` varchar(50) DEFAULT NULL,
  `state` varchar(30) DEFAULT NULL,
  `zip` varchar(30) DEFAULT NULL,
  `street` varchar(30) DEFAULT NULL,
  `town` varchar(30) DEFAULT NULL,
  `house` varchar(30) DEFAULT NULL,
  `latitude` varchar(30) DEFAULT NULL,
  `longitude` varchar(30) DEFAULT NULL,
  KEY `digitaladdress` (`digitaladdress`)
);

Cette table comporte huit colonnes:digitaladdress,state,zip,street,town,house,latitude etlongitude. La première colonne,digitaladdress, estindexed en utilisant la commandeKEY. Les index dans MySQL fonctionnent de la même manière que dans une encyclopédie ou un autre ouvrage de référence. Chaque fois que vous ou votre application émettez une requête contenant une instructionWHERE, MySQL lit chaque entrée de chaque colonne, ligne par ligne, ce qui peut devenir un processus extrêmement gourmand en ressources à mesure que votre table accumule de plus en plus d'entrées. L'indexation d'une colonne de ce type prend les données de la colonne et les stocke par ordre alphabétique dans un emplacement distinct, ce qui signifie que MySQL n'aura pas à parcourir toutes les lignes du tableau. Il suffit de rechercher les données que vous recherchez dans l'index, puis de passer à la ligne correspondante de la table.

Après avoir ajouté cette table, quittez l’invite MySQL:

exit

Avec votre base de données et votre table configurées, ainsi que votre clé d’API Google Maps, vous êtes prêt à créer le projet lui-même.

[[step-3 -—- creation-the-project]] == Étape 3 - Création du projet

Comme indiqué dans l'introduction, nous allons cloner le code de base de ce projet depuis GitHub, puis ajouter du code supplémentaire pour rendre l'application fonctionnelle. Au lieu de vous guider dans le processus de création de chaque fichier et d'ajouter tout le code vous-même, la raison en est d'accélérer le processus d'exécution de l'application. Cela nous permettra également de nous concentrer sur l'ajout et la compréhension du code permettant à l'application de communiquer avec les API Google Maps et Mapcode.

Vous pouvez trouver le code squelette du projet complet surthis GitHub project page. Utilisez la commandegit suivante pour cloner le projet sur votre serveur:

git clone https://github.com/do-community/digiaddress.git

Cela créera un nouveau dossier appelédigiaddress dans votre répertoire personnel. Déplacez ce répertoire vers la racine Web de votre serveur. Si vous avez suivi le tutoriel de la pile LAMP lié dans les prérequis, ce sera le répertoire/var/www/html:

sudo mv digiaddress/ /var/www/html/

Ce projet contient plusieurs fichiers PHP et JS auxquels vous ajouterez du code plus tard dans ce tutoriel. Pour afficher la structure des répertoires, installez d'abord le packagetree à l'aide deapt:

sudo apt install tree

Exécutez ensuite la commandetree avec le répertoiredigiaddress donné comme argument:

tree /var/www/html/digiaddress/
Outputdigiaddress/
├── README.md
├── db.php
├── fetchaddress.php
├── findaddress.php
├── generateDigitalAddress.php
├── geoimplement.php
├── index.php
└── js
    ├── createDigitialAddressApp.js
    └── findAddressApp.js

Vous pouvez voir dans cette sortie que le projet se compose de six fichiers PHP et de deux fichiers JavaScript. Ensemble, ces fichiers créent les deux fonctionnalités principales de l’application: créer un code de carte à partir d’une adresse physique et décoder un code de carte pour récupérer l’adresse physique d’origine. Les fichiers suivants activent la première fonctionnalité:

  • index.php

  • geoimplement.php

  • generateDigitialAddress.php

  • db.php

  • createDigitialAddressApp.js

Le fichierindex.php contient le code de l’interface utilisateur (UI) de l’application, qui consiste en un formulaire dans lequel les utilisateurs peuvent entrer une adresse physique. Le fichierindex.php appelle le fichiergeoimplement.php chaque fois qu'un utilisateur soumet le formulaire. geoimplement.php appelle l'API Google Maps et lui transmet l'adresse. Le serveur Google répond ensuite avec un JSON contenant les informations de l'adresse spécifiée, y compris sa latitude et sa longitude. Ces informations sont ensuite transmises au fichiergenerateDigitalAddress.php qui appelle l'API Mapcode pour obtenir un mapcode pour l'emplacement donné, comme spécifié par sa latitude et sa longitude. Le code de carte obtenu, ainsi que la latitude, la longitude et l'adresse physique, sont ensuite stockés dans la base de données créée à l'étape 2. db.php agit comme une aide pour cette opération. Le fichiercreateDigitalAddressApp.js effectue un certain nombre d'opérations qui contrôlent les éléments UX vus dans l'application, y compris la définition d'un marqueur et d'un rectangle de délimitation sur l'interface Google Maps.

Les trois fichiers restants activent la deuxième fonction de l'application, c'est-à-dire la récupération d'une adresse physique à partir d'un code de carte donné:

  • findaddress.php

  • fetchaddress.php

  • findAddressApp.js

Le fichierfindaddress.php définit l'interface utilisateur de l'application, qui est distincte de celle définie dansindex.php. L'application accepte en entrée un code de carte généré précédemment et affiche l'adresse physique correspondante stockée dans la base de données. Chaque fois qu'un utilisateur soumet ce formulaire,findaddress.php envoie un appel àfetchaddress.php qui récupère ensuite le mapcode respectif de la base de données. Le fichierfindAddressApp.js contient le code d'aide pour définir un marqueur et un rectangle de délimitation sur l'interface Google Maps.

Testez l'installation en visitanthttp://your_server_ip/digiaddress dans votre navigateur, en veillant à modifieryour_server_ip pour refléter l'adresse IP de votre serveur.

[.Remarque]##

Note: Si vous ne connaissez pas l’adresse IP de votre serveur, vous pouvez exécuter la commandecurl suivante. Cette commande imprimera le contenu de la page deicanhazip.com, un site Web qui affiche l'adresse IP de la machine qui y accède:

curl http://icanhazip.com

Une fois là-bas, vous verrez cette rubrique en haut de la fenêtre de votre navigateur:

Generate Digital Address

Cela confirme que vous avez correctement téléchargé les fichiers du projet. Avec cela, poursuivons avec le développement de la fonction principale de l’application: générer un code de carte.

[[step-4 -—- development-the-application-39-s-ui]] == Étape 4 - Développement de l'interface utilisateur de l'application

Bien que le code général de l'interface de l'application soit inclus dans les fichiers que vous avez téléchargés à l'étape précédente, vous devez néanmoins apporter quelques modifications et ajouts à certains de ces fichiers pour rendre l'application fonctionnelle et attrayante pour les utilisateurs. Nous allons commencer par mettre à jour le code pour développer l’interface utilisateur de l’application.

Ouvrez le fichierindex.php en utilisant votre éditeur préféré. Ici, nous utiliseronsnano:

nano /var/www/html/digiaddress/index.php

Recherchez la ligne de code suivante:

/var/www/html/digiaddress/index.php

. . .

. . .

Remplacez<YOUR KEY> par la clé API Google que vous avez obtenue à l'étape 1. Après avoir ajouté votre clé API, la ligne devrait ressembler à ceci:

/var/www/html/digiaddress/index.php

. . .

. . .

Ensuite, recherchez le commentaire suivant dans le fichierindex.php:

/var/www/html/digiaddress/index.php

. . .
            
. . .

Nous ajouterons quelques dizaines de lignes de code sous ce commentaire, ce qui créera un formulaire dans lequel les utilisateurs pourront saisir l'adresse d'un emplacement physique que l'application utilisera pour générer un code cartographique. Sous ce commentaire, ajoutez le code en surbrillance suivant qui crée un titre appeléEnter Address en haut du formulaire:

/var/www/html/digiaddress/index.php

. . .
            

            
Enter Address
. . .

En dessous, ajoutez le code HTML suivant. Cela crée un formulaire avec cinq champs de texte (avec leurs étiquettes appropriées) où les utilisateurs saisiront leurs informations:

/var/www/html/digiaddress/index.php

                . . .
                
. . .

Sous le code du formulaire, ajoutez les lignes suivantes. Celles-ci créent deux contrôles cachés qui transmettent les informations de latitude et de longitude dérivées de toute adresse soumise via le formulaire:

/var/www/html/digiaddress/index.php

                            . . .
                            
. . .

Enfin, fermez cette section en ajoutant le code suivant. Cela crée un boutonGenerate qui permettra aux utilisateurs de soumettre le formulaire:

/var/www/html/digiaddress/index.php

                            . . .
                            
                    
                
. . .

Après avoir ajouté ces éléments, cette section du fichier devrait correspondre à ceci:

/var/www/html/digiaddress/index.php

. . .
            

            
Enter Address

. . .

Enregistrez le fichier en appuyant surCTRL+O puis surENTER, puis visitez à nouveau l'application dans votre navigateur:

http://your_server_ip/digiaddress

Vous verrez les champs de formulaire nouvellement ajoutés et le boutonGenerate, et l'application devrait ressembler à ceci:

image

À ce stade, si vous entrez les informations d'adresse dans le formulaire et essayez de cliquer sur le boutonGenerate, rien ne se passera. Nous ajouterons la fonctionnalité de génération de mapcode ultérieurement, mais commençons par rendre cette page plus attrayante en ajoutant une carte avec laquelle les utilisateurs peuvent interagir.

[[step-5 -—- ajoutant-google-maps-controls]] == Étape 5 - Ajout de contrôles Google Maps

Lorsque les cartes sont affichées sur un site Web via l'API JavaScript de Google Maps, elles contiennent des fonctionnalités d'interface utilisateur qui permettent aux visiteurs d'interagir avec la carte qu'ils voient. Ces fonctionnalités sont appeléescontrols. Nous continuerons de modifier le fichierindex.php pour ajouter des contrôles Google Maps à cette application et, une fois terminé, les utilisateurs pourront afficher une carte à côté du formulaire de saisie, la faire glisser pour afficher différents emplacements, effectuer un zoom avant et arrière. et basculez entre les vues de la carte, du satellite et de la rue de Google.

Recherchez le commentaire suivant dans le fichierindex.php:

/var/www/html/digiaddress/index.php

. . .

. . .

Ajoutez le code en surbrillance suivant sous ce commentaire:

/var/www/html/digiaddress/index.php

. . .
        

        

. . .

Enregistrez le fichier, puis visitez à nouveau l'application dans votre navigateur. Vous verrez ce qui suit:

image

Comme vous pouvez le constater, nous avons ajouté avec succès une carte à l’application. Vous pouvez faire glisser la carte pour vous concentrer sur différents emplacements, effectuer des zooms avant et arrière et basculer entre les vues Carte, Satellite et Rue. En regardant le code que vous venez d’ajouter, notez que nous avons également ajouté deux contrôles d’étiquette qui afficheront les coordonnées géographiques et l’adresse physique qui ont été entrées sur le formulaire:

/var/www/html/digiaddress/index.php

            . . .
            
. . .

Rendez-vous de nouveau dans l'application dans votre navigateur et entrez le nom d'un état dans le premier champ. Lorsque vous déplacez votre curseur de texte vers le champ suivant, les étiquettes de latitude et de longitude n'apparaissent pas et l'emplacement affiché sur la carte ne change pas pour refléter les informations que vous avez entrées. Activons ces comportements.

[[step-6 -—- add-event-listeners]] == Étape 6 - Ajout d'écouteurs d'événements

L'ajout d'éléments interactifs à une application peut aider à garder ses utilisateurs engagés. Nous allons implémenter quelques comportements interactifs dans cette application grâce à l'utilisation deevent listeners.

Unevent est une action qui a lieu sur une page Web. Les événements peuvent être faits par un utilisateur ou par le navigateur lui-même. Voici des exemples d'événements courants:

  • En cliquant sur un bouton HTML

  • Changer le contenu d'un champ de saisie

  • Changer le focus d'un élément de page à un autre

Unevent listener est une directive qui indique à un programme d'effectuer une certaine action lorsqu'un événement spécifique se produit. Dans AngularJS, les écouteurs d'événements sont définis avec des directives qui suivent généralement ce format:

ng-event_type=expression

Dans cette étape, nous allons ajouter un écouteur d'événement qui aide à traiter les informations saisies par les utilisateurs dans un mapcode chaque fois qu'ils soumettent le formulaire. Nous allons également ajouter quelques écouteurs d'événements supplémentaires qui rendront l'application plus interactive. Plus précisément, nous utiliserons ces écouteurs pour modifier l’emplacement indiqué dans la carte de l’application, placer un marqueur et dessiner un rectangle autour de l’emplacement lorsque les utilisateurs entreront des informations dans le formulaire. Nous ajouterons ces écouteurs d'événements àindex.php, alors ouvrez à nouveau ce fichier si vous l'avez fermé:

nano /var/www/html/digiaddress/index.php

Faites défiler jusqu'au premier lot de code que nous avons ajouté et trouvez le bloc qui commence par<form>. Il ressemblera à ceci:

/var/www/html/digiaddress/index.php

                . . .
                    
. . .

Pour commencer, ajoutez l'écouteur d'événement en surbrillance suivant à la balise d'ouverture<form>. Ce code indique à l'application d'appeler la fonctionprocessForm chaque fois qu'un utilisateur soumet des informations via le formulaire. processForm est défini dans le fichiercreateDigitalAddressApp.js et sert de fonction d'assistance qui envoie les informations soumises par les utilisateurs aux fichiers appropriés qui les traitent ensuite dans un mapcode. Nous examinerons cette fonction de plus près à l’étape 7:

/var/www/html/digiaddress/index.php

                . . .
                    
. . .

Ensuite, continuez à éditer ce bloc en ajoutant quelques écouteurs d'événementblur. Un événementblur se produit lorsqu'un élément de page donné perd le focus. Ajoutez les lignes en surbrillance suivantes aux balisesinput du blocform. Ces lignes indiquent à l’application d’appeler la fonctiongeocodeAddress lorsque le focus d’un utilisateur s’éloigne des champs de formulaire respectifs que nous avons créés à l’étape 4. Notez que vous devez également supprimer les barres obliques et les signes supérieurs à (/>) qui ferment chaque baliseinput. Ne pas le faire empêchera l'application d'enregistrer correctement les événementsblur:

/var/www/html/digiaddress/index.php

                . . .
                
                            
. . .

La première de ces nouvelles lignes -ng-blur="geocodeAddress(address,'state')" required=""/> - se traduit par «Lorsque l’utilisateur se déplace loin du champ‘ état ’, appelez la fonctiongeocodeAddress.» Les autres nouvelles lignes appellent égalementgeocodeAddress, même si le focus de l'utilisateur s'éloigne de leurs champs respectifs.

Comme pour la fonctionprocessForm,geocodeAddress est déclaré dans le fichiercreateDigitalAddressApp.js, mais il n'y a pas encore de code dans ce fichier qui le définit. Nous allons compléter cette fonction pour qu'elle place un marqueur et dessine un rectangle sur la carte de l'application après que ces événementsblur se produisent pour refléter les informations saisies dans le formulaire. Nous ajouterons également du code qui prend les informations d’adresse et les traite en un code carte.

Enregistrez et fermez le fichierindex.php (appuyez surCTRL+X,Y, puis surENTER), puis ouvrez le fichier`createDigitalAddressApp.js`:

nano /var/www/html/digiaddress/js/createDigitalAddressApp.js

Dans ce fichier, recherchez la ligne suivante:

/var/www/html/digiaddress/js/createDigitalAddressApp.js

. . .
$scope.geocodeAddress = function (address, field) {
. . .

Cette ligne est l'endroit où nous déclarons la fonctiongeocodeAddress. Quelques lignes en dessous, nous déclarons une variable nomméefullAddress qui construit une adresse postale lisible par l'homme à partir des informations saisies par un utilisateur dans les champs du formulaire de l'application. Cela se fait via une série d'instructionsif:

/var/www/html/digiaddress/js/createDigitalAddressApp.js

. . .
var fullAddress = "";

    if (address ['house']) {
        angular.element(document.getElementById('generate'))[0].disabled = false;
            fullAddress = address ['house'] + ",";
                }
    if (address ['town']) {
        angular.element(document.getElementById('street'))[0].disabled = false;
            fullAddress = fullAddress + address ['town'] + ",";
    }
    if (address ['street']) {
        angular.element(document.getElementById('house'))[0].disabled = false;
            fullAddress = fullAddress + address ['street'] + ",";
    }
    if (address ['state']) {
        angular.element(document.getElementById('zip'))[0].disabled = false;
            fullAddress = fullAddress + address ['state'] + " ";
    }
    if (address ['zip']) {
        angular.element(document.getElementById('town'))[0].disabled = false;
            fullAddress = fullAddress + address ['zip'];
    }
. . .

Juste après ces lignes se trouve le commentaire suivant:

/var/www/html/digiaddress/js/createDigitalAddressApp.js

. . .
// add code for locating the address on Google maps
. . .

Sous ce commentaire, ajoutez la ligne suivante qui vérifie sifullAddress est une valeur autre que null:

/var/www/html/digiaddress/js/createDigitalAddressApp.js

                . . .
                if (fullAddress !== "") {
                . . .

Ajoutez le code suivant sous cette ligne. Ce code soumet les informations saisies dans le formulaire au fichiergeoimplement.php en utilisant lesHTTP POST method sifullAddress n'est pas nul:

/var/www/html/digiaddress/js/createDigitalAddressApp.js

                    . . .
                    $http({
                        method: 'POST',
                        url: 'geoimplement.php',
                        data: {address: fullAddress},
                        headers: {'Content-Type': 'application/x-www-form-urlencoded'}

                    }).then(function successCallback(results) {
                    . . .

Ensuite, ajoutez la ligne suivante qui vérifie si l'appel PHP a été renvoyé avec succès:

/var/www/html/digiaddress/js/createDigitalAddressApp.js

                        . . .
                        if (results.data !== "false") {
                        . . .

Si l’appel PHP a été renvoyé avec succès, nous pourrons traiter le résultat. Ajoutez la ligne suivante, qui supprime tout rectangle de délimitation qui aurait pu être précédemment dessiné sur la carte en appelant la fonctionremoveRectangle, qui est définie en haut du fichiercreateDigitalAddressApp.js:

/var/www/html/digiaddress/js/createDigitalAddressApp.js

                            . . .
                            removeRectangle();
                            . . .

Sous la ligneremoveRectangle();, ajoutez les quatre lignes suivantes qui créeront un marqueur pointant vers le nouvel emplacement sur le contrôle de carte:

/var/www/html/digiaddress/js/createDigitalAddressApp.js

                            . . .
                            new google.maps.Marker({
                                map: locationMap,
                                position: results.data.geometry.location
                            });
                            . . .

Ajoutez ensuite le code suivant, qui obtient les informations de latitude et de longitude du résultat et l'affiche avec les deux étiquettes HTML que nous avons créées dans le fichierindex.php à l'étape 5:

/var/www/html/digiaddress/js/createDigitalAddressApp.js

                            . . .
                            lat = results.data.geometry.location.lat;
                            lng = results.data.geometry.location.lng;

                            $scope.address.lat = lat;
                            $scope.address.lng = lng;

                            geoCoordLabel = angular.element(document.querySelector('#geocoordinates'));
                            geoCoordLabel.html("Geo Coordinate: " + lat + "," + lng);

                            geoAddressLabel = angular.element(document.querySelector('#geoaddress'));
                            geoAddressLabel.html("Geo Address: " + fullAddress);

                            $scope.latlng = true;
                            . . .

Enfin, sous ces lignes, ajoutez le contenu suivant. Ce code crée une fenêtre qui marque un nouveau rectangle de délimitation sur la carte:

/var/www/html/digiaddress/js/createDigitalAddressApp.js

                            . . .
                            if (results.data.geometry.viewport) {

                                rectangle = new google.maps.Rectangle({
                                    strokeColor: '#FF0000',
                                    strokeOpacity: 0.8,
                                    strokeWeight: 0.5,
                                    fillColor: '#FF0000',
                                    fillOpacity: 0.35,
                                    map: locationMap,
                                    bounds: {
                                        north: results.data.geometry.viewport.northeast.lat,
                                        south: results.data.geometry.viewport.southwest.lat,
                                        east: results.data.geometry.viewport.northeast.lng,
                                        west: results.data.geometry.viewport.southwest.lng
                                    }
                                });

                                var googleBounds = new google.maps.LatLngBounds(results.data.geometry.viewport.southwest, results.data.geometry.viewport.northeast);

                                locationMap.setCenter(new google.maps.LatLng(lat, lng));
                                locationMap.fitBounds(googleBounds);
                            }
                        } else {
                            errorLabel = angular.element(document.querySelector('#lt'));
                            errorLabel.html("Place not found.");
                            $scope.latlng = true;
                            removeRectangle();
                        }

                    }, function errorCallback(results) {
                       console.log(results);
                    });
                }
                . . .

Après avoir ajouté ce contenu, cette section du fichier ressemblera à ceci:

/var/www/html/digiaddress/js/createDigitalAddressApp.js

                . . .
                // add code for locating the address on Google maps
                if (fullAddress !== "") {
                    $http({
                        method: 'POST',
                        url: 'geoimplement.php',
                        data: {address: fullAddress},
                        headers: {'Content-Type': 'application/x-www-form-urlencoded'}

                    }).then(function successCallback(results) {

                        if (results.data !== "false") {
                            removeRectangle();

                            new google.maps.Marker({
                                map: locationMap,
                                position: results.data.geometry.location
                            });

                            lat = results.data.geometry.location.lat;
                            lng = results.data.geometry.location.lng;

                            $scope.address.lat = lat;
                            $scope.address.lng = lng;

                            geoCoordLabel = angular.element(document.querySelector('#geocoordinates'));
                            geoCoordLabel.html("Geo Coordinate: " + lat + "," + lng);

                            geoAddressLabel = angular.element(document.querySelector('#geoaddress'));
                            geoAddressLabel.html("Geo Address: " + fullAddress);

                            $scope.latlng = true;

                            if (results.data.geometry.viewport) {

                                rectangle = new google.maps.Rectangle({
                                    strokeColor: '#FF0000',
                                    strokeOpacity: 0.8,
                                    strokeWeight: 0.5,
                                    fillColor: '#FF0000',
                                    fillOpacity: 0.35,
                                    map: locationMap,
                                    bounds: {
                                        north: results.data.geometry.viewport.northeast.lat,
                                        south: results.data.geometry.viewport.southwest.lat,
                                        east: results.data.geometry.viewport.northeast.lng,
                                        west: results.data.geometry.viewport.southwest.lng
                                    }
                                });

                                var googleBounds = new google.maps.LatLngBounds(results.data.geometry.viewport.southwest, results.data.geometry.viewport.northeast);

                                locationMap.setCenter(new google.maps.LatLng(lat, lng));
                                locationMap.fitBounds(googleBounds);
                            }
                        } else {
                            errorLabel = angular.element(document.querySelector('#lt'));
                            errorLabel.html("Place not found.");
                            $scope.latlng = true;
                            removeRectangle();
                        }

                    }, function errorCallback(results) {
                       console.log(results);
                    });
                }
                . . .

Enregistrez le fichier, mais laissez-le ouvert pour le moment. Si vous revoyiez l’application dans votre navigateur, aucun changement ne serait apporté à son apparence ou à son comportement. De même, si vous saisissez une adresse et cliquez sur le boutonGenerate, l'application ne générerait pas ou n'afficherait toujours pas de mapcode. En effet, nous devons encore éditer quelques fichiers avant que la fonctionnalité mapcode ne fonctionne. Continuons à apporter ces modifications et à examiner de plus près la manière dont ces codes cartographiques sont générés.

[[step-7 -—- Understanding-Mapcode-Generation]] == Étape 7 - Comprendre la génération de Mapcode

Tout en regardant toujours le fichiercreateDigitalAddressApp.js, faites défiler la section de code que vous avez ajoutée à l'étape précédente pour trouver le code qui prend les informations soumises via le formulaire et le traiter en un mapcode unique. À chaque fois qu'un utilisateur clique sur le boutonGenerate, le code du fichierindex.php soumet le formulaire et appelle la fonctionprocessForm, qui est définie ici danscreateDigitalAddressApp.js:

/var/www/html/digiaddress/js/createDigitalAddressApp.js

. . .
$scope.processForm = function () {
. . .

processForm effectue alors un HTTP POST dans le fichiergenerateDigitalAddress.php:

/var/www/html/digiaddress/js/createDigitalAddressApp.js

. . .
$http({
    method: 'POST',
    url: 'generateDigitalAddress.php',
    data: $scope.address,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).then(function (response) {
. . .

LeStichting Mapcode Foundation fournit l'API qui génère des codes cartographiques à partir d'adresses physiques en tant que service Web gratuit. Pour comprendre le fonctionnement de cet appel au service Web Mapcode, fermezcreateDigitalAddressApp.js et ouvrez le fichiergenerateDigitialAddress.php:

nano /var/www/html/digiaddress/generateDigitalAddress.php

En haut du fichier, vous verrez ce qui suit:

/var/www/html/digiaddress/generateDigitalAddress.php

La ligne de lectureinclude("db.php"); indique à PHP àinclude tout le texte, le code et le balisage du fichierdb.php dans le fichiergenerateDigitalAddress.php. db.php contient les informations de connexion pour la base de données MySQL que vous avez créée à l'étape 2, et en l'incluant dansgenerateDigitalAddress.php, nous pouvons ajouter toutes les informations d'adresse soumises via le formulaire à la base de données.

Sous cette instructioninclude se trouvent quelques lignes supplémentaires qui obtiennent les informations de latitude et de longitude en fonction de la demande soumise parcreateDigitalAddressApp.js:

/var/www/html/digiaddress/generateDigitalAddress.php

. . .
$data = json_decode(file_get_contents("php://input"));
$lat = $data->lat;
$long = $data->lng;
. . .

Recherchez le commentaire suivant dans le fichiergenerateDigitalAddress.php.

/var/www/html/digiaddress/generateDigitalAddress.php

. . .
// call to mapcode web service
. . .

Ajoutez la ligne de code suivante sous ce commentaire. Ce code appelle l'API Mapcode, en envoyantlat etlong en tant que paramètres.

/var/www/html/digiaddress/generateDigitalAddress.php

. . .
// call to mapcode web service
$digitaldata = file_get_contents("https://api.mapcode.com/mapcode/codes/".$lat.",".$long."?include=territory,alphabet&allowLog=true&client=web");
. . .

Le service Web renvoie les données JSON qui ont été affectées àdigitaldata, et l'instruction suivante décode ce JSON:

/var/www/html/digiaddress/generateDigitalAddress.php

. . .
$digitalAddress["status"] = json_decode($digitaldata, TRUE)['local']['territory']." ".json_decode($digitaldata, TRUE)['local']['mapcode'];
. . .

Cela renvoie un code de carte pour l'emplacement spécifié par l'utilisateur. Les lignes suivantes stockent ensuite ces informations dans la base de données:

/var/www/html/digiaddress/generateDigitalAddress.php

. . .
$obj = new databaseConnection();

$conn = $obj->dbConnect();

$obj->insertLocation($conn, $digitalAddress["status"],$data->state,$data->zip,$data->street,$data->town,$data->house,$lat,$long);
. . .

Ensuite, la dernière ligne renvoie le code carte à la fonction appelant:

/var/www/html/digiaddress/generateDigitalAddress.php

. . .
echo json_encode($digitalAddress);

Enregistrez et fermez ce fichier, puis rouvrezcreateDigitalAddressApp.js:

nano /var/www/html/digiaddress/js/createDigitalAddressApp.js

Lorsqu'une mapcode a été récupérée avec succès, les lignes suivantes dans le fichiercreateDigitalAddressApp.js l'affiche à l'utilisateur dans une boîte de dialogue:

/var/www/html/digiaddress/js/createDigitalAddressApp.js

. . .
digiAddress = response.data.status;
. . .
$('#digitalAddressDialog').modal('show');
. . .

Bien que vous ayez ajouté une nouvelle ligne de code àgenerateDigitalAddress.php, vous ne verrez toujours aucun changement fonctionnel lorsque vous visitez et interagissez avec l'application dans votre navigateur. En effet, vous n’avez pas encore ajouté votre clé API Google au fichiergeoimplement.php, qui appelle réellement l’API Google Maps.

[[step-8 -—- enabled-calls-to-the-google-maps-api]] == Étape 8 - Activation des appels vers l'API Google Maps

Cette application dépend de l'API Google Maps pour traduire une adresse physique en coordonnées de latitude et de longitude appropriées. Celles-ci sont ensuite transmises à l'API Mapcode qui les utilise pour générer un mapcode. Par conséquent, si l’application ne parvient pas à communiquer avec l’API Google Maps pour générer la latitude et la longitude de l’emplacement, toute tentative de génération d’un code de carte échouera.

Rappelez-vous de l'étape 6 où, après avoir construit les donnéesaddress, nous avons transmis le résultat via une requête HTTP POST dans le fichiercreateDigitalAddressApp.js:

/var/www/html/digiaddress/js/createDigitalAddressApp.js

$http({
    method: 'POST',
    url: 'geoimplement.php',
    data: {address: fullAddress},
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).then(function successCallback(results) {

Ce bloc de code envoie les données d'adresse saisies par un utilisateur vers le fichiergeoimplement.php qui contient le code qui appelle l'API Google Maps. Allez-y et ouvrez ce fichier:

nano /var/www/html/digiaddress/geoimplement.php

Vous verrez qu'il décode d'abord lesaddress qui ont été reçus via la requête POST:

/var/www/html/digiaddress/geoimplement.php

. . .
$data=json_decode(file_get_contents("php://input"));
. . .

Il passe ensuite le champaddress des données d'entrée à une fonctiongeocode qui renvoie les informations géographiques sur l'adresse:

/var/www/html/digiaddress/geoimplement.php

. . .
$result = geocode($data->address);
. . .

Le résultat est ensuite renvoyé à l'appelant:

/var/www/html/digiaddress/geoimplement.php

. . .
echo json_encode($result);
. . .

La fonctiongeocode encode lesaddress et les transmet à l'API Google Maps, avec votre clé d'application:

/var/www/html/digiaddress/geoimplement.php

. . .
// url encode the address
$address = urlencode($address);

// google map geocode api url
$url = "https://maps.googleapis.com/maps/api/geocode/json?address={$address}&key=";
. . .

Avant de faire défiler, allez-y et ajoutez votre clé API à la ligne sous le commentaire// google map geocode api url:

/var/www/html/digiaddress/geoimplement.php

. . .
// google map geocode api url
$url = "https://maps.googleapis.com/maps/api/geocode/json?address={$address}&key=ExampleAPIKeyH2vITfv1eIHbfka9ym634Esw7u";
. . .

Après l'envoi de l'appel à l'API Google Maps, la réponse est décodée et sa valeur est renvoyée par la fonction:

/var/www/html/digiaddress/geoimplement.php

. . .
// get the json response
$resp_json = file_get_contents($url);

// decode the json
$resp = json_decode($resp_json, true);

if ($resp['status'] == 'OK') {
    return $resp['results'][0];
} else {
    return false;
}
. . .

Enregistrez ce fichier et visitez à nouveau votre application. EntrezUS-NY dans le champ d'état, puis appuyez surTAB pour changer le focus d'entrée sur le champ suivant. Vous verrez la sortie suivante:

image

Notez que les coordonnées et l'adresse physique que vous avez entrées dans le formulaire apparaissent sous la carte. Cela rend l'application plus attrayante et interactive.

[.Remarque]##

Note: En ce qui concerne les abréviations des noms de lieux, Mapcode utilise la norme ISO 3166. Cela signifie qu'il ne peut pas interpréter certaines abréviations couramment utilisées comme prévu. Par exemple, si vous souhaitez générer un Mapcode pour une adresse en Louisiane et que vous entrezLA, la carte passera à Los Angeles, en Californie (plutôt qu'à l'état de Louisiane).

Vous pouvez éviter toute confusion avec les abréviations postales américaines en les précédant deUS-. Dans le contexte de cet exemple de la Louisiane, vous saisirezUS-LA.

Pour en savoir plus sur la façon dont Mapcode utilise cette norme, consultez lesTerritories and standard codes reference page.

Malgré cette amélioration de la manière dont l’application affiche les emplacements sur la carte, l’application n’est toujours pas complètement fonctionnelle. La dernière étape que vous devez effectuer avant de pouvoir générer un mapcode est de modifier le fichierdb.php pour permettre à l'application d'accéder à votre base de données.

[[step-9 -—- ajoutant-database-credentials-and-testing-mapcode-generation]] == Étape 9 - Ajout des informations d'identification de la base de données et test de la génération de Mapcode

Rappelez-vous que cette application stocke chaque adresse saisie dans le formulaire - ainsi que sa latitude, sa longitude et son code de carte - dans la base de données que vous avez créée à l'étape 2. Ceci est rendu possible par le code dans le fichierdb.php, qui stocke les informations d'identification de votre base de données et permet à l'application d'accéder à la tablelocations qu'il contient.

Comme dernière étape pour activer la fonctionnalité de génération de mapcode, ouvrez le fichierdb.php pour le modifier:

nano /var/www/html/digiaddress/db.php

En haut de ce fichier, recherchez la ligne qui commence par$pass. Cette ligne soumet vos identifiants de connexion MySQL afin de permettre à l'application d'accéder à votre base de données. Remplacezyour_password par le mot de passe de votre utilisateur MySQLroot:

/var/www/html/digiaddress/db.php

. . .
        $username = "root";
        $pass = "your_password";
. . .

C'est le dernier changement que vous devez faire afin de générer un code de carte à partir d'une adresse physique. Enregistrez et fermez le fichier, puis réactualisez l'application dans votre navigateur. Entrez une adresse de votre choix et cliquez sur le boutonGenerate. La sortie ressemblera à ceci:

image

À ce stade, vous avez terminé votre demande et vous pouvez maintenant générer une adresse numérique abrégée pour n’importe quel emplacement physique dans le monde. N'hésitez pas à essayer différentes adresses et notez que l'adresse que vous entrez ne doit pas nécessairement se trouver aux États-Unis.

Votre dernière tâche consiste à activer la deuxième fonctionnalité de cette application: récupérer une adresse de la base de données à l’aide de son code correspondant.

[[step-10 -—- retrieving-a-physical-address]] == Étape 10 - Récupération d'une adresse physique

Maintenant que vous êtes en mesure de générer un code de carte à partir d’une adresse physique donnée, votre dernière étape consiste à extraire l’adresse physique d’origine, telle qu’elle est dérivée du code de carte. Pour ce faire, nous allons développer une interface utilisateur PHP, illustrée ici:

image

Le code de cette interface utilisateur est disponible dans le fichierfindaddress.php. Comme l'interface utilisateur définie dans ce fichier est assez similaire à l'interface utilisateur que nous avons abordée précédemment à l'étape 4, nous ne regarderons pas de trop près tous les détails de son fonctionnement. Nous allons cependant passer en revue ces trois fichiers pour expliquer de manière générale leur fonctionnement.

Pour activer la fonctionnalité de récupération d'adresses, vous devez ajouter votre clé API Google au fichierfindaddress.php, alors ouvrez-le avec votre éditeur préféré:

nano /var/www/html/digiaddress/findaddress.php

En bas du fichier, recherchez la ligne commençant par<script async defer src=. Il ressemblera à ceci:

/var/www/html/digiaddress/findaddress.php

Remplacez<YOUR KEY> par votre clé API Google comme vous l'avez fait dans les étapes précédentes, puis enregistrez le fichier. Avant de le fermer, cependant, examinons rapidement comment ces fichiers fonctionnent ensemble.

Lorsqu'un utilisateur soumet le formulaire, il déclenche un événementsubmit et un écouteur d'événements appelle la fonctionfetchadd:

/var/www/html/digiaddress/findaddress.php

. . .

. . .

La fonctionfetchadd envoie l'adresse numérique àfetchaddress.php avec une requête POST:

/var/www/html/digiaddress/js/findAddressApp.js

. . .
$http({
    method : 'POST',
    url : 'fetchaddress.php',
    data : {digiaddress: $scope.digiaddress}
}).then(function(response){
. . .

Si le POST réussit, la fonction renvoie une réponse JSON. La ligne suivante analyse cette réponse:

/var/www/html/digiaddress/js/findAddressApp.js

. . .
var jsonlatlng = JSON.parse(response.data.latlng);
. . .

Les lignes suivantes placent le marqueur sur la carte:

/var/www/html/digiaddress/js/findAddressApp.js

. . .
marker = new google.maps.Marker({
    position: new google.maps.LatLng(jsonlatlng.latitude, jsonlatlng.longitude),
        map: locationMap
});
. . .

Et ce qui suit imprime les coordonnées géographiques et l'adresse physique:

/var/www/html/digiaddress/js/findAddressApp.js

. . .
geoCoordLabel = angular.element(document.querySelector('#geocoordinates'));
geoCoordLabel.html("Geo Coordinate: "+ jsonlatlng.latitude +","+ jsonlatlng.longitude);

geoAddressLabel = angular.element(document.querySelector('#geoaddress'));
geoAddressLabel.html("Geo Address: " + jsonlatlng.house +","+ jsonlatlng.town +","+ jsonlatlng.street +","+ jsonlatlng.state + " " + jsonlatlng.zip );
. . .

Visitez cette application dans votre navigateur en cliquant sur le lien suivant:

http://your_server_ip/digiaddress/findaddress.php

Testez-le en entrant dans le mapcode que vous avez obtenu précédemment. La figure suivante montre une sortie typique:

image

Sur ce, votre application est terminée. Vous pouvez maintenant créer un code unique pour n’importe quel emplacement dans le monde, puis l’utiliser pour récupérer l’adresse physique de cet emplacement.

Conclusion

Dans ce didacticiel, vous avez utilisé l'API Google Maps pour identifier un lieu et obtenir ses informations de longitude et de latitude. Ces informations permettent de générer une adresse numérique unique et abrégée à l’aide de l’API Mapcode. Il existe un certain nombre de cas d'utilisation pratiques pour les codes de carte, allant des services d'urgence aux levés archéologiques. The Stichting Mapcode Foundation répertorie plusieurs de ces cas d'utilisation.

Remerciements

Un grand merci àDinesh Karpe etSayli Patil pour le développement de l'intégralité du code du projet.