IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

[Google Code] Récupérer lat/long depuis un Zoom GoogleMap


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Par défaut [Google Code] Récupérer lat/long depuis un Zoom GoogleMap
    EDIT : Vu que j'ai rencontré plusieurs problème pour la raison du poste (récupérer la latitude et la longitude avec la map Google), je met les différents points qui ont posé problème et leur solution. A la fin de ce message le code complet de mes deux classes utilisé pour l'affichage de la carte Google et pour dessiner par dessus.

    Problème de base :
    - Récupérer les informations de lat/long dans une 3ème classe qui lancerais via un bouton la classe Map (ici LocActivity)

    Ce qui a été fait :
    - Afficher la map
    - Créer et Afficher un marqueur
    - Effacer le marqueur présent lorsqu'on pose un nouveau marqueur
    - Effacer le marqueur présent
    - Afficher la position du marqueur dans une AlertDialog ou un Toast (affichage simple)

    Voilà ça fait pas grand chose. Pour réaliser ceci j'ai utilisé
    - http://developer.android.com/resourc...o-mapview.html
    - Recherche Google
    - La précieuse aide de dawadam

    J'espère que ça pourra aider qqn. Quand j'aurais fini mon "projet" je mettrais comment j'ai récup les informations lat/long. Mais pour ça faut que l'autre partie de mon projet soit fini et cela ne dépend pas de moi

    Code actuel

    Classe Map
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    import java.util.List;
     
    import com.google.android.maps.*;
     
    import android.graphics.drawable.Drawable;
    import android.location.Location;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.Window;
     
    public class LocActivity extends MapActivity {
     
      // Attribut pour l'affichage de la carte
      private MapView            mapView;        // Vue qui affiche la carte
      private MapController      mapController;  // Controlleur pour la carte
      private GeoPoint           point;          // Point a afficher sur la carte
     
      // Attribut pour afficher/utiliser le marqueur
      private List<Overlay>      mapOverlays;    // Couche sur la carte
      private MapItemizedOverlay itemizedOverlay; // Affiche le dessin
      private OverlayItem        overlayItem;    // Dessin sur la couche
      private GeoPoint           newPoint;       // Nouvelle position Lat/Long
      private Drawable           drawable;       // Dessin
     
      // Attribut pour vérifier s il y a un marqueur sur la carte
      private boolean            id = false;     // true:MarqueurSurCarte
                                                  // false:PasDeMarqueur
     
      // Attribut pour récupérer les information de la position marquee
      private Location           location;       // Recuperation position du
                                                  // marqueur
     
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
     
        mapView = (MapView) findViewById(R.id.map_view);
        mapView.setBuiltInZoomControls(true);
     
        mapView.setClickable(true);
        mapController = mapView.getController();
        double lat = 46.806219D;
        double lon = 7.1662690D;
        point = new GeoPoint((int) (lat * 1E6), (int) (lon * 1E6));
        mapController.animateTo(point);
        mapController.setZoom(17);
     
        mapView.setSatellite(true);
        mapView.invalidate();
     
        this.init();
      }
     
      @Override
      protected boolean isRouteDisplayed() {
        return false;
      }
     
      // Initisalisation de la couche et du marqueur
      private void init() {
        drawable = this.getResources().getDrawable(R.drawable.pbleu); // Icone
        mapOverlays = mapView.getOverlays(); // Ajoute une couche à la vue
        itemizedOverlay = new MapItemizedOverlay(drawable, this); // Créer un
                                                                  // nouveau dessin
      }
     
      /** Creation du menu */
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0, 1000, 0, "Poser Marqueur").setIcon(
            android.R.drawable.ic_menu_manage);
        menu.add(0, 1001, 0, "Supprimer Marqueur").setIcon(
            android.R.drawable.ic_menu_view);
        return super.onCreateOptionsMenu(menu);
      }
     
      /** Handler sur le menu */
      public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
          case 1000:
            mapOverlays.add(itemizedOverlay);
            newPoint = mapView.getMapCenter();
            overlayItem = new OverlayItem(newPoint, "Position", "Lat: "
                + newPoint.getLatitudeE6() + " Long: " + newPoint.getLongitudeE6());
     
            if (id == true) {
              itemizedOverlay.supOverlay();
              itemizedOverlay.addOverlay(overlayItem);
            } else if (id == false) {
              itemizedOverlay.addOverlay(overlayItem);
              id = true;
            }
     
            // location.setLatitude(newPoint.getLatitudeE6());
            // location.setLongitude(newPoint.getLongitudeE6());
            break;
          case 1001:
            itemizedOverlay.supOverlay();
            break;
        }
        return super.onOptionsItemSelected(item);
      }
    }
    Classe Overlay
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    import java.util.ArrayList;
     
    import android.app.AlertDialog;
    import android.content.Context;
    import android.graphics.drawable.Drawable;
     
    import com.google.android.maps.OverlayItem;
     
    public class MapItemizedOverlay extends com.google.android.maps.ItemizedOverlay {
      // Liste des marqueurs
      private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
      private Context                mContext;
      private AlertDialog.Builder    dialog;
     
      public MapItemizedOverlay(Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));
      }
     
      public MapItemizedOverlay(Drawable defaultMarker, Context context) {
        super(boundCenterBottom(defaultMarker));
        mContext = context;
        dialog = new AlertDialog.Builder(mContext);
      }
     
      @Override
      protected OverlayItem createItem(int i) {
        return mOverlays.get(i);
      }
     
      @Override
      public int size() {
        return mOverlays.size();
      }
     
      @Override
      // Affiche une fenêtre avec les renseignements de la position
      protected boolean onTap(int index) {
        OverlayItem item = mOverlays.get(index);
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.show();
     
        // Affichage simple (fonctionnel)
        // Toast.makeText(mContext, item.getSnippet(), Toast.LENGTH_SHORT).show();
        return true;
      }
     
     
      // Ajoute un marqueur à la couche
      public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
      }
     
      // Efface le marqueur de la couche utilisee
      public void supOverlay() {
        mOverlays.clear();
      }
     
    }

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Par défaut
    Citation Envoyé par PaloPalo Voir le message
    Bonjour,

    Via des tutoriels dans des livres sur Android, j'ai réussis à intégrer une map Google et la lancer sur mon HTC. Je peux me déplacer et zoomer sans aucun soucis.

    Pour la suite j'aimerais pouvoir zoomer sur un point (un bâtiment par exemple) et si je laisse le doigt longtemps sur cet endroit (long clic), il me récupère la latitude et la longitude de ce point afin que je puisse la réutiliser dans mon appli.

    J'ai un peu de peine à trouver des informations à ce sujet. Celà me permetterais de faire des comparaison avec le positionnement "Network/GPS" et la position réel stocké sur la map.

    J'espère que quelqu'un va pouvoir me renseigner.

    Palopalo
    Je ne vais pas pouvoir te renseigner directement, néanmoins, je pense que la MapView ne fait que se servir de l'API Google Map et on doit sans doute pouvoir récupérer les infos de lon/lat depuis celle-ci...

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Par défaut
    Pour gérer les clics de souris, il faut utiliser un "Overlay" en redéfinissant sa méthode "onTap". (créer une nouvelle class étendant Overlay)

    Pour l'ajouter à la carte, il faut récupérer la liste des Overlays et ajouter le sien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    List<Overlay> overlays = mapView.getOverleys();
    MyOverlay myOver = new MyOverlay();
    overlays.add(MyOver);
    mapView.postInvalidate(); // met à jour l'affichage
    Pour convertir les coordonnées du point écran en coordonnées géographiques, il faut utiliser la class Projection.

    source livre : Développement d'applications professionnelles avec Android 2

  4. #4
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Par défaut
    Salut, merci pour ce renseignement.

    De mon côté j'ai fait des test avec ma classe MapItemizedOverlay qui étend com.google.android.maps.ItemizedOverlay en utilisant ce tuto : http://developer.android.com/resourc...o-mapview.html

    classe Overlay
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    import java.util.ArrayList;
     
    import android.app.AlertDialog;
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.drawable.Drawable;
     
    import com.google.android.maps.MapView;
    import com.google.android.maps.OverlayItem;
     
    public class MapItemizedOverlay extends com.google.android.maps.ItemizedOverlay {
      // Liste des marqueurs
      private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
      private Context                mContext;
     
      public MapItemizedOverlay(Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));
      }
     
      public MapItemizedOverlay(Drawable defaultMarker, Context context) {
        super(boundCenterBottom(defaultMarker));
        mContext = context;
      }
     
      @Override
      protected OverlayItem createItem(int i) {
        return (OverlayItem) mOverlays.get(i);
      }
     
      @Override
      public int size() {
        return mOverlays.size();
      }
     
      @Override
      protected boolean onTap(int index) {
        OverlayItem item = mOverlays.get(index);
        AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.show();
        return true;
      }
     
      public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
      }
    }
    classe Map
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    import java.util.List;
     
    import com.google.android.maps.*;
     
    import android.graphics.drawable.Drawable;
    import android.location.Location;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.Window;
     
    public class LocActivity extends MapActivity {
     
      private MapView            mapView;        // Vue qui affiche la carte
      private MapController      mapController;  // Controller pour la carte
      private GeoPoint           point;          // Point à afficher sur la carte
     
      private List<Overlay>      mapOverlays;    //
      private MapItemizedOverlay itemizedoverlay; //
     
      private Location           location;       // Attribut qui récupère la
                                                  // position pointée
     
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
     
        mapView = (MapView) findViewById(R.id.map_view);
        mapView.setBuiltInZoomControls(true);
     
        mapView.setClickable(true);
        mapController = mapView.getController();
        double lat = 46.806219D;
        double lon = 7.1662690D;
        point = new GeoPoint((int) (lat * 1E6), (int) (lon * 1E6));
        mapController.animateTo(point);
        mapController.setZoom(17);
     
        mapView.setSatellite(true);
        mapView.invalidate();
      }
     
      @Override
      protected boolean isRouteDisplayed() {
        return false;
      }
     
      /** Creation du menu */
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0, 1000, 0, "Poser Marqueur").setIcon(
            android.R.drawable.ic_menu_manage);
        menu.add(0, 1001, 0, "Supprimer Marqueur").setIcon(
            android.R.drawable.ic_menu_view);
        return super.onCreateOptionsMenu(menu);
      }
     
      /** Handler sur le menu */
      public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
          case 1000:
            GeoPoint newPoint = mapView.getMapCenter();
     
            mapOverlays = mapView.getOverlays();
            Drawable drawable = this.getResources().getDrawable(R.drawable.pbleu);
            itemizedoverlay = new MapItemizedOverlay(drawable);
            OverlayItem overlayitem = new OverlayItem(newPoint, "Hello",
                "JeSuisUnTest");
     
            location.setLatitude(newPoint.getLatitudeE6());
            location.setLongitude(newPoint.getLongitudeE6());
     
            itemizedoverlay.addOverlay(overlayitem);
            mapOverlays.add(itemizedoverlay);
            break;
          case 1001:
            break;
        }
        return super.onOptionsItemSelected(item);
     
      }
    }
    Dans cette 2ème partie, j'ai créé un menu avec 2 boutons (notez que le 2ème est juste décoratif ). Quand je clique sur ce bouton je place un marqueur au centre de la map et en même temps stock les données du centre de la map dans une variable "location" grâce à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    location.setLatitude(newPoint.getLatitudeE6());
    location.setLongitude(newPoint.getLongitudeE6());
    Je vais faire la suite des test cet aprèm pour récupérer ma location dans mon activité qui lance ma carte Google.


    Par contre d'autre problèmes.
    - J'aimerais effacer le marqueur déjà posé quand j'en pose un nouveau. Mais la je bloque sur la manière d'y arriver
    - Si je clique sur le marqueur, il devrait m'afficher "Hello, JeSuisUnTest", mais au lieu de ça il ferme le programme avec un message d'erreur.

    J'ai lu et relu la partie du tutoriel à ce sujet (link plus haut), mais impossible de trouver l'erreur. Si vous avez une info pour ceci.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Par défaut
    Déjà pour le marqueur, au lieu d'en créer un nouveau à chaque foi, tu peux sans doute réutiliser le même à chaque foi, en gardant l'instance.
    Sinon, je suis sur que MapItemizedOverlay propose une méthode pour supprimer un item, là encore il faudra l'instance en paramètre.
    Oula, je viens de voir que tu ajoutes un Overlay à chaque fois ! Il faut en créer un seul et travailler avec lui, un Overlay est une couche de carte en fait.

    Pour l'erreur, je ne saurai trop te conseiller d'afficher la console Android qui va te donner de parfois curieuses, mais néanmoins précieuses informations.
    La console ADB, il existe des tutos pour savoir comment l'afficher.

    Par ailleurs, si je peux me permettre, il vaut mieux prendre le temps de bien comprendre que de créer sans vraiment savoir ce que l'on fait !

  6. #6
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 40
    Par défaut
    Oula, je viens de voir que tu ajoutes un Overlay à chaque fois ! Il faut en créer un seul et travailler avec lui, un Overlay est une couche de carte en fait.
    Je ne suis pas sûr de bien saisir de quel ligne il s'agit. C'est vrai que actuellement une partie de ce que je fais n'est pas totalement compris. C'est aussi pour ça que malgré avoir suivit certains tuto je ne trouve pas les fautes que j'ai fait.


    Pour l'erreur, je ne saurai trop te conseiller d'afficher la console Android qui va te donner de parfois curieuses, mais néanmoins précieuses informations.
    La console ADB, il existe des tutos pour savoir comment l'afficher.
    Pour la fenêtre debug spécial c'est bon. Windows --> Open Perspective --> Others --> DDMS Perspective.
    J'ai plus qu'à trouver pourquoi rien ne s'affiche...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Google Maps] Récupérer lat et long dans PHP
    Par karync dans le forum APIs Google
    Réponses: 2
    Dernier message: 28/09/2011, 10h18
  2. [MySQL] récupérer plusieurs tuples depuis un array
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 29/12/2005, 18h17
  3. Conversion Lat/Long vers UTM
    Par efficks dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 12/12/2005, 17h13
  4. Récupérer le MCD depuis la base
    Par cladsam dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/11/2005, 16h01
  5. [Eclipse] [VSS plugin] Récupérer un projet depuis le server?
    Par Bobsinglar dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 23/05/2005, 17h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo