21

J'utilise Google Map API v2 dans mon application pour montrer Maps.Comment afficher plusieurs marqueurs sur MapFragment dans Google Map API v2?

J'ai suivi toutes les étapes, à suivre pour activer Google Map dans mon application.

public class PinLocationOnMapView extends FragmentActivity { 

    private double mLatitude = 0.0, mLongitude = 0.0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     SupportMapFragment fragment = SupportMapFragment.newInstance(); 
     getSupportFragmentManager().beginTransaction() 
       .add(android.R.id.content, fragment).commit(); 
    } 
} 

Si j'utiliser ce code, il me montre la carte, mais si je donne mes valeurs de latitude/longitude, tuiles de carte ne se charge pas, et je vois des tuiles blanches seulement.

Voici le code écrit en onCreate() de la classe ci-dessus:

if (getIntent().getExtras() != null) { 
      final Bundle bundle = getIntent().getBundleExtra("LOCATION"); 
      mLatitude = bundle.getDouble("LATITUDE"); 
      mLongitude = bundle.getDouble("LONGITUDE"); 
     } else { 
      finish(); 
     } 

     GoogleMapOptions options = new GoogleMapOptions(); 
     LatLng latLng = new LatLng(mLatitude, mLongitude); 
     CameraPosition cameraPosition;// = new CameraPosition(latLng, 0, 0, 0); 
     cameraPosition = CameraPosition.fromLatLngZoom(latLng, (float) 14.0); 

     options.mapType(GoogleMap.MAP_TYPE_SATELLITE).camera(cameraPosition) 
       .zoomControlsEnabled(true).zoomGesturesEnabled(true); 

     SupportMapFragment fragment = SupportMapFragment.newInstance(options); 
     getSupportFragmentManager().beginTransaction() 
       .add(android.R.id.content, fragment).commit(); 

Aussi, j'ai une liste de valeurs lat/long. Je veux leur montrer sur MapFragment, comment montrer plusieurs marqueurs sur MapFragment?

J'ai essayé avec MapView et ItemizedOverlay, mais cela n'a pas fonctionné pour moi. Je crois que j'ai correctement créé la clé SHA1 pour obtenir la clé API, parce que si c'était faux, je ne pouvais pas voir la carte en utilisant MapFragment, mais je peux voir que si je ne passe pas la valeur lat/log.

Répondre

33

Je fais comme ça pour montrer les positions de voiture sur la carte avec des marqueurs de différentes couleurs:

private void addMarkersToMap() { 
    mMap.clear(); 
    for (int i = 0; i < Cars.size(); i++) {   
      LatLng ll = new LatLng(Cars.get(i).getPos().getLat(), Cars.get(i).getPos().getLon()); 
      BitmapDescriptor bitmapMarker; 
      switch (Cars.get(i).getState()) { 
      case 0: 
       bitmapMarker = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED); 
       Log.i(TAG, "RED"); 
       break; 
      case 1: 
       bitmapMarker = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN); 
       Log.i(TAG, "GREEN"); 
       break; 
      case 2: 
       bitmapMarker = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE); 
       Log.i(TAG, "ORANGE"); 
       break; 
      default: 
       bitmapMarker = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED); 
       Log.i(TAG, "DEFAULT"); 
       break; 
      }    
      mMarkers.add(mMap.addMarker(new MarkerOptions().position(ll).title(Cars.get(i).getName()) 
        .snippet(getStateString(Cars.get(i).getState())).icon(bitmapMarker))); 

      Log.i(TAG,"Car number "+i+" was added " +mMarkers.get(mMarkers.size()-1).getId()); 
     } 
    } 

} 

Cars est un ArrayList d'objets personnalisés et mMarkers est un ArrayList de marqueurs.

Note: Vous pouvez montrer la carte dans le fragment comme celui-ci:

private GoogleMap mMap; 
.... 

private void setUpMapIfNeeded() { 
    // Do a null check to confirm that we have not already instantiated the 
    // map. 
    if (mMap == null) { 
     // Try to obtain the map from the SupportMapFragment. 
     mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 
     // Check if we were successful in obtaining the map. 
     if (mMap != null) { 
      setUpMap(); 
     } 
    } 
} 




private void setUpMap() { 
    // Hide the zoom controls as the button panel will cover it. 
    mMap.getUiSettings().setZoomControlsEnabled(false); 

    // Add lots of markers to the map. 
    addMarkersToMap(); 

    // Setting an info window adapter allows us to change the both the 
    // contents and look of the 
    // info window. 
    mMap.setInfoWindowAdapter(new CustomInfoWindowAdapter()); 

    // Set listeners for marker events. See the bottom of this class for 
    // their behavior. 
    mMap.setOnMarkerClickListener(this); 
    mMap.setOnInfoWindowClickListener(this); 
    mMap.setOnMarkerDragListener(this); 

    // Pan to see all markers in view. 
    // Cannot zoom to bounds until the map has a size. 
    final View mapView = getSupportFragmentManager().findFragmentById(R.id.map).getView(); 
    if (mapView.getViewTreeObserver().isAlive()) { 
     mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      @SuppressLint("NewApi") 
      // We check which build version we are using. 
      @Override 
      public void onGlobalLayout() { 
       LatLngBounds.Builder bld = new LatLngBounds.Builder(); 
    for (int i = 0; i < mAvailableCars.size(); i++) {   
      LatLng ll = new LatLng(Cars.get(i).getPos().getLat(), Cars.get(i).getPos().getLon()); 
      bld.include(ll);    
    } 
    LatLngBounds bounds = bld.build();   
    mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 70)); 
       mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 

      } 
     }); 
    } 
} 

