21

Ich verwende Google Map API v2 in meiner Anwendung, um Maps anzuzeigen.Wie zeigen Sie mehrere Markierungen in MapFragment in Google Map API v2 an?

Ich habe alle Schritte verfolgt, die zu befolgen sind, um Google Map in meiner Anwendung zu aktivieren.

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(); 
    } 
} 

Wenn ich diesen Code verwenden, zeigt es mir Karte, aber wenn ich meine Breiten-/Längenwerte liefern, Kartenkacheln nicht geladen, und ich sehe nur weiße Fliesen.

Im Folgenden finden Sie den Code in onCreate() von oben Klasse geschrieben:

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(); 
Auch

, ich eine Liste von lat/long-Werte haben. Ich möchte sie auf MapFragment, zeigen, wie man mehrere Markierungen auf MapFragment zeigt?

Ich versuchte mit MapView und ItemizedOverlay, aber es hat nicht für mich funktioniert. Ich glaube, ich habe den Schlüssel SHA1 korrekt erstellt, um den Schlüssel API zu bekommen, denn wenn das falsch war, konnte ich die Karte auch nicht mit MapFragment sehen, aber ich kann das sehen, wenn ich den lat/log Wert nicht überlasse.

Antwort

33

ich es so mit Markern in verschiedenen Farben Auto Positionen auf der Karte zeigen:

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()); 
     } 
    } 

} 

Autos ist ein ArrayList von benutzerdefinierten Objekten und mMarkers ist ein ArrayList von Markern.

Hinweis: Sie können Karte in Fragment wie folgt zeigen:

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); 

      } 
     }); 
    } 
} 

Und rufen Sie einfach setUpMapIfNeeded() in onCreate()

+0

Dank slezadav! Ich werde das versuchen und Sie wissen lassen. :) – Shrikant

+0

Wie zeige ich diese mMarkers auf MapFragment? – Shrikant

+1

Bearbeitete meine Antwort, so zeigt es, wie MapFragment ganze Map mit Markern hinzugefügt wird. Die Methode addMarkersToMap() befindet sich in der Methode setUpMap(). – slezadav

0

diesen Code Versuchen Sie, die in Sie Web-Site-Stammverzeichnis in eine XML-Datei aufruft -

Eine Möglichkeit, Marker hinzuzufügen, besteht darin, eine XML-Datei zu laden, die sich im Stammverzeichnis befindet (siehe Code unten), das den Marker html enthält.

Der hier angegebene Code richtet den Kartenbereich und eine Seitenleiste ein, in der die Karte und die Links für die Markierungen gespeichert werden. Beachten Sie, dass sowohl ein Div-Tag mit einer ID als auch eine Side-Bar-ID für die HTML- und Map-Elemente verwendet werden.

Sie können die Markierungen einrichten, beachten Sie jedoch die Notwendigkeit, Sonderzeichen zu verwenden, die richtig gekennzeichnet werden müssen; zum Beispiel sollte kaufmännisches Und (&) eigentlich als "&" + "amp" + ";" (ohne Anführungszeichen). Dasselbe gilt für Zeichen größer und kleiner als für Zeichen und so weiter. Es ist eine lästige Aufgabe, wenn Sie mehrere Markierungen haben, aber sobald sie an Ort und Stelle sind, ist es leicht zu ändern, da keine Baugruppen innerhalb der App erstellt oder codiert werden müssen. In dem Skript, das die Datei liest, sollte die Verwendung des CDATA-Tags technisch die Verwendung einer speziellen Zeichendarstellung unnötig machen, aber für Gmaps API v2 benutze ich sie trotzdem. In meinem Beispiel lautet der Name der XML-Datei beispiel3.xml.

Sie können die XML wie folgt formatiert:

<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

Ich weiß nicht, vielleicht u den Code festgelegt und jetzt ist es in Ordnung, aber in der onCreate()

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

die zweite mLatitude Ich denke, es muss mLongitude sein, wie Sie es in den nächsten Reihen nennen.

Sorry, wenn ich zu spät mit der Antwort bin und ist nutzlos.

+0

Gut danke..das war ein Tippfehler .. :) – Shrikant

4

Um mehrere Markierungen hinzufügen abzubilden, während Adresse Umwandlung (dh. 123 Testing Straße Lodi CA) LatLng Geocoder verwenden, wird der Beispielcode unten arbeiten. Methode

// 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

erste craete 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); 

    } 

Nun rufen Sie einfach Methode innerhalb Methode (onMapReady)

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

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