Google Maps v2: establecer mi ubicación y acercar

123

Mi pregunta es, ¿alguien sabe cómo configurar Google Maps, para abrir mi ubicación y en una vista ampliada?

Actualmente, la vista principal se abre a África, completamente alejada.

Y así que he estado buscando durante días, y todo lo que puedo encontrar son:

1) ¿No puedes animar dos cosas (como acercar e ir a mi ubicación) en un mapa de Google? Entonces, si puedo descubrir cómo configurar el zoom antes de configurar el animado, entonces este problema se resolvería. Ese suele ser el problema, puede cambiar uno, pero no ambos.

2) He encontrado otras clases que pueden ser útiles, pero no hay ayuda sobre cómo configurar el código para que la clase pueda manipular el mapa de Google.

Este es el código al que me he aferrado hasta ahora, algunos funcionan, otros no. Algunos pensé que podrían ser útiles más adelante.

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
fuente

Respuestas:

205

¿No puedes animar dos cosas (como acercar e ir a mi ubicación) en un mapa de Google?

Desde el punto de vista de la codificación, los haría secuencialmente:

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

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

Aquí, primero muevo la cámara, luego la animo, aunque ambas podrían ser animateCamera()llamadas. GoogleMapNo puedo decir si los consolida en un solo evento, ya que pasa demasiado rápido. :-)

Aquí está el proyecto de muestra del que extraje el código anterior.


Lo siento, esta respuesta es defectuosa. Vea la respuesta de Rob para una forma de hacer esto realmente de una sola vez, creando un CameraPositiony luego creando un a CameraUpdatepartir de eso CameraPosition.

CommonsWare
fuente
No debería ser la respuesta aceptada. La respuesta de Mubeen1992 es correcta.
Mateo
1
@AlanHaverty: la aplicación de muestra a la que enlace en la respuesta contiene ese código. Funciona perfectamente bien. Lo probé ahora en un Nexus 9 con Android 7.0 y un Nexus 6P con Android 6.0.1. Ha funcionado perfectamente bien durante un par de años. No los hace de una sola vez, y estoy de acuerdo en que Rob es una respuesta superior, como señalé en mi respuesta. Si cree que tiene evidencia de que este código no funciona, publique un proyecto de muestra en alguna parte.
CommonsWare
@CommonsWare Mis disculpas, mientras probaba con su código, la esquina superior izquierda de mi mapa parecía estar configurada con el lat lng. Asumí que confundiste lo que hizo .newLatLng (). No estoy seguro de por qué estaba apagado, debe haber sido algo más de mi parte, los documentos de la API prueban su caso, ¡perdón por disparar feliz por su respuesta! Eliminar mi primer comentario para evitar confusiones. Fuente API: developers.google.com/android/reference/com/google/android/gms/…
Alan
168

Es posible cambiar la ubicación, el zoom, la orientación y la inclinación, todo de una vez. También es posible establecer la duración de la animateCamera()llamada.

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

Echa un vistazo a los documentos aquí:

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

Robar
fuente
52

esta es una solución simple para su pregunta

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

Intenta de esta manera:

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

También puede establecer ambos parámetros como,

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

Esto ubica su mapa en una posición específica y zoom. Lo uso en la configuración de mi mapa.

organillero
fuente
3

Es una respuesta tardía, pero creo que ayudará. Usa este método:

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

Use este método después de cargar el mapa. ¡Salud!

Abx
fuente
1

La forma más sencilla de hacerlo es usar CancelableCallback. Debe verificar que la primera acción esté completa y luego llamar a la segunda:

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
fuente
0

La respuesta de @ CommonsWare no funciona realmente. Descubrí que esto funciona correctamente:

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

1.Agregue código xml en su diseño para mostrar mapas.

2.Habilite la API de Google Maps y luego obtenga la clave de la API que se encuentra debajo.

<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. Agregue este código en oncreate.

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

4. Agregue este código después de crear. luego acceda a la ubicación actual con el marcador colocado en ese

@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
fuente
0

No puede animar dos cosas (como acercar e ir a mi ubicación) en un mapa de Google.
Así que usa mover y animar la cámara para hacer zoom

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