Fermer

juin 7, 2021

Comment créer une application de géocodage dans Vue.js à l'aide de Mapbox


À propos de l'auteur

Prince Chukwudire est un ingénieur frontend qui s'intéresse à la mise en œuvre au pixel près des conceptions d'interface utilisateur centrées sur l'utilisateur et à l'écriture de tests unitaires pour améliorer le code…
En savoir plus sur
Prince

Dans ce guide, nous allons examiner de manière générale les concepts de géocodage avant et de géocodage inversé. Nous allons créer une mini-application qui applique ces concepts pour afficher des emplacements spécifiques, en utilisant Mapbox et Vue.js 2.6.11 pour y parvenir.

La précision et la modularité sont parmi les avantages qui font des géocodages moyen parfait pour trouver un emplacement particulier.

Dans ce guide, nous allons créer une application de géocodage simple à partir de zéro, en utilisant Vue.js et Mapbox. Nous couvrirons le processus depuis la construction de l'échafaudage frontal jusqu'à la construction d'un géocodeur pour gérer le géocodage avant et le géocodage inverse. Pour tirer le meilleur parti de ce guide, vous aurez besoin d'une compréhension de base de JavaScript et de Vue.js et de la façon de passer des appels d'API.

Qu'est-ce que le géocodage ?

Le géocodage est la transformation d'emplacements textuels en emplacements géographiques. coordonnées (généralement, longitude et latitude) qui indiquent un emplacement dans le monde.

Le géocodage est de deux types : en avant et en arrière. Le géocodage direct convertit les textes de localisation en coordonnées géographiques, tandis que le géocodage inverse convertit les coordonnées en textes de localisation.

En d'autres termes, le géocodage inverse transforme 40,714224, -73,961452 en "277 Bedford Ave, Brooklyn", et le géocodage avancé fait le contraire, tournant " 277 Bedford Ave, Brooklyn" dans 40.714224, -73.961452.

Pour donner plus d'informations, nous allons créer une mini application Web qui utilise une carte Web interactive avec des marqueurs personnalisés pour afficher les coordonnées de localisation, que nous décoderons ensuite en textes de localisation.

Notre application aura les fonctions de base suivantes :

  • donner à l'utilisateur l'accès à un affichage cartographique interactif avec un marqueur ;
  • permettre à l'utilisateur de déplacer le marqueur à volonté, tout en affichant les coordonnées ;
  • retourner un l'emplacement textuel ou les coordonnées de l'emplacement à la demande de l'utilisateur.

]Configurer le projet à l'aide de Vue CLI

Nous utiliserons le boilerplate trouvé dans ce référentiel. Il contient un nouveau projet avec Vue CLI et yarn en tant que gestionnaire de paquets. Vous devrez cloner le référentiel. Assurez-vous que vous travaillez à partir de la branche geocoder/boilerplate.

Configurer la structure de fichiers de l'application

Ensuite, nous devrons configurer la structure de fichiers de notre projet. Renommez le fichier Helloworld.vue dans le dossier du composant en Index.vue et laissez-le vide pour le moment. Allez-y et copiez ce qui suit dans le fichier App.vue :

 

Ici, nous avons importé puis enregistré le composant récemment renommé localement. Nous avons également ajouté une barre de navigation pour améliorer l'esthétique de notre application.

Nous avons besoin d'un fichier .env pour charger les variables d'environnement. Allez-y et ajoutez-en un à la racine de votre dossier de projet.

Installez les packages et les bibliothèques requis

Pour démarrer le processus de développement, nous devrons installer les bibliothèques requises. Voici une liste de ceux que nous utiliserons pour ce projet :

  1. Mapbox GL JS
    Cette bibliothèque JavaScript utilise WebGL pour restituer des cartes interactives à partir de vector tile et Mapbox .
  2. Mapbox-gl-geocoder
    Ce contrôle de géocodeur pour Mapbox GL nous aidera avec notre géocodage avancé.
  3. Dotenv
    Nous n'aurons pas à l'installer car il est préinstallé avec Vue CLI. Il nous aide à charger des variables d'environnement à partir d'un fichier .env dans process.env. De cette façon, nous pouvons séparer nos configurations de notre code.
  4. Axios
    Cette bibliothèque nous aidera à faire des requêtes HTTP.

Installez les packages dans votre CLI en fonction de votre gestionnaire de packages préféré. Si vous utilisez Yarn, exécutez la commande ci-dessous :

cd geocoder && wire add mapbox-gl @mapbox/mapbox-gl-geocoder axios

Si vous utilisez npm, exécutez ceci :

cd geocoder && npm i mapbox-gl @mapbox/mapbox-gl-geocoder axios --save

Nous avons d'abord dû entrer dans le dossier geocoder avant d'exécuter la commande d'installation.

Scaffolding the Front End With Vue .js

Créons une mise en page pour notre application. Nous aurons besoin d'un élément pour héberger notre carte, d'une région pour afficher les coordonnées tout en écoutant le mouvement du marqueur sur la carte, et de quelque chose pour afficher l'emplacement lorsque nous appelons l'API de géocodage inversé. Nous pouvons héberger tout cela dans un composant de carte.

