¿Cómo obtener el centro del mapa para los mapas de Android v2?

81

En Google Maps para Android v1 , MapView tenía un método de conveniencia: getMapCenter(). Ahora no puedo averiguar cómo obtener el centro del mapa con la v2 de esta API. He examinado la documentación de la API, pero no se menciona tal característica. Por favor avise.

Gracias Igor

IgorGanapolsky
fuente

Respuestas:

194

Yo tuve el mismo problema. Parece que puedes obtener el centro de esta manera:

mMap.getCameraPosition().target

donde mMap es la instancia de GoogleMap de su actividad. Esto devolverá un objeto LatLng que básicamente representa el centro del mapa.

Tenga en cuenta que la GeoPointclase ya no está disponible.

Según http://developer.android.com/reference/com/google/android/gms/maps/model/CameraPosition.html

el objetivo es "La ubicación a la que apunta la cámara". (Lo probé con el código de muestra y funcionó bien para mí)

Radu Comaneci
fuente
1
Gracias, no me di cuenta de que GeoPoint no estaba disponible en v2. Iba a usar el objeto VisibleRegion para calcular el punto medio entre las cuatro esquinas de la visualización del mapa.
IgorGanapolsky
@Radu Comaneci ¿Cómo hacer lo mismo con html javascript? Cualquier idea
Ankesh kumar Jaisansaria
Buena respuesta, pero esto se ve afectado si estoy usando un relleno, por ejemplo, para mover el signo de copyright de Google, por lo que el centro del mapa también obtendrá este valor de relleno
sdelvalle57
34

He encontrado dos formas de hacer esto:

1) El más fácil, el primero es usar la propiedad de destino en el objeto CameraPosition del mapa

 LatLng center = mMap.getCameraPosition().target;

2) El segundo es usar un objeto VisibleRegion:

VisibleRegion visibleRegion = mMap.getProjection()
                    .getVisibleRegion();

Point x = mMap.getProjection().toScreenLocation(
                    visibleRegion.farRight);

Point y = mMap.getProjection().toScreenLocation(
                    visibleRegion.nearLeft);

Point centerPoint = new Point(x.x / 2, y.y / 2);

LatLng centerFromPoint = mMap.getProjection().fromScreenLocation(
                    centerPoint);

He comparado ambas respuestas:

Log.d("MapFragment: ", "Center From camera: Long: " + center.longitude
                        + " Lat" + center.latitude);

Log.d("Punto x", "x:" + x.x + "y:" + x.y);
Log.d("Punto y", "y:" + y.x + "y:" + y.y);

Log.d("MapFragment: ", "Center From Point: Long: "
                    + centerFromPoint.longitude + " Lat"
                    + centerFromPoint.latitude);
shontauro
fuente
1
La opción 2 me da una respuesta completamente diferente a la opción 1. ¿Quizás porque tengo una barra de herramientas transparente? ¡Gracias por el consejo!
Flyingkiwi
3
entonces, ¿qué método es exacto?
Abdullah Shoaib
@shontauro ¿Cómo hacer lo mismo con html javascript? Cualquier idea
Ankesh kumar Jaisansaria
1
javascript ni idea.
shontauro
15

Puedes usar :

latlng=map.getProjection().getVisibleRegion().latLngBounds.getCenter();
AAP
fuente
Obtenga la precisión con esta solución
VVB
6

para obtener el centro del mapa utilicé el método onMapReady () en la actividad, luego usé googleMap.setOnCameraChangeListener() method to get position of Came:

@Override
public void onMapReady(GoogleMap googMap) {
    googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
        @Override
        public void onCameraChange(CameraPosition cameraPosition) {

       Log.i("centerLat",cameraPosition.target.latitude);

       Log.i("centerLong",cameraPosition.target.longitude);

        }
    });
}
CommonSenseCode
fuente
5

Si solo desea obtener la posición una vez (por ejemplo, después de que el usuario haya dejado de desplazar el mapa), use setOnCameraIdleListener:

https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnCameraIdleListener

mMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() {
    @Override
    public void onCameraIdle() {
        LatLng position = mMap.getCameraPosition().target;
        Log.d("MapActivity", "Position: " + position);
    }
});

o usando una lambda de Java 8:

mMap.setOnCameraIdleListener(() -> {
    LatLng position = mMap.getCameraPosition().target;
    Log.d("MapActivity", "Position: " + position);
});

Tenga en cuenta que el oyente registrado con setOnCameraChangeListenerse llama muchas veces y, como dice la documentación :

Esto se puede llamar tan a menudo como una vez en cada cuadro y no debe realizar operaciones costosas.

friederbluemle
fuente
3

mejor manera de usar cameraPosition

Java:

LatLng centerMap = googleMap.getCameraPosition().target;

kotlin:

googleMap?.cameraPosition?.target?.let {
    // it is LatLng center
}
Rasoul Miri
fuente