Wie bekomme ich das Kartenmitte für v2 Android Maps?

81

In Google Maps für Android v1 hatte MapView eine praktische Methode : getMapCenter(). Jetzt kann ich nicht herausfinden, wie ich mit v2 dieser API das Kartencenter bekomme . Ich habe die API-Dokumentation durchgesehen, aber eine solche Funktion wird nicht erwähnt. Bitte beraten.

Danke, Igor

IgorGanapolsky
quelle

Antworten:

194

Ich hatte das gleiche Problem. Es scheint, dass Sie das Zentrum auf diese Weise erreichen können:

mMap.getCameraPosition().target

Dabei ist mMap die GoogleMap-Instanz Ihrer Aktivität. Dadurch wird ein LatLng-Objekt zurückgegeben, das im Wesentlichen die Mitte der Karte darstellt.

Beachten Sie, dass die GeoPointKlasse nicht mehr verfügbar ist.

Laut http://developer.android.com/reference/com/google/android/gms/maps/model/CameraPosition.html

Ziel ist "Der Ort, auf den die Kamera zeigt." (Ich habe es mit dem Beispielcode getestet und es hat bei mir gut funktioniert)

Radu Comaneci
quelle
1
Vielen Dank, ich habe nicht bemerkt, dass GeoPoint in Version 2 nicht verfügbar ist. Ich wollte das VisibleRegion-Objekt verwenden, um den Mittelpunkt zwischen den vier Ecken der Kartenanzeige zu berechnen.
IgorGanapolsky
@ Radu Comaneci Wie mache ich dasselbe mit HTML-Javascript? Jede Idee
Ankesh Kumar Jaisansaria
Gute Antwort, aber dies wird beeinträchtigt, wenn ich zum Beispiel ein Padding verwende, um das Copyright-Google-Zeichen zu verschieben, sodass die Mitte der Karte auch diesen Padding-Wert erhält
sdelvalle57
34

Ich habe zwei Möglichkeiten gefunden, dies zu tun:

1) Am einfachsten ist es, die Zieleigenschaft im CameraPosition-Objekt der Karte zu verwenden

 LatLng center = mMap.getCameraPosition().target;

2) Der zweite verwendet ein VisibleRegion-Objekt:

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

Ich habe beide Antworten verglichen:

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
quelle
1
Option 2 gibt für mich eine völlig andere Antwort als Option 1. Vielleicht, weil ich eine transparente Symbolleiste habe? Danke für den Tipp!
Flyingkiwi
3
Welche Methode ist also genau?
Abdullah Shoaib
@shontauro Wie mache ich dasselbe mit HTML-Javascript? Jede Idee
Ankesh Kumar Jaisansaria
1
Javascript keine Ahnung.
Shontauro
15

Sie können verwenden:

latlng=map.getProjection().getVisibleRegion().latLngBounds.getCenter();
AAP
quelle
Holen Sie sich die Genauigkeit mit dieser Lösung
VVB
6

Um das Kartenzentrum zu erhalten, habe ich die onMapReady () -Methode in der Aktivität verwendet und dann Folgendes verwendet 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
quelle
5

Wenn Sie die Position nur einmal abrufen möchten (z. B. nachdem der Benutzer das Schwenken der Karte beendet hat), verwenden Sie 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);
    }
});

oder mit einem Java 8 Lambda:

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

Beachten Sie, dass der bei registrierte Listener setOnCameraChangeListenerviele Male aufgerufen wird und wie in der Dokumentation angegeben :

Dies kann so oft wie einmal pro Frame aufgerufen werden und sollte keine teuren Operationen ausführen.

friederbluemle
quelle
3

Verwenden Sie am besten cameraPosition

Java:

LatLng centerMap = googleMap.getCameraPosition().target;

Kotlin:

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