Connaître les similitudes et les différences entre Google Maps et MapBox dans une application React vous aidera à choisir le bon outil pour le travail. Cet article compare et fait la différence entre ces deux bibliothèques populaires et vous permet de démarrer avec celui que vous choisissez.
Airbnb, Uber, Realtor et de nombreux autres sites Web fournissent une vue cartographique de leurs données. Sans surprise, c'est le moyen le plus simple de visualiser des données géographiques, que possèdent de nombreuses applications. Un problème se pose cependant lorsque vous lisez la documentation des deux bibliothèques de cartographie les plus populaires: Google Maps et MapBox. Vous ne trouverez pas de documentation sur la façon de les utiliser facilement dans React, le framework frontal le plus populaire.
Dans cet article, nous verrons comment afficher des données sur une carte dans React, en montrant des exemples à la fois avec Google Maps et MapBox. La version finale de Google Maps et de la version MapBox peut être trouvée ici. Si vous souhaitez suivre une vidéo, consultez les vidéos de Google Maps et MapBox que j'ai postées.
Nous avons besoin de données
Ottawa, la capitale de Le Canada possède un grand ensemble de données ouvertes pour leur ville. Dans cet exemple, nous allons travailler avec des données montrant où se trouvent tous les skateparks de la ville. Le fichier JSON entier peut être ici mais j'ai effacé les champs que nous n'utilisons pas pour montrer un petit échantillon de ce à quoi il ressemble.
La chose la plus importante, et l'obligation de placer quoi que ce soit sur une carte, est la latitude et la longitude d'un lieu. Dans l'exemple ci-dessous, la propriété Coordinates
possède un tableau dont la longitude est le premier élément et la latitude le second.
{
"caractéristiques": [{
"properties": {
"PARK_ID": 960,
"NAME": "Bearbrook Skateboard Park",
"DESCRIPTION": "Flat asphalt surface, 5 components"
},
"geometry": {
"coordinates": [-75.3372987731628, 45.383321536272049]
}
}, {
"Propriétés": {
"PARK_ID": 1219,
"NAME": "Parc de planche à roulettes Bob MacQuarrie (SK8 Extreme Park)",
"DESCRIPTION": "Surface asphaltée plate, 10 composants, City Run apprend les programmes de skateboard, Camps de skateboard City Run en été"
},
"géométrie": {
"coordonnées": [-75.546518086577947, 45.467134581917357]
}
}, {
"Propriétés": {
"PARK_ID": 1157,
"NAME": "Walter Baker Skateboard Park",
"DESCRIPTION": "Bol en béton, 7 000 pieds carrés"
},
"géométrie": {
"coordonnées": [-75.898610599532319, 45.295014379864874]
}
}]
}
React et Google Maps
Nous utiliserons une bibliothèque React appelée react-google-maps pour nous aider à intégrer React à Google Maps. Après l’avoir installé, nous devons maintenant saisir une clé API. Cela peut être fait dans la console de développeur Google . Vous devriez pouvoir utiliser un compte gratuit, à condition qu'il s'agisse d'un projet personnel ou d'une démo. Assurez-vous d'activer l'API JavaScript de Google Maps
pour votre projet.
Plutôt que de placer notre clé API dans notre code, utilisons une variable d'environnement pour la rendre disponible. Dans create-react-app, les variables d'environnement commençant par REACT_APP_
sont automatiquement mises à disposition. Nous le placerons dans un fichier nommé .env.local
en veillant à l'inclure dans le fichier .gitignore
.
REACT_APP_GOOGLE_KEY = "your-api-code-here "
Nous reviendrons plus tard sur cette clé API. Pour l'instant, commençons à construire notre carte!
Prise en main de Google Maps
Le premier composant que nous allons construire est le composant de la Carte
. Son but est de restituer les données à l'intérieur du composant GoogleMap
qui provient du package que nous avons installé. Cela ne nécessite aucun accessoire initial, mais il est assez typique de passer au niveau de zoom et de centrer la carte.
import {GoogleMap} from "react-google-maps";
fonction Map () {
revenir (
{/ * Nous allons rendre nos données ici * /}
)
}
Ajout de données à Google Maps
Avec le composant Carte qui rend le GoogleMap
il est temps d'y insérer des données. Nous importons nos données à partir d'un fichier JSON local, mais vous pouvez tout aussi facilement les charger à partir d'une API distante via un crochet useEffect
lorsque le composant est monté. L'idée est de parcourir en boucle chacun des skateparks, ce qui donne un marqueur
pour chacun d'eux.
importer {GoogleMap, Marker} à partir de "react-google-maps";
import * en tant que parkData à partir de "./data/skateboard-parks.json";
fonction Map () {
revenir (
{parkData.features.map (park => (
))}
)
}
La clé
est toujours nécessaire lorsque vous mappez un tableau dans React, tandis que la position
indique où le placer. Le support icon
n'est pas nécessaire, mais il vous permet de remplacer le marqueur rouge typique par quelque chose de personnalisé.
Gérer les clics dans Google Maps
Tous nos marqueurs étant affichés, nous peut maintenant gérer lorsque l'utilisateur clique sur l'un d'eux. Ce que nous allons faire, c'est utiliser un état (avec useState
) pour savoir quel marqueur a été cliqué, montrant ses détails à l'intérieur d'un InfoWindow
popup.
Un onClick
prop a été ajouté à chaque marqueur (19459015), ce qui permet à ce parc de devenir le
selectedPark
. Sous les balises, nous vérifions s’il existe un sélectionnéParc
et, si tel est le cas, affiche une InfoWindow
avec tous les détails du parc sélectionné. Ce composant nécessite également une position et un accessoire onCloseClick
pour savoir quoi faire lorsque l'utilisateur le ferme.
import React, {useState} from "react";
importer {GoogleMap, Marker, InfoWindow} de "react-google-maps";
import * en tant que parkData à partir de "./data/skateboard-parks.json";
fonction Map () {
const [selectedPark, setSelectedPark] = useState (null);
revenir (
{parkData.features.map (park => (
)
}
Affichage de la carte
Nous y sommes presque! La dernière étape consiste à utiliser ce composant Map
. Pour cela, nous devons utiliser deux composants HOC (Higher Order Components) qui relient notre Map
aux scripts JavaScript de Google Maps.
import {
// importations existantes
avecGoogleMap,
avecScriptjs
} de "réagir-google-maps";
// Composant de la carte ici
const MapWrapped = withScriptjs (avecGoogleMap (Map));
fonction d'exportation par défaut App () {
revenir (
<MapWrapped
googleMapURL = {`https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=geometry,drawing,places&key=$ {
process.env.REACT_APP_GOOGLE_KEY
} `}
loadingElement = {}
containerElement = {}
mapElement = {}
/>
)
}
Le composant de MapWrapped
doit se trouver à l'intérieur d'un div
comportant certaines dimensions. Le mien occupe tout l'écran (100vh et 100vw). googleMapURL
qui inclut la clé API susmentionnée, ainsi que trois éléments utilisés en interne par le package.
Application de styles à Google Maps
Si le Les styles standard sont trop ennuyeux pour vous, rendez-vous sur Snazzy Maps et prenez le JS pour votre style préféré. Cela peut être transmis au composant de GoogleMap
à l'aide de defaultOptions
prop. J'ai placé tous ces styles dans un fichier appelé mapStyles.js
qui les exporte par défaut.
import mapStyles depuis "./mapStyles";
fonction Map () {
revenir (
{/ * Marqueurs et InfoWindow ici * /}
)
}
React et MapBox
Pour MapBox, nous allons utiliser le package react-map-gl créé par l'équipe d'Uber. MapBox nécessite également un jeton d'accès, qui peut être créé gratuitement sur le site Web de MapBox . Nous allons placer le jeton d'accès à l'intérieur du fichier .env.local
:
REACT_APP_MAPBOX_TOKEN = "your-token-here"
Bien démarrer avec MapBox
Après avoir fini de montrer comment Google Maps fonctionne dans React, je pense que vous constaterez que MapBox est légèrement plus facile. Cependant, ils ont un certain nombre de différences, l'une d'elles étant que Google Maps contrôle sa propre position (où l'utilisateur a fait glisser la carte vers, effectué un zoom avant ou arrière, etc.), alors qu'avec MapBox, il nous appartient de suivre toutes ces informations. Détails à l'intérieur de certains états que nous appellerons la vue
.
Après avoir fourni à la fenêtre quelques valeurs initiales telles que la latitude, la longitude et le zoom, MapBox dispose d'un accessoire appelé onViewportChange
qui est appelé avec la nouvelle fenêtre, en fonction des actions de l'utilisateur. C’est à nous de mettre à jour l’état, ce qui entraînera le repositionnement de la carte, puisque nous passons viewport {... viewport}
sur la carte.
Veuillez noter que nous devait fournir la mapboxApiAccessToken
. Vous pouvez également remarquer qu’il existe un mapStyle
prop. Vous pouvez trouver les styles en saisissant l'URL Style
dans l'un des styles ici .
import React, {useState, useEffect} à partir de "react";
importer ReactMapGL, {Marker, Popup} de "react-map-gl";
import * as parkDate from "./data/skateboard-parks.json";
fonction d'exportation par défaut App () {
const [viewport, setViewport] = useState ({
latitude: 45,4211,
longitude: -75,6903,
largeur: "100vw",
hauteur: "100vh",
zoom: 10
});
revenir (
{setViewport (viewport); }}
>
{/ * Les marqueurs et Popup iront ici * /}
);
}
Affichage des données dans MapBox
Une fois la carte configurée, il est temps d'afficher certaines données. Ceci est très similaire à la façon dont nous l'avons traité dans l'exemple de Google Maps. Nous allons cartographier (sans jeu de mots) les skateparks, en créant un Marker
pour chacun. Vous remarquerez qu'avec MapBox, vous devez fournir toute l'interface utilisateur du Marker
en créant un style pour un bouton, en ajoutant une image à l'intérieur de celui-ci ou en effectuant le rendu dans votre propre application. MapBox est très flexible de cette façon.
Notez qu’il existe un gestionnaire de clics sur le bouton. Ceci sera utilisé pour déterminer quel skatepark afficher les détails dans la section ci-dessous. Le code suivant se trouve dans le composant ReactMapGL
:
{parkDate.features.map (park => (
)}}
Gestion des clics dans MapBox
Nous avons déjà rendu la carte avec tous ses marqueurs. Il est maintenant temps de gérer l'affichage des détails d'un skatepark lorsque son Marker
a été cliqué. Nous allons créer un état appelé selectedPark
qui sera défini dans l'appui onClick
de chaque marqueur
.
Il y a d'abord un contrôle pour voir si selectedPark
a une valeur et, si c'est le cas, un composant Popup
est restitué. Popup
requiert la latitude et la longitude comme accessoires, avec un gestionnaire de clics onClose
qui définit l'état sur null
. À l'intérieur d'un Popup
vous pouvez placer le code HTML que vous souhaitez afficher pour l'utilisateur.
import React, {useState, useEffect} de "react";
importer ReactMapGL, {Marker, Popup} de "react-map-gl";
import * as parkDate from "./data/skateboard-parks.json";
fonction d'exportation par défaut App () {
const [viewport, setViewport] = useState ({
latitude: 45,4211,
longitude: -75,6903,
largeur: "100vw",
hauteur: "100vh",
zoom: 10
});
const [selectedPark, setSelectedPark] = useState (null);
revenir (
{setViewport (viewport); }}
>
{/ * Marqueurs ici * /}
{selectedPark? (
{setSelectedPark (null); }}
>
{selectedPark.properties.NAME}
{selectedPark.properties.DESCRIPTION}
): null}
);
}
Conclusion
Dans cet article, nous avons expliqué comment intégrer les deux bibliothèques de cartes les plus populaires dans notre application React. Avec ces compétences, nous sommes maintenant prêts à être le prochain démarrage de licorne! OK OK, sans vous laisser emporter, de nombreuses applications doivent afficher leurs données sur une carte, et savoir comment le faire dans l'une de ces bibliothèques est une grande compétence. Même si Google Maps et MapBox présentent des différences, les idées principales sont les mêmes: restituez les marqueurs pour chaque emplacement et gérez les événements liés aux clics afin d'afficher les détails de l'emplacement sur lequel l'utilisateur a cliqué.
Source link