Copiez ce qui suit dans votre fichier Index.vue :

Pour voir ce que nous avons actuellement, démarrez votre serveur de développement. Pour Yarn :

yarn serve

Ou pour npm :

npm run serve

Notre application devrait ressembler à ceci maintenant :

Scaffold preview
Geocoding app scaffold preview. ( Grand aperçu)

Le point vide à gauche semble éteint. Il devrait abriter notre affichage de carte. Ajoutons cela.

Affichage de carte interactif avec Mapbox

La première chose que nous devons faire est d'accéder aux bibliothèques Mapbox GL et Geocoder. Nous commencerons par importer les bibliothèques Mapbox GL et Geocoder dans le fichier Index.vue.

import axios depuis "axios" ;
importer mapboxgl de "mapbox-gl" ;
importer MapboxGeocoder depuis "@mapbox/mapbox-gl-geocoder" ;
import "@mapbox/mapbox-gl-geocoder/dist/mapbox-gl-geocoder.css" ;

Mapbox nécessite un token d'accès unique pour calculer les tuiles vectorielles de la carte. Obtenez le vôtre et ajoutez-le en tant que variable d'environnement dans votre fichier .env.

.env
VUE_APP_MAP_ACCESS_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Nous devons également définir les propriétés qui aider à assembler nos tuiles de carte dans notre instance de données. Ajoutez ce qui suit sous l'endroit où nous avons importé les bibliothèques :

