Comment afficher plusieurs marqueurs sur MapFragment dans Google Map API v2?
j'utilise Google Map API v2
dans mon application pour montrer des cartes.
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'utilise ce code, il me montre la carte, mais si je fournis mes valeurs de latitude/longitude, les carreaux de carte ne se charge pas, et je ne vois que des carreaux blancs.
voici le code écrit dans 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();
J'ai aussi une liste de valeurs lat/long. Je veux montrer sur MapFragment
,comment afficher plusieurs marqueurs sur MapFragment
?
j'ai essayé avec MapView
et ItemizedOverlay
, mais ça n'a pas marché pour moi. Je crois que j'ai bien créé le SHA1
pour obtenir l' API
clé, parce que si c'était faux, Je ne pouvais pas voir la carte en utilisant MapFragment
aussi bien, mais je peux voir que si Je ne passe pas la valeur lat/log.
6 réponses
je fais comme ceci pour montrer la voiture de positions 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());
}
}
}
Voitures ArrayList
d'objets personnalisés et mMarkers est un ArrayList
de marqueurs.
Remarque : Vous pouvez afficher la carte du fragment comme ceci:
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()
onCreate()
pour ajouter plusieurs marqueurs à la carte lors de la conversion d'adresse (c.-à-d. 123 les Tests de la Rue de Lodi ca) pour LatLng à l'aide de geoCoder, l'exemple de code ci-dessous.
// 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
je ne sais pas peut-être u fixe le code et maintenant c'est ok, mais dans le onCreate()
if (getIntent().getExtras() != null) {
final Bundle bundle = getIntent().getBundleExtra("LOCATION");
mLatitude = bundle.getDouble("LATITUDE");
mLatitude = bundle.getDouble("LONGITUDE");
}
deuxième mLatitude
je pense qu'il doit être mLongitude
tout comme u l'appelle dans les lignes suivantes.
désolé si je suis en retard avec la réponse et est inutile.
essayez ce code qui appelle à un fichier xml dans votre répertoire racine du site web -
une façon d'ajouter des marqueurs est de charger un fichier xml qui se trouve dans le répertoire racine(voir code ci-dessous), qui contient le marqueur html.
le code ici établit de l'espace sur la carte et une colonne à 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 à barre latérale pour les éléments html et map.
Vous pouvez configurer les marqueurs, mais note la nécessité de utilisez des caractères spéciaux qui doivent être étiquetés correctement; par exemple ampersand (&) doit être codé comme "&" + "amp" + ";" (sans guillemets). La même chose s'applique à plus et à moins de 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 pas d'assemblages devant être construits ou codant à l'intérieur de l'application. Dans le script qui lit le fichier, l'utilisation de la balise CDATA devrait techniquement faire l'utilisation de caractères spéciaux représentation inutile, mais pour Gmaps API v2, je les utilise de toute façon. Pour mon exemple, le nom du fichier xml est exemple3.XML.
Vous pouvez formater le xml comme ceci:
<Markers>
<marker lat="47.881389" lng="-122.242222"
html='<div style="background-color:#FFFF88;font-family:Tahoma; font-size:12px;padding:6px; border:solid 1px black;"><b>SiteLines Park & Playground Products</b> <br>626 128th Street SW<br>Suite 104-A<br>Everett‚ WA 98204<br>Phone: (425) 355-5655<br><b>Toll Free: (800) 541-0869</b><br>Fax: (425) 347-3056<br>Email: <a href="mailto:info@sitelines.com" target="blank">emailus@sitelines.com</a><br>Web: <a href="http://www.sitelines.com" target="blank">www.sitelines.com</a> </div>'label="SiteLines Park & 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&v=2&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
// ]]>
première méthode de 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);
}
maintenant, il suffit d'appeler method inside method ( onMapReady)
String title = "market";
for(int i = 0 ; i < 8 ; i++ ) {
double offset = i / 08d;
setupDestationLocation(longlat+offset,latitue,title+i);
}
Vous pouvez essayer ceci:
public double getDistanceinKm(double lat1, double long1, double lat2, double long2) {
Location startPoint = new Location("locationA");
startPoint.setLatitude(lat1);
startPoint.setLongitude(long1);
Location endPoint = new Location("locationA");
endPoint.setLatitude(lat2);
endPoint.setLongitude(long2);
double distanceInKiloMeters = startPoint.distanceTo(endPoint) / 1000;
return distanceInKiloMeters;
}