Et il suffit d'appeler setUpMapIfNeeded() dans onCreate()

+0

Merci slezadav! Je vais essayer cela et vous le faire savoir. :) – Shrikant

+0

comment montrer ceci mMarkers sur MapFragment? – Shrikant

+1

Modifié ma réponse, il montre donc comment ajouter une carte entière avec des marqueurs à MapFragment. La méthode addMarkersToMap() est dans la méthode setUpMap(). – slezadav

0

Essayez ce code qui appelle à un fichier xml dans votre site web répertoire racine -

Une façon d'ajouter des marqueurs consiste à charger un fichier xml qui réside dans le répertoire racine (voir le code ci-dessous), qui contient le marqueur html.

Le code ici définit l'espace de carte et une colonne de barre latérale pour contenir la carte et les liens pour les marqueurs. Notez qu'à la fois une balise div avec un id et un ID td de la barre latérale pour les éléments html et map.

Vous pouvez configurer les marqueurs, mais notez la nécessité d'utiliser des caractères spéciaux qui doivent être correctement étiquetés; par exemple, l'esperluette (&) devrait être codée "&" + "amp" + ";" (sans citations). La même chose s'applique aux caractères supérieurs et inférieurs aux caractères, et ainsi de suite. C'est une corvée si vous avez plusieurs marqueurs, mais une fois en place, il est facile de changer car il ne nécessite aucun assemblage ou codage dans l'application. Dans le script qui lit le fichier, l'utilisation de la balise CDATA devrait techniquement rendre superflue l'utilisation de caractères spéciaux, mais pour Gmaps API v2, je les utilise quand même. Pour mon exemple, le nom du fichier xml est example3.xml.

Vous pouvez formater le code XML comme ceci:

<Markers> 
<marker lat="47.881389" lng="-122.242222" 
html='&lt;div style="background-color:#FFFF88;font-family:Tahoma; font-size:12px;padding:6px; border:solid 1px black;"&gt;&lt;b&gt;SiteLines Park &#38; Playground Products&lt;/b&gt; &lt;br&gt;626 128th Street SW&lt;br&gt;Suite 104-A&lt;br&gt;Everett&#8218;&#160;WA 98204&lt;br&gt;Phone&#58; &#40;425&#41; 355-5655&lt;br&gt;&lt;b&gt;Toll&#160;Free&#58;&#160;&#40;800&#41;&#160;541-0869&lt;/b&gt;&lt;br&gt;Fax&#58;&#160;&#40;425&#41;&#160;347-3056&lt;br&gt;Email&#58;&#160;&lt;a href="mailto:[email protected]" target="blank"&gt;emailus&#64;sitelines.com&lt;/a&gt;&lt;br&gt;Web&#58;&#160;&lt;a href="http://www.sitelines.com" target="blank"&gt;www.sitelines.com&lt;/a&gt; &lt;/div&gt;'label="SiteLines Park &#38; Playground Products" /> 
</Markers> 

