Premiers pas avec Google Maps pour Android Avancé

1. Introduction

Bien que les fonctionnalités standard de Google Maps soient incroyablement utiles, vous voudrez parfois en faire un peu plus. Heureusement, Google a créé une bibliothèque open source contenant un ensemble d'utilitaires que les développeurs Android peuvent utiliser pour améliorer encore leurs applications avec des cartes améliorées..

Dans ce didacticiel, vous apprendrez à utiliser cette bibliothèque d’utilitaires pour ajouter des visualisations de carte thermique à vos données, regrouper un grand nombre de marqueurs pour en faciliter la visualisation et utiliser diverses méthodes pour travailler avec la nature sphérique de la Terre ou tracer des itinéraires sur des routes..

Les fichiers sources de ce tutoriel sont disponibles sur GitHub.

2. Configuration

Dans le premier tutoriel de cette série, j'ai expliqué comment configurer un projet à l'aide de la console développeur Google et ajouter une clé API à votre manifeste. Pour ce tutoriel, vous devez obtenir une clé API et configurer votre projet avec un manifeste, comme décrit ici..

Ensuite, ouvrez build.gradle et ajoutez deux nouvelles dépendances, une pour Play Services pour utiliser Google Maps et une autre pour la bibliothèque Google Maps Utils.

compiler 'com.google.android.gms: play-services-maps: 7.8.0' compiler 'com.google.maps.android:android-maps-utils:0.4'

Je dois noter que la bibliothèque Google Maps Utils est encore techniquement en version bêta, même si elle est disponible depuis deux ans. Une fois que vous avez importé ces bibliothèques et synchronisé le projet, vous devez mettre à jour le fichier de présentation pour MainActivity.java afin qu'il utilise le fragment personnalisé présenté ci-dessous.

   

Ensuite, créez le UtilsListFragment classe utilisée ci-dessus afin d'afficher une simple liste d'éléments représentant les différentes parties de la bibliothèque que vous apprendrez dans ce didacticiel.

classe publique UtilsListFragment étend ListFragment @Override vide public onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); ArrayAdapter adaptateur = new ArrayAdapter(getActivity (), android.R.layout.simple_list_item_1); String [] items = getResources (). GetStringArray (R.array.list_items); adapter.addAll (new ArrayList (Arrays.asList (items))); setListAdapter (adaptateur);  @Override public void onListItemClick (ListView l, Vue v, position int, id long) super.onListItemClick (l, v, position, id); Elément de chaîne = ((TextView) v) .getText (). ToString (); if (getString (R.string.item_clustering) .equalsIgnoreCase (item)) startActivity (nouvelle intention (getActivity (), ClusterMarkerActivity.class));  else if (getString (R.string.item_heat_map) .equalsIgnoreCase (item)) startActivity (nouvelle intention (getActivity (), HeatMapActivity.class));  else if (getString (R.string.item_polylines) .equalsIgnoreCase (item)) startActivity (nouvelle intention (getActivity (), PolylineActivity.class));  else if (getString (R.string.item_spherical_geometry) .equalsIgnoreCase (item)) startActivity (nouvelle intention (getActivity (), SphericalGeometryActivity.class)); 

Chacune des chaînes est définie et placée dans un tableau de chaînes pour l'uniformité.

Clustering Carte de chaleur Décodage de polylignes Utilités de la géométrie sphérique  @ string / item_clustering @ string / item_heat_map @ string / item_polylines @ string / item_spherical_geometry 

Une fois votre liste disponible, vous devez créer BaseMapActivity.java, qui gère toute la configuration commune liée à la carte pour chacune des activités d'exemple que vous allez créer. Ce Activité initialise un Google Map et agrandit la caméra dans une zone spécifiée. Dans ce cas, il s’agit de la ville de Denver au Colorado, aux États-Unis. Tout dans cette classe devrait sembler familier des deux derniers articles de cette série.

