Android – MapView – Bien centrer la carte sur un ensemble de points

Voilà un petit tutorial qui présente comment bien centrer un carte (MapView) sur un ensemble de points (GeoPoint). Le guide proposé par Google (ici) est très bien mais ne donne pas de précision sur ce besoin. J’ai du farfouiller un peu sur le net pour trouver une méthode qui me semble correcte et générique. Voici comment j’ai procédé 🙂

Pour faire cet exemple je me suis donc basé sur le tutorial HelloMapView de Google. Par défaut on se retrouve avec une activité qui nous affiche une carte mais dont les points que l’on a rajouté ne sont pas centrés sur la carte par défaut. J’ai voulu afficher des villes de France. J’ai donc écrit le code suivant :

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		mapView = (MapView) findViewById(R.id.mapview);
		mapView.setBuiltInZoomControls(true);

		mapOverlays = mapView.getOverlays();
		drawable = this.getResources().getDrawable(R.drawable.marker);
		itemizedOverlay = new HelloItemizedOverlay(drawable);

		addOverlayItem(48391940, -4485712, "Brest");
		addOverlayItem(51025849, 2364349, "Dunkerque");
		addOverlayItem(48578424, 7749939, "Strasbourg");
		addOverlayItem(43699651, 7227173, "Nice");
		addOverlayItem(42698586, 2898559, "Perpignan");
		addOverlayItem(43516689, -1506958, "Bayonne");

		mapOverlays.add(itemizedOverlay);
	}

	private void addOverlayItem(int latitude, int longitude, String label) {
		OverlayItem overlayitem = new OverlayItem(new GeoPoint(latitude,
				longitude), label, "");
		itemizedOverlay.addOverlay(overlayitem);
	}

Et je me suis retrouvé avec ceci :

C’est pas mal mais ce n’était pas ce que je voulais. D’une part la carte n’est pas centrée sur la France (par défaut le MapView affiche les Etats-Unis) et le zoom n’est pas correct. Pour résoudre ces manques voilà comment j’ai procédé.

Premièrement j’ai modifié la méthode getCenter de mon HelloItemizedOverlay. En effet, Par défaut cette méthode retourne les coordonnées du premier point de l’objet ce qui ne sert pas à grand chose à mon humble avis :P. Voici comment faire pour qu’elle retourne le centre de tous les points présents dans cet objet :

	@Override
	public GeoPoint getCenter() {

		if (mOverlays.size() == 0) {
			return new GeoPoint(0, 0);
		}

		int minLatitude = Integer.MAX_VALUE;
		int maxLatitude = Integer.MIN_VALUE;
		int minLongitude = Integer.MAX_VALUE;
		int maxLongitude = Integer.MIN_VALUE;

		for (OverlayItem overlay : mOverlays) {
			int lat = overlay.getPoint().getLatitudeE6();
			int lon = overlay.getPoint().getLongitudeE6();
			maxLatitude = Math.max(lat, maxLatitude);
			maxLongitude = Math.max(lon, maxLongitude);
			minLatitude = Math.min(lat, minLatitude);
			minLongitude = Math.min(lon, minLongitude);
		}

		return new GeoPoint((maxLatitude + minLatitude) / 2,
				(maxLongitude + minLongitude) / 2);
	}

Ensuite, pour obtenir le bon zoom, là Android nous propose déjà une méthode pour la calculer automatiquement. C’est la méthode zoomToSpan qui calcule le bon zoom en fonction d’un couverture définie que l’objet ItemizedOverlay est capable de nous fournir automatiquement avec les méthodes getLatSpanE6 et getLonSpanE6. Ainsi dans notre activité principale il suffit de rajouter ces quelques lignes de code (dans la méthode onCreate ou ailleurs) :

		MapController controller = mapView.getController();
		controller.zoomToSpan(itemizedOverlay.getLatSpanE6(), itemizedOverlay.getLonSpanE6());
		// use the newly defined getCenter method
		controller.setCenter(itemizedOverlay.getCenter());

Et le tour est joué. Voilà ce qu’on obtient si l’on relance l’application :

Publicités

Étiquettes : , , , , , , , , , , , , ,

2 responses to “Android – MapView – Bien centrer la carte sur un ensemble de points”

  1. Mohamed says :

    Bonjour,
    veuillez m’indiquer comment que mon projet connaîtra le package com.google.maps.* parceque il me donne une erreur sur la ligne d’importation de ce package.

    merci d’avance

    • Benoît says :

      Bonjour,
      Lors de la création de ton projet, lorsque tu choisis l’API utilisée pour compiler ton application, il faut bien sélectionner « Google API (Google inc.) (API …) ». Je pense que c’est pour ça que ces packages ne sont pas reconnus dans ton projet.
      En allant dans les propriétés du projet il est aussi possible de le modifier (Clic droit sur le projet => propriétés => Android => Project Build Target).
      Si Google API n’apparaît pas, c’est que tu ne dois pas l’avoir téléchargé via le SDK Manager.

      J’espère que cette réponse pourra t’aider.

      Benoît

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :