Google Maps v2: imposta sia la mia posizione che lo zoom


123

La mia domanda è: qualcuno sa come impostare Google Maps, per aprire sia la mia posizione che in una vista ingrandita?

Attualmente, la vista principale si apre sull'Africa, completamente ingrandita.

E così ho cercato per giorni ormai, e tutto quello che posso trovare sono:

1) Non puoi animare due cose (come ingrandire e andare alla mia posizione) in una mappa di Google? Quindi, se riesco a capire come impostare lo zoom prima di impostare l'animazione, allora questo problema sarebbe risolto. Questo tende ad essere il problema, puoi cambiarne uno, ma non entrambi.

2) Ho trovato altre classi che potrebbero essere utili, ma non c'è aiuto su come impostare il codice in modo che la classe possa manipolare la mappa di Google.

Questo è il codice a cui mi sono tenuto finora, alcuni funzionano, altri no. Alcuni ho pensato che potrebbero essere utili in seguito.

package com.MYWEBSITE.www;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;

public class MainActivity extends FragmentActivity {
private GoogleMap map;  

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);

    map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    map.setMyLocationEnabled(true);

    //LocationSource a = (LocationSource) getSystemService(Context.LOCATION_SERVICE);
    //LocationManager b = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    //map.setLocationSource(a);

    Criteria criteria = new Criteria();
    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    String provider = locationManager.getBestProvider(criteria, false);
    Location location = locationManager.getLastKnownLocation(provider);
    double lat =  location.getLatitude();
    double lng = location.getLongitude();
    LatLng coordinate = new LatLng(lat, lng);

    //CameraPosition.Builder x = CameraPosition.builder();
    //x.target(coordinate);
    //x.zoom(13);

    //Projection proj = map.getProjection();
    //Point focus = proj.toScreenLocation(coordinate);

    //map.animateCamera(CameraUpdateFactory.newLatLng(coordinate));
    map.animateCamera(CameraUpdateFactory.zoomBy(13));
    //map.moveCamera(CameraUpdateFactory.newLatLng(coordinate));


    ////LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds;
}
}

Risposte:


205

Non puoi animare due cose (come ingrandire e andare alla mia posizione) in una mappa di Google?

Dal punto di vista della codifica, li faresti in sequenza:

    CameraUpdate center=
        CameraUpdateFactory.newLatLng(new LatLng(40.76793169992044,
                                                 -73.98180484771729));
    CameraUpdate zoom=CameraUpdateFactory.zoomTo(15);

    map.moveCamera(center);
    map.animateCamera(zoom);

Qui, sposto prima la telecamera, poi la muovo, anche se entrambe potrebbero essere animateCamera()chiamate. Se GoogleMapconsolida questi in un unico evento, non posso dire, dato che passa troppo velocemente. :-)

Ecco il progetto di esempio da cui ho estratto il codice sopra.


Spiacenti, questa risposta è sbagliata. Guarda la risposta di Rob per trovare un modo per farlo veramente in un colpo solo, creando un CameraPositione poi creando un CameraUpdateda quello CameraPosition.


Non dovrebbe essere la risposta accettata. La risposta di Mubeen1992 è corretta.
Matteo

1
@AlanHaverty: l'app di esempio a cui mi collego nella risposta contiene quel codice. Funziona perfettamente bene. L'ho appena testato su un Nexus 9 con Android 7.0 e un Nexus 6P con Android 6.0.1. Funziona perfettamente bene per un paio d'anni. Essa non farle in un solo colpo, e sono d'accordo che Rob è una risposta superiore, come ho notato nella mia risposta. Se ritieni di avere prove che questo codice non funziona, pubblica un progetto di esempio da qualche parte.
CommonsWare

@CommonsWare Le mie scuse, durante il test con il tuo codice, l'angolo in alto a sinistra della mia mappa sembrava essere impostato con lat lng. Presumo che tu abbia sbagliato ciò che ha fatto .newLatLng (). Non sono sicuro del motivo per cui è stato disattivato, deve essere stato qualcos'altro da parte mia, i documenti api dimostrano il tuo caso, scusa per aver innescato felice la tua risposta! Eliminando il mio primo commento per evitare confusione .. Fonte API: developers.google.com/android/reference/com/google/android/gms/…
Alan

168

È possibile cambiare posizione, zoom, rilevamento e inclinazione tutto in una volta. È anche possibile impostare la durata della animateCamera()chiamata.

CameraPosition cameraPosition = new CameraPosition.Builder()
    .target(MOUNTAIN_VIEW)      // Sets the center of the map to Mountain View
    .zoom(17)                   // Sets the zoom
    .bearing(90)                // Sets the orientation of the camera to east
    .tilt(30)                   // Sets the tilt of the camera to 30 degrees
    .build();                   // Creates a CameraPosition from the builder
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

Dai un'occhiata ai documenti qui:

https://developers.google.com/maps/documentation/android/views?hl=en-US#moving_the_camera


52