classe abstraite publique BaseMapActivity étend AppCompatActivity protected LatLng mCenterLocation = new LatLng (39.7392, -104.9903); GoogleMap protégé mGoogleMap; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (getMapLayoutId ()); initMapIfNecessary ();  @Override protected void onResume () super.onResume (); initMapIfNecessary ();  void protected initMapIfNecessary () if (mGoogleMap! = null) return;  mGoogleMap = ((MapFragment) getFragmentManager (). findFragmentById (R.id.map)) .getMap (); initMapSettings (); initCamera ();  Void protected initCamera () PositionPositionCarte = CameraPosition.builder () .target (mCenterLocation) .zoom (getInitialMapZoomLevel ()) .build (); mGoogleMap.animateCamera (CameraUpdateFactory.newCameraPosition (position), null);  protected int getMapLayoutId () return R.layout.activity_map;  float protégé getInitialMapZoomLevel () return 12.0f;  abstract abstract protégé initMapSettings (); 

Maintenant que le projet initial est créé, vous pouvez passer à la section suivante où vous créerez un nouveau Activité pour chaque utilitaire que nous allons couvrir dans ce tutoriel.

3. Cartes de chaleur

Les cartes thermiques sont un excellent moyen de représenter visuellement les concentrations de points de données sur une carte. La bibliothèque Google Maps Utils facilite leur ajout à une application. Pour commencer, créez un nouveau BaseMapActivity nommé HeatMapActivité et l'ajouter à votre AndroidManifest.xml fichier. Au sommet de cette classe, déclarez un HeatmapTileProvider que nous allons utiliser pour construire la superposition de carte.

HeatmapTileProvider privé mProvider;

Dans BaseMapActivity, une méthode nommée initMapSettings est appelé qui vous permet d’ajouter vos personnalisations à la carte. Pour ça Activité, vous devez remplacer cette méthode pour obtenir un ArrayList de LatLng objets qui sont ensuite utilisés pour générer le HeatmapTileProvider objet.

Le fournisseur dispose de diverses méthodes pour modifier l’apparence de votre carte thermique, telles que les dégradés de couleurs, le rayon de chaque point et le poids de chaque point. Une fois votre fournisseur créé, vous pouvez créer la carte thermique. TileOverlay et l'applique à votre carte.

@Override protected void initMapSettings () ArrayList locations = generateLocations (); mProvider = new HeatmapTileProvider.Builder (). data (locations) .build (); mProvider.setRadius (HeatmapTileProvider.DEFAULT_RADIUS); mGoogleMap.addTileOverlay (nouveau TileOverlayOptions (). tileProvider (mProvider)); 

Dans la mise en œuvre ci-dessus de initMapSettingsgénérer des localisations est une méthode d'assistance qui génère 1000 LatLng positions autour de l'emplacement de la carte centrale.

Liste de tableaux privée generateLocations () ArrayList locations = new ArrayList(); double lat; double lng; Générateur aléatoire = new Random (); pour (int i = 0; i < 1000; i++ )  lat = generator.nextDouble() / 3; lng = generator.nextDouble() / 3; if( generator.nextBoolean() )  lat = -lat;  if( generator.nextBoolean() )  lng = -lng;  locations.add(new LatLng(mCenterLocation.latitude + lat, mCenterLocation.longitude + lng));  return locations; 

Une fois que vous avez fini d'implémenter initMapSettings et générer des localisations, vous pouvez exécuter votre application et cliquer sur la section de la carte thermique pour la voir en action.

4. Marqueurs de cluster

Lorsqu'une carte contient de nombreux points de données dans une petite zone, elle peut être encombrée très rapidement lorsque l'utilisateur effectue un zoom arrière. Non seulement cela, mais avoir trop de marqueurs affichés à la fois peut ralentir considérablement certains appareils.

Pour vous aider à dissiper une partie de la frustration causée par ces problèmes, vous pouvez utiliser la bibliothèque Google Maps Utils pour animer vos marqueurs en clusters. La première chose à faire est de créer un nouvel objet de modèle qui implémente la ClusterItem interface. Ce modèle doit implémenter les getPosition méthode de la ClusterItem interface afin de retourner un valide LatLng objet.