And for the html and script: 
<form style="background-color: #ffffff;" id="form1" runat="server"> 
<div style="text-align: center;"> 
<table style="border: 1px currentColor; vertical-align: middle;"> 
<tbody> 
<tr> 
<td style="background-color: #bbcae3; vertical-align: top;"> 
<div style="background-color: #e4e4e4; font-family: Tahoma; font-size: 12px; line-height: 22px; padding: 5px; text-decoration: underline; width: 210px; color: #000000; text-align: left;" id="side_bar"></div> 
</td> 
<td> 
<div style="height: 600px; width: 600px;" id="map"></div> 
</td> 
</tr> 
</tbody> 
</table> 
</div> 
</form> 
<script type="text/javascript" src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAyUoL7QQqyBn6qU653XJGLxSjEdRKL8ahnZ9z8zIKzjlyzNOP2RRCsKP_vlAEzWT8jzEKS0_9RrXOAg"></script> 
<script type="text/javascript">// <![CDATA[ 
if (GBrowserIsCompatible()) { 
     // this variable will collect the html which will eventualy be placed in the side_bar 
     var side_bar_html = ""; 

     // arrays to hold copies of the markers and html used by the side_bar 
     // because the function closure trick doesnt work there 
     var gmarkers = []; 
     var htmls = []; 
     var i = 0; 

     // A function to create the marker and set up the event window 
     function createMarker(point, name, html) { 
      var marker = new GMarker(point); 
      GEvent.addListener(marker, "click", function() { 
       marker.openInfoWindowHtml(html); 
      }); 

      // save the info we need to use later for the side_bar 
      gmarkers[i] = marker; 
      htmls[i] = html; 
      // add a line to the side_bar html 
      side_bar_html += '<a href="javascript:myclick(' + (gmarkers.length-1) + ')">' + name + '<\/a><br>'; 
      i++; 
      return marker; 
     } 

     // This function picks up the click and opens the corresponding info window 
     function myclick(i) { 
      gmarkers[i].openInfoWindowHtml(htmls[i]); 
     } 

     // create the map 
     var map = new GMap2(document.getElementById("map")); 
     map.addControl(new GLargeMapControl()); 
     map.addControl(new GMapTypeControl()); 
     map.setCenter(new GLatLng(0, 0), 0); 
     // 
     // ===== Start with an empty GLatLngBounds object ===== 
     var bounds = new GLatLngBounds(); 

     // Read the data from example3.xml 
     GDownloadUrl("/testStore/example3.xml", function(doc) { 
      var xmlDoc = GXml.parse(doc); 
      var markers = xmlDoc.documentElement.getElementsByTagName("marker"); 

      for (var i = 0; i < markers.length; i++) { 
       // obtain the attribues of each marker 
       var lat = parseFloat(markers[i].getAttribute("lat")); 
       var lng = parseFloat(markers[i].getAttribute("lng")); 
       var point = new GLatLng(lat, lng); 
       var html = markers[i].getAttribute("html"); 
       var label = markers[i].getAttribute("label"); 
       // create the marker 
       var marker = createMarker(point, label, html); 
       map.addOverlay(marker); 
      } 
      // put the assembled side_bar_html contents into the side_bar div 
      document.getElementById("side_bar").innerHTML = side_bar_html; 
     }); 
    } 

    else { 
     alert("Sorry, the Google Maps API is not compatible with this browser"); 
    } 
    // This Javascript is based on code provided by the 
    // Blackpool Community Church Javascript Team 
    // http://www.commchurch.freeserve.co.uk/ 
    // http://econym.googlepages.com/index.htm 

//]]>

2

Je ne sais pas peut-être u fixé le code et maintenant il est ok, mais dans le onCreate()

if (getIntent().getExtras() != null) { 
    final Bundle bundle = getIntent().getBundleExtra("LOCATION"); 
    mLatitude = bundle.getDouble("LATITUDE"); 
    mLatitude = bundle.getDouble("LONGITUDE"); 
} 

la seconde mLatitude Je pense que cela doit être mLongitude comme vous l'appelez dans les lignes suivantes. Désolé si je suis en retard avec la réponse et est inutile.

+0

Eh bien merci .. c'était une faute de frappe .. :) – Shrikant

4

Pour ajouter plusieurs marqueurs à mapper lors de la conversion d'une adresse (par exemple 123 Testing Street Lodi ca) en LatLng en utilisant geoCoder, l'exemple de code ci-dessous fonctionnera.

// convert address to lng lat and add markers to map 
public void addMarkersToMap() { 
    mMap.clear(); 
    Double[] latitude = new Double[addressArrayList.size()]; 
    Double[] longitude = new Double[addressArrayList.size()]; 
    String[] addrs = new String[addressArrayList.size()]; 
    addrs = addressArrayList.toArray(addrs); 
    List<Address> addressList; 
    if (addrs != null && addrs.length > 0) { 
     for (int i = 0; i < addrs.length; i++) { 
      try { 
       addressList = geoCoder.getFromLocationName(addrs[i], 1); 
       if (addressList == null || addressList.isEmpty() || addressList.equals("")) { 
        addressList = geoCoder.getFromLocationName("san francisco", 1); 
       } 
       latitude[i] = addressList.get(0).getLatitude(); 
       longitude[i] = addressList.get(0).getLongitude(); 
       System.out.println("latitude = " + latitude[i] + " longitude = " + longitude[i]); 
       mMap.addMarker(new MarkerOptions() 
          .position(new LatLng(latitude[i], longitude[i])) 
          .title(namesArrayList.get(i)) 
          .snippet(addressArrayList.get(i)) 
          .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)) 
          .alpha(0.7f) 
       ); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } // end catch 
     } 
    } 
} //end addMarkersToMap 
0

première craete Méthode setupDestationLocation

public void setupDestationLocation(double longlat, double latitue, String title) { 
      LatLng Shop = new LatLng(longlat, latitue); 
    /* if (DestinationMarker != null) { 
     DestinationMarker.remove(); 
    }*/ 
    DestinationMarker = mMap.addMarker(new MarkerOptions() 
     .position(Shop) 
     .title(market_n) 
     .title(title) 
     .icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_marker_shop))); 
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(Shop, 14); 
    mMap.animateCamera(cameraUpdate); 

    } 

Maintenant, il suffit d'appeler la méthode à l'intérieur de la méthode (onMapReady)

String title = "market"; 
    for(int i = 0 ; i < 8 ; i++) { 
     double offset = i/08d; 

     setupDestationLocation(longlat+offset,latitue,title+i); 
    } 
Questions connexes