Jak uzyskać centrum mapy dla map Androida w wersji 2?

83

W Mapach Google dla Androida v1 , MapView miał wygodną metodą: getMapCenter(). Teraz nie mogę dowiedzieć się, jak uzyskać centrum mapy w wersji 2 tego interfejsu API. Przejrzałem dokumentację API, ale nie ma wzmianki o takiej funkcji. Proszę doradź.

Dzięki, Igor

IgorGanapolsky
źródło

Odpowiedzi:

196

Miałem ten sam problem. Wydaje się, że możesz uzyskać centrum w ten sposób:

mMap.getCameraPosition().target

gdzie mMap to instancja GoogleMap z Twojej aktywności. To zwróci obiekt LatLng, który zasadniczo reprezentuje środek mapy.

Zauważ, że GeoPointklasa nie jest już dostępna.

Według http://developer.android.com/reference/com/google/android/gms/maps/model/CameraPosition.html

cel to „Lokalizacja, na którą wskazuje aparat”. (Przetestowałem to z przykładowym kodem i działało dobrze)

Radu Comaneci
źródło
1
Dzięki, nie zdawałem sobie sprawy, że GeoPoint był niedostępny w wersji 2. Chciałem użyć obiektu VisibleRegion, aby obliczyć środkowy punkt między czterema rogami mapy.
Igor Ganapolsky
@Radu Comaneci Jak zrobić to samo z javascriptem html? Dowolny pomysł
Ankesh kumar Jaisansaria
Dobra odpowiedź, ale ma to wpływ, jeśli używam dopełnienia, na przykład do przenoszenia znaku Google o prawach autorskich, więc środek mapy również otrzyma tę wartość dopełnienia
sdelvalle57
34

Znalazłem na to dwa sposoby:

1) Najłatwiejszy, pierwszy polega na użyciu właściwości target w obiekcie CameraPosition mapy

 LatLng center = mMap.getCameraPosition().target;

2) Drugi używa obiektu 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);

Porównałem obie odpowiedzi:

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
źródło
1
Opcja 2 daje mi zupełnie inną odpowiedź niż opcja 1. Może dlatego, że mam przezroczysty pasek narzędzi? Dzięki za wskazówkę!
Flyingkiwi
3
więc która metoda jest dokładna?
Abdullah Shoaib
@shontauro Jak zrobić to samo z javascriptem html? Dowolny pomysł
Ankesh kumar Jaisansaria
1
javascript nie mam pojęcia.
shontauro
15

Możesz użyć :

latlng=map.getProjection().getVisibleRegion().latLngBounds.getCenter();
AAP
źródło
Uzyskaj dokładność dzięki temu rozwiązaniu
VVB
6

aby uzyskać środek mapy, użyłem metody onMapReady () w działaniu, a następnie użyłem 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
źródło
5

Jeśli chcesz uzyskać pozycję tylko raz (np. Po tym, jak użytkownik przestał przesuwać mapę), użyj 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);
    }
});

lub używając lambdy Java 8:

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

Zwróć uwagę, że odbiornik zarejestrowany w programie setOnCameraChangeListenerjest wywoływany wiele razy i zgodnie z dokumentacją :

Może to być wywoływane tak często, jak raz w każdej klatce i nie powinno wykonywać kosztownych operacji.

friederbluemle
źródło
3

najlepiej użyć cameraPosition

Jawa:

LatLng centerMap = googleMap.getCameraPosition().target;

kotlin:

googleMap?.cameraPosition?.target?.let {
    // it is LatLng center
}
Rasoul Miri
źródło