export default {
  Les données() {
    revenir {
      chargement : faux,
      emplacement: "",
      access_token : process.env.VUE_APP_MAP_ACCESS_TOKEN,
      centre : [0, 0],
      carte: {},
    } ;
  },
}
  • La propriété location sera modélisée en fonction de l'entrée que nous avons dans notre échafaudage. Nous l'utiliserons pour gérer le géocodage inversé (c'est-à-dire afficher un emplacement à partir des coordonnées).
  • La propriété center contient nos coordonnées (longitude et latitude). Ceci est essentiel pour assembler nos tuiles de carte, comme nous le verrons bientôt.
  • La propriété access_token fait référence à notre variable d'environnement, que nous avons ajoutée précédemment.
  • La map La propriété sert de constructeur pour notre composant de carte.

Créons une méthode qui trace notre carte interactive avec notre géocodeur avancé intégré. Cette méthode est notre fonction de base, servant d'intermédiaire entre notre composant et Mapbox GL ; nous appellerons cette méthode createMap. Ajoutez ceci sous l'objet de données :

mount () {
  this.createMap()
},

méthodes : {
  async createMap() {
    essayer {
      mapboxgl.accessToken = this.access_token;
      this.map = new mapboxgl.Map({
        conteneur : "carte",
        style : "mapbox://styles/mapbox/streets-v11",
        center: this.center,
        zoom : 11,
      });

    } attraper (err) {
      console.log("erreur de carte", err);
    }
  },
},

Pour créer notre carte, nous avons spécifié un conteneur qui héberge la carte, une propriété style pour le format d'affichage de notre carte et une propriété center pour abriter nos coordonnées. La propriété center est un type de tableau et contient la longitude et la latitude.

Mapbox GL JS initialise notre carte en fonction de ces paramètres sur la page et nous renvoie un objet Map. L'objet Map fait référence à la carte sur notre page, tout en exposant des méthodes et des propriétés qui nous permettent d'interagir avec la carte. Nous avons stocké cet objet renvoyé dans notre instance de données, this.map.

Forward Geocoding With Mapbox Geocoder

Maintenant, nous allons ajouter le géocodeur et le marqueur personnalisé. Le géocodeur gère le géocodage avancé en transformant les emplacements textuels en coordonnées. Cela apparaîtra sous la forme d'une zone de saisie de recherche annexée à notre carte.

Ajoutez ce qui suit sous l'initialisation this.map que nous avons ci-dessus :

let geocoder = new MapboxGeocoder({
    accessToken : this.access_token,
    mapboxgl: mapboxgl,
    marqueur : faux,
  });

this.map.addControl(géocodeur);

geocoder.on("résultat", (e) => {
  marqueur const = new mapboxgl.Marker({
    déplaçable : vrai,
    couleur : "#D80739",
  })
    .setLngLat(e.result.center)
    .addTo(this.map);
  this.center = e.result.center;
  marker.on("dragend", (e) => {
    this.center = Object.values(e.target.getLngLat());
  });
});

Ici, nous avons d'abord créé une nouvelle instance d'un géocodeur à l'aide du constructeur `MapboxGeocoder`. Cela initialise un géocodeur basé sur les paramètres fournis et retourne un objet, exposé aux méthodes et aux événements. La propriété `accessToken` fait référence à notre jeton d'accès Mapbox et `mapboxgl` fait référence au [map library](https://docs.mapbox.com/#maps) actuellement utilisé.
Le marqueur personnalisé est au cœur de notre application ; le géocodeur est livré avec un par défaut. Ceci, cependant, ne nous donnerait pas toute la personnalisation dont nous avons besoin; par conséquent, nous l'avons désactivé.
En continuant, nous avons passé notre géocodeur nouvellement créé en tant que paramètre à la méthode `addControl`, qui nous est exposée par notre objet map. `addControl` accepte un `contrôle` comme paramètre.
Pour créer notre marqueur personnalisé, nous avons utilisé un événement qui nous est exposé par notre objet géocodeur. L'écouteur d'événement « on » nous permet de nous abonner aux événements qui se produisent dans le géocodeur. Il accepte divers [events](https://github.com/mapbox/mapbox-gl-geocoder/blob/master/API.md#on) comme paramètres. Nous écoutons l'événement « result », qui est déclenché lorsqu'une entrée est définie.
En un mot, sur `result`, notre constructeur de marqueur crée un marqueur, basé sur les paramètres que nous avons fournis (un attribut et une couleur déplaçables, dans ce cas). Il renvoie un objet, avec lequel nous utilisons la méthode `setLngLat` pour obtenir nos coordonnées. Nous ajoutons le marqueur personnalisé à notre carte existante à l'aide de la méthode « addTo ». Enfin, nous mettons à jour la propriété `center` dans notre instance avec les nouvelles coordonnées.
Nous devons également suivre le mouvement de notre marqueur personnalisé. Nous y sommes parvenus en utilisant l'écouteur d'événement `dragend` et nous avons mis à jour notre propriété `center` avec les coordonnées actuelles.
Mettons à jour le modèle pour afficher notre carte interactive et géocodeur avancé. Mettez à jour la section d'affichage des coordonnées dans notre modèle avec les éléments suivants :

Coordonnées actuelles

Latitude : {{ center[0] }}

Longitude : {{ center[1] }}

Vous vous souvenez comment nous mettions toujours à jour notre propriété center à la suite d'un événement ? Nous affichons ici les coordonnées en fonction de la valeur actuelle.

Pour améliorer l'esthétique de notre application, ajoutez le fichier CSS suivant dans la section head du fichier index.html. Placez ce fichier dans le dossier public.

Notre application devrait ressembler à ceci maintenant :

Aperçu du géocodage avant
Aperçu du géocodage avant. ( Grand aperçu)

Emplacement de géocodage inversé avec l'API Mapbox

Maintenant, nous allons gérer le géocodage inversé de nos coordonnées vers des emplacements textuels. Écrivons une méthode qui gère cela et déclenchons-la avec le bouton Get Location dans notre modèle.

Le géocodage inversé dans Mapbox est géré par l'API de géocodage inversé. Cela accepte longitudelatitude et jeton d'accès comme paramètres de demande. Cet appel renvoie une charge utile de réponse – généralement, avec divers détails. Notre préoccupation est le premier objet du tableau featuresoù se trouve l'emplacement géocodé inversé.

Nous devrons créer une fonction qui envoie la longitudelatitude et access_token de l'emplacement que nous voulons accéder à l'API Mapbox. Nous devons les envoyer afin d'obtenir les détails de cet emplacement.

Enfin, nous devons mettre à jour la propriété location dans notre instance avec la valeur de la clé place_name dans l'objet.

En dessous de la fonction createMap()ajoutons une nouvelle fonction qui gère ce que nous voulons. Voici à quoi cela devrait ressembler :

async getLocation() {
  essayer {
    this.loading = true;
    réponse const = wait axios.get(
      `https://api.mapbox.com/geocoding/v5/mapbox.places/${this.center[0]},${this.center[1]}.json?access_token=${this.access_token}`
    );
    this.loading = false;
    this.location = response.data.features[0].place_name;
  } attraper (err) {
    this.loading = false;
    console.log(err);
  }
},

Cette fonction envoie une requête GET à l'API Mapbox. La réponse contient place_name — le nom de l'emplacement sélectionné. Nous l'obtenons à partir de la réponse, puis la définissons comme la valeur de this.location.

Une fois cela fait, nous devons éditer et configurer le bouton qui appellera cette fonction que nous avons créée. Nous utiliserons un écouteur d'événement click — qui appellera la méthode getLocation lorsqu'un utilisateur cliquera dessus. Allez-y et modifiez le composant de bouton pour cela.


Cerise sur le gâteau, attachons une fonction pour copier l'emplacement affiché dans le presse-papiers. Ajoutez ceci juste en dessous de la fonction getLocation :

copyLocation() {
  si (ce.emplacement) {
    navigator.clipboard.writeText(this.location);
    alert("Emplacement copié")
  }
  revenir;
},

Mettez à jour le composant bouton Copier pour déclencher ceci :

Conclusion

Dans ce guide, nous avons examiné le géocodage à l'aide de Mapbox. Nous avons créé une application de géocodage qui transforme les emplacements textuels en coordonnées, affichant l'emplacement sur une carte interactive, et qui convertit les coordonnées en emplacements textuels, selon la demande de l'utilisateur. Ce guide n'est qu'un début. Beaucoup plus pourrait être réalisé avec les API de géocodage, comme changer la présentation de la carte en utilisant les différents styles de carte fournis par Mapbox.

Ressources

Smashing Editorial" width="35" height ="46" loading="lazy" decoding="async(ks, vf, yk, il, al)




Source link