questa è una soluzione semplice per la tua domanda

LatLng coordinate = new LatLng(lat, lng);
CameraUpdate yourLocation = CameraUpdateFactory.newLatLngZoom(coordinate, 5);
map.animateCamera(yourLocation);

13

Prova in questo modo -

public class SummaryMapActivity extends FragmentActivity implements LocationListener{

 private GoogleMap mMap;
 private LocationManager locationManager;
 private static final long MIN_TIME = 400;
 private static final float MIN_DISTANCE = 1000;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.summary_mapview);

    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) {
            mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
        }
    }
    mMap.setMyLocationEnabled(true);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME, MIN_DISTANCE, this); 


}

@Override
public void onLocationChanged(Location location) {
    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 15);
    mMap.animateCamera(cameraUpdate);
    locationManager.removeUpdates(this);

}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}

}


7

Puoi anche impostare entrambi i parametri come,

mMap.moveCamera( CameraUpdateFactory.newLatLngZoom(new LatLng(21.000000, -101.400000) ,4) );

Questo individua la tua mappa su una posizione specifica e ingrandisci. Lo uso per impostare la mia mappa.


3

È una risposta tardiva ma penso che aiuterà. Usa questo metodo:

protected void zoomMapInitial(LatLng finalPlace, LatLng currenLoc) {
    try {
        int padding = 200; // Space (in px) between bounding box edges and view edges (applied to all four sides of the bounding box)
        LatLngBounds.Builder bc = new LatLngBounds.Builder();

        bc.include(finalPlace);
        bc.include(currenLoc);
        googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bc.build(), padding));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Usa questo metodo dopo aver caricato la mappa. Saluti!


1

Il modo più semplice per farlo è utilizzare CancelableCallback. Dovresti controllare che la prima azione sia completa e quindi chiamare la seconda:

mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, size.x, height, 0), new CancelableCallback() {

                @Override
                public void onFinish() {
                    CameraUpdate cu_scroll = CameraUpdateFactory.scrollBy(0, 500);
                    mMap.animateCamera(cu_scroll);
                }

                @Override
                public void onCancel() {
                }
            });

0

La risposta di @ CommonsWare non funziona effettivamente. Ho scoperto che funziona correttamente:

map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(-33.88,151.21), 15));

0

1.Aggiungi codice xml nel layout per la visualizzazione delle mappe.

2.Abilita l'API di Google Maps, quindi ottieni la posizione della chiave API sotto.

<fragment
                   android:id="@+id/map"
               android:name="com.google.android.gms.maps.MapFragment"
                    android:layout_width="match_parent"
                    android:value="ADD-API-KEY"
                    android:layout_height="250dp"
                    tools:layout="@layout/newmaplayout" />
        <ImageView
            android:id="@+id/transparent_image"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@color/transparent" />

3.Aggiungi questo codice in oncreate.

 MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(UpadateProfile.this);

4. Aggiungi questo codice dopo oncreate. quindi accedi alla posizione corrente con il contrassegno posizionato in quella

@Override
public void onMapReady(GoogleMap rmap) {
    DO WHATEVER YOU WANT WITH GOOGLEMAP
    map = rmap;
    setUpMap();
}
public void setUpMap() {
    map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
  map.setMyLocationEnabled(true);
    map.setTrafficEnabled(true);
    map.setIndoorEnabled(true);
    map.getCameraPosition();
    map.setBuildingsEnabled(true);
    map.getUiSettings().setZoomControlsEnabled(true);
    markerOptions = new MarkerOptions();
    markerOptions.title("Outlet Location");
    map.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
        @Override
        public void onMapClick(LatLng point) {
            map.clear();
            markerOptions.position(point);
            map.animateCamera(CameraUpdateFactory.newLatLng(point));
            map.addMarker(markerOptions);
            String all_vals = String.valueOf(point);
            String[] separated = all_vals.split(":");
            String latlng[] = separated[1].split(",");
            MyLat = Double.parseDouble(latlng[0].trim().substring(1));
            MyLong = Double.parseDouble(latlng[1].substring(0,latlng[1].length()-1));
            markerOptions.title("Outlet Location");
            getLocation(MyLat,MyLong);
        }
    });
}
public void getLocation(double lat, double lng) {
    Geocoder geocoder = new Geocoder(UpadateProfile.this, Locale.getDefault());
    try {
        List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
   } catch (IOException e) {
         TODO Auto-generated catch block
        e.printStackTrace();
        Toast.makeText(this,e.getMessage(),Toast.LENGTH_SHORT).show();
    }
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}

0

Non puoi animare due cose (come ingrandire e andare alla mia posizione) in una mappa di Google.
Quindi usa sposta e anima la videocamera per ingrandire

googleMapVar.moveCamera(CameraUpdateFactory.newLatLng(LocLtdLgdVar));
googleMapVar.animateCamera(CameraUpdateFactory.zoomTo(10));

-2
gmap.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(new LatLng(9.491327, 76.571404), 10, 30, 0)));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.