Mapy Google v2 - ustaw moją lokalizację i powiększ

123

Moje pytanie brzmi, czy ktoś wie, jak ustawić mapy Google, aby otworzyć zarówno moją lokalizację, jak i powiększony widok?

Obecnie główny widok otwiera się na Afrykę, całkowicie pomniejszony.

Tak więc szukałem już od kilku dni i wszystko, co mogę znaleźć, to:

1) Nie możesz animować dwóch rzeczy (takich jak powiększenie i przejście do mojej lokalizacji) na jednej mapie Google? Jeśli więc zdołam wymyślić, jak ustawić powiększenie, zanim ustawię animację, ten problem zostałby rozwiązany. Zwykle jest to problem, możesz zmienić jeden, ale nie oba.

2) Znalazłem inne klasy, które mogą być przydatne, ale nie ma pomocy, jak skonfigurować kod, aby klasa mogła manipulować mapą google.

To jest kod, którego trzymałem się do tej pory, niektóre działają, inne nie. Niektóre, które pomyślałem, mogą się później przydać.

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
źródło

Odpowiedzi:

205

Nie możesz animować dwóch rzeczy (takich jak powiększenie i przejście do mojej lokalizacji) na jednej mapie Google?

Z punktu widzenia kodowania zrobiłbyś je sekwencyjnie:

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

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

Tutaj najpierw poruszam aparatem, a potem go animuję, chociaż mogą to być animateCamera()połączenia. GoogleMapNie mogę powiedzieć, czy konsoliduje je w jedno wydarzenie, ponieważ mija ono zbyt szybko. :-)

Oto przykładowy projekt, z którego wyciągnąłem powyższy kod.


Przepraszamy, ta odpowiedź jest błędna. Zobacz odpowiedź Roba, aby dowiedzieć się, jak naprawdę zrobić to w jednym ujęciu, tworząc a, CameraPositiona następnie tworząc na jego CameraUpdatepodstawie CameraPosition.

CommonsWare
źródło
Nie powinna być akceptowaną odpowiedzią. Mubeen1992 odpowiedź jest prawidłowa.
Matthew
1
@AlanHaverty: przykładowa aplikacja, do której łącze w odpowiedzi zawiera ten kod. Działa doskonale. Właśnie przetestowałem go teraz na Nexusie 9 z Androidem 7.0 i Nexusie 6P z Androidem 6.0.1. Od kilku lat działa doskonale. Nie robi ich za jednym zamachem i zgadzam się, że odpowiedź Roba jest lepszą odpowiedzią, jak zauważyłem w mojej odpowiedzi. Jeśli uważasz, że masz dowody, że ten kod nie działa, opublikuj gdzieś przykładowy projekt.
CommonsWare,
@CommonsWare Moje przeprosiny, podczas testowania z Twoim kodem w lewym górnym rogu mojej mapy wydawało się, że jest ustawiony na lng lng. Zakładałem, że pomyliłeś się, co zrobiła .newLatLng (). Nie jestem pewien, dlaczego to było wyłączone, to musiało być coś innego z mojej strony, dokumentacja api udowadnia twoją rację, przepraszam, że jestem zadowolony z twojej odpowiedzi! Usuwanie mojego pierwszego komentarza, aby uniknąć nieporozumień. Źródło API: developers.google.com/android/reference/com/google/android/gms/…
Alan
168

Możliwa jest zmiana lokalizacji, powiększenia, namiaru i pochylenia wszystko za jednym razem. Możliwe jest również ustawienie czasu trwania animateCamera()połączenia.

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

Spójrz na dokumenty tutaj:

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

Obrabować
źródło
52

to jest proste rozwiązanie na Twoje pytanie

LatLng coordinate = new LatLng(lat, lng);
CameraUpdate yourLocation = CameraUpdateFactory.newLatLngZoom(coordinate, 5);
map.animateCamera(yourLocation);
Ali
źródło
13

Spróbuj w ten sposób -

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
źródło
7

Możesz także ustawić oba parametry, takie jak,

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

Spowoduje to zlokalizowanie mapy w określonej pozycji i powiększenie. Używam tego podczas konfigurowania mojej mapy.

organillero
źródło
3

To późna odpowiedź, ale myślę, że to pomoże. Użyj tej metody:

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

Użyj tej metody po załadowaniu mapy. Twoje zdrowie!

Abx
źródło
1

Najprostszym sposobem jest użycie CancelableCallback. Powinieneś sprawdzić, czy pierwsza akcja została zakończona, a następnie wywołać drugą:

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
źródło
0

Odpowiedź @ CommonsWare tak naprawdę nie działa. Okazało się, że to działa poprawnie:

map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(-33.88,151.21), 15));
iMahdi
źródło
0

1.Dodaj do układu kod xml do wyświetlania map.

2. Włącz interfejs Google Maps api, a następnie pobierz miejsce klucza API, które znajduje się poniżej.

<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. Dodaj ten kod w oncreate.

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

4. Dodaj ten kod po oncreate. następnie uzyskaj dostęp do bieżącej lokalizacji z umieszczonym w niej znacznikiem

@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
źródło
0

Nie możesz animować dwóch rzeczy (takich jak powiększanie i przechodzenie do mojej lokalizacji) na jednej mapie Google.
Więc użyj ruchu i animacji kamery, aby powiększyć

googleMapVar.moveCamera(CameraUpdateFactory.newLatLng(LocLtdLgdVar));
googleMapVar.animateCamera(CameraUpdateFactory.zoomTo(10));
Sujay UN
źródło
-2
gmap.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(new LatLng(9.491327, 76.571404), 10, 30, 0)));
zacharia
źródło