Google Maps v2 - définir à la fois ma position et un zoom avant

123

Ma question est la suivante: est-ce que quelqu'un sait comment configurer Google Maps, ouvrir à la fois ma position et une vue agrandie?

Actuellement, la vue principale s'ouvre sur l'Afrique, entièrement agrandie.

Et donc je cherche depuis des jours maintenant, et tout ce que je peux trouver est:

1) Vous ne pouvez pas animer deux choses (comme zoomer et accéder à ma position) dans une seule carte Google? Donc, si je peux comprendre comment régler le zoom avant de définir l'animation, ce problème serait résolu. Cela a tendance à être le problème, vous pouvez en changer un, mais pas les deux.

2) J'ai trouvé d'autres classes qui pourraient être utiles, mais il n'y a aucune aide sur la façon de configurer le code afin que la classe puisse manipuler la carte google.

C'est le code auquel je me suis accroché jusqu'à présent, certains travaux, d'autres non. J'ai pensé que certains pourraient être utiles plus tard.

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;
}
}
Dustin
la source

Réponses:

205

Vous ne pouvez pas animer deux choses (comme zoomer et accéder à ma position) dans une seule carte Google?

Du point de vue du codage, vous les feriez de manière séquentielle:

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

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

Ici, je déplace d'abord la caméra, puis j'anime la caméra, bien que les deux puissent être des animateCamera()appels. GoogleMapJe ne peux pas dire si cela les consolide en un seul événement, car cela passe trop vite. :-)

Voici l'exemple de projet à partir duquel j'ai extrait le code ci-dessus.


Désolé, cette réponse est erronée. Voir la réponse de Rob pour un moyen de vraiment faire cela en un seul coup, en créant un CameraPositionpuis en créant un à CameraUpdatepartir de cela CameraPosition.

CommonsWare
la source
Ne devrait pas être la réponse acceptée. La réponse de Mubeen1992 est correcte.
Matthieu
1
@AlanHaverty: l'exemple d'application auquel je renvoie dans la réponse contient ce code. Il fonctionne parfaitement bien. Je viens de le tester maintenant sur un Nexus 9 sous Android 7.0 et un Nexus 6P sous Android 6.0.1. Il fonctionne parfaitement bien depuis quelques années. Cela ne les fait pas d' un seul coup, et je suis d'accord que Rob est une réponse supérieure, comme je l'ai noté dans ma réponse. Si vous pensez avoir la preuve que ce code ne fonctionne pas, publiez un exemple de projet quelque part.
CommonsWare
@CommonsWare Mes excuses, lors du test avec votre code, le coin supérieur gauche de ma carte semblait être défini avec le lng lat. J'ai supposé que vous vous trompiez sur ce que faisait .newLatLng (). Je ne sais pas pourquoi il était éteint, cela devait être autre chose de mon côté, la documentation de l'API prouve votre cas, désolé d'avoir déclenché heureux de votre réponse! Suppression de mon premier commentaire pour éviter toute confusion. Source de l'API: développeurs.google.com
Alan
168

Il est possible de modifier l'emplacement, le zoom, le cap et l'inclinaison en une seule fois. Il est également possible de définir la durée de l' animateCamera()appel.

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

Jetez un œil à la documentation ici:

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

Rob
la source
52

c'est une solution simple pour votre question

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

Essayez de cette manière -

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

}

}

Khobaib
la source
7

Vous pouvez également définir les deux paramètres comme,

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

Cela localise votre carte sur une position et un zoom spécifiques. J'utilise ceci sur la configuration de ma carte.

organillero
la source
3

C'est une réponse tardive mais je pense que cela aidera. Utilisez cette méthode:

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

Utilisez cette méthode après avoir chargé la carte. À votre santé!

Abx
la source
1

La façon la plus simple de le faire est d'utiliser CancelableCallback. Vous devez vérifier que la première action est terminée, puis appeler la seconde:

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() {
                }
            });
Yuliya Tarasenko
la source
0

La réponse de @ CommonsWare ne fonctionne pas réellement. J'ai trouvé que cela fonctionnait correctement:

map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(-33.88,151.21), 15));
iMahdi
la source
0

1.Ajoutez du code xml dans votre mise en page pour afficher les cartes.

2.Activez l'API google maps puis obtenez la clé API ci-dessous.

<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.Ajoutez ce code dans oncreate.

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

4.Ajoutez ce code après oncreate. puis accédez à l'emplacement actuel avec le marqueur placé dans ce

@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) {
}
Venkatesh
la source
0

Vous ne pouvez pas animer deux choses (comme zoomer et accéder à ma position) dans une seule carte Google.
Utilisez donc déplacer et animer la caméra pour zoomer

googleMapVar.moveCamera(CameraUpdateFactory.newLatLng(LocLtdLgdVar));
googleMapVar.animateCamera(CameraUpdateFactory.zoomTo(10));
Sujay UN
la source
-2
gmap.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(new LatLng(9.491327, 76.571404), 10, 30, 0)));
zacharia
la source