La classe publique ClusterMarkerLocation implémente ClusterItem private LatLng position; public ClusterMarkerLocation (LatLng latLng) position = latLng;  @Override public LatLng getPosition () return position;  public void setPosition (position LatLng) this.position = position; 

Avec le modèle créé, vous pouvez créer un nouveau Activité appelé ClusterMarkerActivity et l'ajouter à votre manifeste. Lorsque vous initialisez votre carte, vous devez créer un Gestionnaire de cluster, associez-le à votre Google Map, et ajoutez votre LatLng positions comme ClusterMarkerLocations au Gestionnaire de cluster pour que l'utilitaire sache quoi grouper. Jetez un coup d’œil à la mise en œuvre de initMarkers pour mieux comprendre comment cela fonctionne.

privé void initMarkers () ClusterManager clusterManager = new ClusterManager(this, mGoogleMap); mGoogleMap.setOnCameraChangeListener (clusterManager); double lat; double lng; Générateur aléatoire = new Random (); pour (int i = 0; i < 1000; i++ )  lat = generator.nextDouble() / 3; lng = generator.nextDouble() / 3; if( generator.nextBoolean() )  lat = -lat;  if( generator.nextBoolean() )  lng = -lng;  clusterManager.addItem( new ClusterMarkerLocation( new LatLng( mCenterLocation.latitude + lat, mCenterLocation.longitude + lng ) ) );  

Dans cet exemple, nous créons 1 000 points aléatoires à afficher et nous les ajoutons à la carte. La bibliothèque Google Maps Utils gère tout le reste pour nous..

5. Autres utilitaires

Outre les deux derniers éléments, la bibliothèque Google Maps Utils regorge de petits utilitaires utiles. Si vous avez beaucoup de points différents qui constituent un itinéraire, vous pouvez les encoder en tant que polyligne puis ajouter cette polyligne à votre carte en utilisant PolyUtil. Cela affichera un chemin entre chacun des points de la carte..

Classe publique PolylineActivity étend BaseMapActivity privé statique final String polyline = "gsqqFxxu_SyRlTys @ npAkhAzY MsVc'AuHwbB Lil @ [goCqGe | BnUa'A ~ MkbG? ek @ hRq h_k @Override protected void initMapSettings () Liste decodedPath = PolyUtil.decode (polyligne); mGoogleMap.addPolyline (nouvelle PolylineOptions (). addAll (decodedPath)); 

En plus de PolyUtil, Google a ajouté Sphérique jusqu'à qui peut être utilisé pour mesurer des distances ou déterminer la géométrie sur la surface d’une sphère. Si vous voulez trouver la distance entre deux points sur la carte, vous pouvez appeler SphericalUtil.computeDistanceBetween (LatLng position1, LatLng position2) retourner un double de la distance en mètres. Si vous voulez trouver le titre entre deux points, vous pouvez appeler SphericalUtil.computeHeading (LatLng point1, LatLng point2).


A cet égard, une autre méthode d’utilité dans le SpericalUtil class vous permet de trouver un point à un certain cap et à une certaine distance. Je recommande de parcourir la documentation pour en savoir plus sur le SpericalUtil classe.

Conclusion

Dans ce didacticiel, vous venez de parcourir la surface de la bibliothèque Google Maps Utils et de tout ce qu’elle a à offrir. Parmi les autres fonctionnalités qu'il peut ajouter à votre application, citons l'ajout de superpositions pour les données KML, la création de marqueurs personnalisés et des méthodes d'assistance pour travailler avec GeoJSON..

Heureusement, Google a ouvert la totalité de la bibliothèque en code source afin que vous puissiez trouver le code source et le code de démonstration de la bibliothèque sur GitHub. Après avoir parcouru les trois dernières parties de cette série, vous devriez maintenant être suffisamment à l'aise avec Google Maps pour les ajouter à vos propres applications afin d'enrichir l'expérience utilisateur et de créer de superbes applications..