Google Haritalar v2 - hem konumumu hem de yakınlaştırmayı ayarla


123

Sorum şu, Google haritalarını hem konumumu hem de yakınlaştırılmış bir görünümde açmak için nasıl ayarlayacağını bilen var mı?

Şu anda, ana görünüm tamamen uzaklaştırılmış şekilde Afrika'ya açılıyor.

Ve bu yüzden günlerdir arıyordum ve bulabildiğim tek şey:

1) Bir Google haritasında iki şeyi (yakınlaştırma ve konumuma gitme gibi) canlandıramaz mısınız? Yani, canlandırmayı ayarlamadan önce yakınlaştırmayı nasıl ayarlayacağımı çözebilirsem, bu sorun çözülecektir. Sorun bu olma eğilimindedir, birini değiştirebilirsin ama ikisini birden değiştiremezsin.

2) Yararlı olabilecek başka sınıflar buldum, ancak kodun nasıl ayarlanacağına dair yardım yok, böylece sınıf google haritasını işleyebilir.

Şimdiye kadar tuttuğum kod bu, bazı işler, bazıları değil. Bazılarının daha sonra yararlı olabileceğini düşündüm.

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

Yanıtlar:


205

Tek bir Google haritasında iki şeyi (yakınlaştırma ve konumuma gitme gibi) hareketlendiremez misiniz?

Kodlama açısından, bunları sırayla yaparsınız:

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

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

Burada önce kamerayı hareket ettiriyorum, sonra kamerayı canlandırıyorum, her ikisi de animateCamera()çağrı olabilir . İster GoogleMapçok hızlı geçtikçe tek bir etkinlik haline birleştirir bunlar, ben söyleyemem. :-)

İşte yukarıdaki kodu aldığım örnek proje .


Üzgünüz, bu cevap kusurlu. Bunu tek seferde gerçekten yapmanın bir yolu için Rob'un cevabına bakın , a oluşturup CameraPositionardından CameraUpdateondan bir tane oluşturun CameraPosition.


Kabul edilen cevap olmamalı. Mubeen1992 cevabı doğru.
Matthew

1
@AlanHaverty: Yanıtta bağladığım örnek uygulama bu kodu içeriyor. Mükemmel çalışıyor. Şimdi Android 7.0 çalıştıran bir Nexus 9 ve Android 6.0.1 çalıştıran bir Nexus 6P üzerinde test ettim. Birkaç yıldır gayet iyi çalışıyor. O değil tek seferde bunları yapmak ve benim cevap belirtildiği gibi, Rob üstün bir cevap olduğu konusunda hemfikirdir. Bu kodun çalışmadığına dair kanıtınız olduğuna inanıyorsanız, bir yere örnek bir proje gönderin.
CommonsWare

@CommonsWare Özür dilerim, kodunuzla test ederken haritamın sol üst köşesi lat lng ile ayarlanmış görünüyordu. .NewLatLng () 'nin ne yaptığını yanlış anladığınızı varsaydım. Neden kapalı olduğundan emin değilim, benim tarafımdan başka bir şey olmalı, api belgeleri davanızı kanıtlıyor, cevabınızı tetiklediğim için üzgünüm! Karışıklığı önlemek için ilk
Alan

168

Tek seferde konum, yakınlaştırma, yön ve eğim değiştirmek mümkündür. animateCamera()Görüşmenin süresini de ayarlamak mümkündür .

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

Buradaki belgelere bir göz atın:

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


52

bu sorunuz için basit bir çözüm

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

13

Bu şekilde deneyin -

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

Her iki parametreyi de şöyle ayarlayabilirsiniz:

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

Bu, haritanızı belirli bir konumda bulur ve yakınlaştırır. Bunu haritamı kurarken kullanıyorum.


3

Geç cevap ama yardımcı olacağını düşünüyorum. Bu yöntemi kullanın:

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

Haritayı yükledikten sonra bu yöntemi kullanın. Şerefe!


1

Bunu yapmanın en basit yolu CancelableCallback'i kullanmaktır. İlk işlemin tamamlandığını kontrol etmeli ve ardından ikinciyi aramalısınız:

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

@ CommonsWare'in cevabı aslında işe yaramıyor. Bunun düzgün çalıştığını buldum:

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

0

1. Haritaları görüntülemek için mizanpajınıza xml kodu ekleyin.

2. google maps api'yi etkinleştirin, ardından aşağıdaki api anahtar yerini alın.

<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. Bu kodu oncreate'e ekleyin.

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

4. oncreate'den sonra bu kodu ekleyin. daha sonra içine işaretçi yerleştirilmiş olarak mevcut konuma erişin

@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

Bir Google haritasında iki şeyi (yakınlaştırma ve konumuma gitme gibi) hareketlendiremezsiniz.
Bu yüzden yakınlaştırmak için hareket ettirin ve Kamerayı hareketlendirin

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)));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.