Google Maps v2 - setel lokasi saya dan perbesar


123

Pertanyaan saya adalah, apakah ada yang tahu cara mengatur peta google, untuk membuka lokasi saya dan dalam tampilan yang diperbesar?

Saat ini, tampilan utama terbuka ke Afrika, diperkecil sepenuhnya.

Jadi saya telah mencari selama berhari-hari, dan yang dapat saya temukan hanyalah:

1) Anda tidak dapat menganimasikan dua hal (seperti memperbesar dan pergi ke lokasi saya) dalam satu peta google? Jadi jika saya dapat mengetahui cara mengatur zoom sebelum saya mengatur animasi, maka masalah ini akan terpecahkan. Itu cenderung menjadi masalahnya, Anda bisa mengubahnya, tapi tidak keduanya.

2) Saya telah menemukan kelas lain yang mungkin berguna, tetapi tidak ada bantuan tentang cara menyiapkan kode sehingga kelas tersebut dapat memanipulasi peta google.

Ini adalah kode yang saya pegang sejauh ini, beberapa berfungsi, beberapa tidak. Beberapa yang saya pikir mungkin berguna di kemudian hari.

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

Jawaban:


205

Anda tidak dapat menganimasikan dua hal (seperti memperbesar dan pergi ke lokasi saya) dalam satu peta google?

Dari sudut pandang pengkodean, Anda akan melakukannya secara berurutan:

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

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

Di sini, saya menggerakkan kamera terlebih dahulu, lalu menghidupkan kamera, meskipun keduanya bisa jadi animateCamera()panggilan. Apakah GoogleMapmengkonsolidasikan ini menjadi satu peristiwa, saya tidak bisa mengatakan, karena berjalan terlalu cepat. :-)

Berikut adalah contoh proyek dari mana saya menarik kode di atas.


Maaf, jawaban ini salah. Lihat jawaban Rob cara untuk benar-benar melakukan hal ini dalam satu tembakan, dengan menciptakan CameraPositiondan kemudian menciptakan CameraUpdatedari yang CameraPosition.


Seharusnya bukan jawaban yang diterima. Jawaban Mubeen1992 benar.
Matius

1
@AlanHaverty: Contoh aplikasi yang saya tautkan di jawaban berisi kode itu. Ini berjalan dengan baik. Saya baru saja mengujinya sekarang pada Nexus 9 yang menjalankan Android 7.0, dan Nexus 6P yang menjalankan Android 6.0.1. Ini telah berjalan dengan baik selama beberapa tahun. Itu tidak melakukannya dalam satu kesempatan, dan saya setuju bahwa Rob adalah jawaban yang lebih unggul, seperti yang saya catat dalam jawaban saya. Jika Anda yakin memiliki bukti bahwa kode ini tidak berfungsi, kirimkan proyek contoh di suatu tempat.
CommonsWare

@CommonsWare Mohon maaf, saat menguji dengan kode Anda, pojok kiri atas peta saya sepertinya disetel dengan lat lng. Saya berasumsi Anda salah mengira apa yang dilakukan .newLatLng (). Saya tidak yakin mengapa itu mati, itu pasti sesuatu yang lain di pihak saya, dokumen api membuktikan kasus Anda, maaf telah memicu dengan senang hati pada jawaban Anda! Menghapus komentar pertama saya untuk menghindari kebingungan .. Sumber API: developers.google.com/android/reference/com/google/android/gms/…
Alan

168

Anda dapat mengubah lokasi, memperbesar / memperkecil, arah, dan memiringkan semuanya sekaligus. Ini juga memungkinkan untuk mengatur durasi animateCamera()panggilan.

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

Lihat dokumennya di sini:

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


52

ini adalah solusi sederhana untuk pertanyaan Anda

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

13

Coba dengan cara ini -

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

}

}


7

Anda juga dapat mengatur kedua parameter seperti,

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

Ini menempatkan peta Anda pada posisi dan zoom tertentu. Saya menggunakan ini untuk menyiapkan peta saya.


3

Ini jawaban yang terlambat tapi saya pikir itu akan membantu. Gunakan metode ini:

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

Gunakan metode ini setelah memuat peta. Bersulang!


1

Cara termudah untuk melakukannya adalah dengan menggunakan CancelableCallback. Anda harus memeriksa bahwa tindakan pertama sudah selesai dan kemudian memanggil yang kedua:

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

0

Jawaban @ CommonsWare sebenarnya tidak berfungsi. Saya menemukan bahwa ini berfungsi dengan baik:

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

0

1. Tambahkan kode xml dalam tata letak Anda untuk menampilkan peta.

2. Aktifkan api google maps kemudian dapatkan tempat kunci api di bawah ini.

<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. Tambahkan kode ini di oncreate.

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

4. Tambahkan kode ini setelah oncreate. kemudian akses lokasi saat ini dengan penanda ditempatkan di dalamnya

@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) {
}

0

Anda tidak dapat menganimasikan dua hal (seperti memperbesar dan pergi ke lokasi saya) dalam satu peta google.
Jadi gunakan gerakan dan animasikan Kamera untuk memperbesar

googleMapVar.moveCamera(CameraUpdateFactory.newLatLng(LocLtdLgdVar));
googleMapVar.animateCamera(CameraUpdateFactory.zoomTo(10));

-2
gmap.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(new LatLng(9.491327, 76.571404), 10, 30, 0)));
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.