web-dev-qa-db-fra.com

Ajout de plusieurs marqueurs dans Google Maps API v2 Android

Je veux ajouter plusieurs marqueurs sur ma carte, mais je ne connais pas le chemin.

Pour le moment, je l’utilise, et cela fonctionne correctement:

Marker m1 = googleMap.addMarker(new MarkerOptions()
                .position(new LatLng(38.609556, -1.139637))
                .anchor(0.5f, 0.5f)
                .title("Title1")
                .snippet("Snippet1")
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.logo1)));


Marker m2 = googleMap.addMarker(new MarkerOptions()
                .position(new LatLng(40.4272414,-3.7020037))
                .anchor(0.5f, 0.5f)
                .title("Title2")
                .snippet("Snippet2")
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.logo2)));


Marker m3 = googleMap.addMarker(new MarkerOptions()
                .position(new LatLng(43.2568193,-2.9225534))
                .anchor(0.5f, 0.5f)
                .title("Title3")
                .snippet("Snippet3")
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.logo3)));

Mais le problème vient lorsque je veux ajouter 300 marqueurs dans ma carte. Et le faire un par un est très ennuyant.

Est-il possible de lire les marqueurs d'un tableau ou quoi que ce soit?

Autre question: est-ce que je peux lire les marqueurs à partir d'un fichier externe pour pouvoir ajouter ou mettre à jour des marqueurs sans toucher au code de l'application?

Merci.

14
Tárraga
ArrayList<MarkerData> markersArray = new ArrayList<MarkerData>();

for(int i = 0 ; i < markersArray.size() ; i++) {

    createMarker(markersArray.get(i).getLatitude(), markersArray.get(i).getLongitude(), markersArray.get(i).getTitle(), markersArray.get(i).getSnippet(), markersArray.get(i).getIconResID());
}


protected Marker createMarker(double latitude, double longitude, String title, String snippet, int iconResID) {

    return googleMap.addMarker(new MarkerOptions()
            .position(new LatLng(latitude, longitude))
            .anchor(0.5f, 0.5f)
            .title(title)
            .snippet(snippet)
            .icon(BitmapDescriptorFactory.fromResource(iconResID)));
}
43
nbaroz

Utilisez MarkerOptions

private GoogleMap googleMap;
private MarkerOptions options = new MarkerOptions();
private ArrayList<LatLng> latlngs = new ArrayList<>();

Vous pouvez ajouter à la liste des latlngs par,

 latlngs.add(new LatLng(12.334343, 33.43434)); //some latitude and logitude value

Et ensuite, utilisez la boucle for pour les définir sur la carte.

 for (LatLng point : latlngs) {
     options.position(point);
     options.title("someTitle");
     options.snippet("someDesc");
     googleMap.addMarker(options);
 }
15
siriscac

Donc, si vous obtenez les coordonnées d'un fichier txt, vous pouvez les lire comme ceci:

BufferedReader reader = null;
try {
    reader = new BufferedReader(
        new InputStreamReader(getAssets().open("filename.txt"), "UTF-8")); 

    // do reading, usually loop until end of file reading 
    String mLine = reader.readLine();
    while (mLine != null) {
       //process line
       ...
       mLine = reader.readLine(); 
    }
} catch (IOException e) {
    //log the exception
} finally {
    if (reader != null) {
         try {
             reader.close();
         } catch (IOException e) {
             //log the exception
         }
    }
}

si votre fichier txt ressemble à ceci

23.45 43.23
23.41 43.65
.
.
.

Que vous puissiez modifier chaîne en objets LatLng:

String[] coord = mLine.split("\\r?\\n");
ArrayList<LatLng> coordinates = new ArrayList<LatLng>;

for(int i = 0; i <  coord.lenght(); ++i){
    String[] latlng =   coord.split(" ");
    coordinates.add(new LatLng(latlng[0], latlng[1]);
}

Et que:

for(LatLng cor : coordinates){
    map.addMarker(new MarkerOptions()
       .position(cor.getLat(), cor.getLng())
       .title("Hello"));
}
1
Igor Bykov

Cela dépend de la source de vos données. Le meilleur moyen est de faire en sorte que votre objet personnalisé stocke des données. Par exemple:

public class MyMarkerData {
        LatLng latLng;
        String title;
        Bitmap bitmap;

        public LatLng getLatLng() {
            return latLng;
        }

        public void setLatLng(LatLng latLng) {
            this.latLng = latLng;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public Bitmap getBitmap() {
            return bitmap;
        }

        public void setBitmap(Bitmap bitmap) {
            this.bitmap = bitmap;
        }
    }

Ensuite, vous pouvez écrire une méthode pour convertir les données de votre fichier externe en liste de vos objets de données personnalisés (mais je pense que cela n’entre pas dans le cadre de cette question).

Ensuite, transmettez simplement ces données à votre méthode de dessin de marqueur et parcourez-les en boucle. C'est une bonne pratique que de penser à sauvegarder vos marqueurs dans une liste ou une carte (objet, marqueur) aussi, vous pourrez alors y accéder facilement.

Quelque chose comme ca:

    HashMap<Marker, MyMarkerData> mDataMap = new HashMap<>();

        public void drawMarkers(ArrayList<MyMarkerData> data) {
                Marker m;
                for (MyMarkerData object: data) {
                    m = googleMap.addMarker(new MarkerOptions()
                            .position(object.getLatLng())
                            .title(object.getTitle())
                            .icon(BitmapDescriptorFactory.fromBitmap(object.getBitmap()));

                    mDataMap.put(m, object);
                }
            }
0
Georgiy Shur

Oui, vous pouvez utiliser la variable ArrayList pour stocker tous les marqueurs de cette liste, puis utiliser la boucle for pour ajouter des marqueurs sur la carte.

Par exemple: 

googleMap.clear();
Now get all the marker in the Markers
//seachModelsList is the list of all markers
Marker[] allMarkers = new Marker[seachModelsList.size()];

for (int i = 0; i < seachModelsList.size(); i++)
{
    LatLng latLng = new LatLng(seachModelsList.get(i).getCoordinates()[1], seachModelsList.get(i)
            .getCoordinates()[0]);
    if (googleMap != null) {
        googleMap.setOnMarkerClickListener(this);
        allMarkers[i] = googleMap.addMarker(new MarkerOptions().position(latLng);
        googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 17.0f));
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 17));

    }
}
0
A-Droid Tech