Google Maps v2 - Legen Sie sowohl meinen Standort als auch die Vergrößerung fest


123

Meine Frage ist, weiß jemand, wie man Google Maps einrichtet, um sowohl meinen Standort als auch eine vergrößerte Ansicht zu öffnen?

Derzeit öffnet sich die Hauptansicht nach Afrika und wird vollständig herausgezoomt.

Und so habe ich seit Tagen gesucht und alles, was ich finden kann, sind:

1) Sie können nicht zwei Dinge (wie zoomen und zu meinem Standort gehen) in einer Google Map animieren? Wenn ich also herausfinden kann, wie der Zoom eingestellt wird, bevor ich die Animation einstelle, ist dieses Problem gelöst. Das ist in der Regel das Problem, Sie können eines ändern, aber nicht beide.

2) Ich habe andere Klassen gefunden, die nützlich sein könnten, aber es gibt keine Hilfe zum Einrichten des Codes, damit die Klasse die Google Map manipulieren kann.

Dies ist der Code, an dem ich bisher festgehalten habe, einige funktionieren, andere nicht. Einige, von denen ich dachte, dass sie später nützlich sein könnten.

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

Antworten:


205

Sie können nicht zwei Dinge (wie zoomen und zu meinem Standort gehen) in einer Google Map animieren?

Vom Standpunkt der Codierung aus würden Sie sie nacheinander ausführen:

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

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

Hier bewege ich zuerst die Kamera und animiere dann die Kamera, obwohl beide animateCamera()Anrufe sein könnten . Ob GoogleMapdiese zu einem einzigen Ereignis zusammengefasst werden, kann ich nicht sagen, da es zu schnell geht. :-)

Hier ist das Beispielprojekt, aus dem ich den obigen Code gezogen habe.


Entschuldigung, diese Antwort ist fehlerhaft. In Robs Antwort finden Sie eine Möglichkeit, dies wirklich auf einmal zu tun, indem Sie ein CameraPositionund dann ein CameraUpdatedaraus erstellen CameraPosition.


Sollte nicht die akzeptierte Antwort sein. Die Antwort von Mubeen1992 ist korrekt.
Matthew

1
@AlanHaverty: Die Beispiel-App, auf die ich in der Antwort verweise, enthält diesen Code. Es läuft einwandfrei. Ich habe es gerade auf einem Nexus 9 mit Android 7.0 und einem Nexus 6P mit Android 6.0.1 getestet. Es läuft seit ein paar Jahren einwandfrei. Es macht sie nicht auf einmal, und ich stimme zu, dass Robs eine überlegene Antwort ist, wie ich in meiner Antwort vermerkt habe. Wenn Sie glauben, dass Sie Beweise dafür haben, dass dieser Code nicht funktioniert, veröffentlichen Sie irgendwo ein Beispielprojekt.
CommonsWare

@CommonsWare Ich entschuldige mich, als ich mit Ihrem Code testete, schien die obere linke Ecke meiner Karte mit dem Lat lng eingestellt zu sein. Ich nahm an, Sie haben sich geirrt, was .newLatLng () getan hat. Ich bin mir nicht sicher, warum es ausgeschaltet war, es muss etwas anderes für mich gewesen sein, die API-Dokumente beweisen Ihren Fall, entschuldigen Sie, dass Sie sich über Ihre Antwort freuen! Löschen meines ersten Kommentars, um Verwirrung zu vermeiden. API-Quelle: developer.google.com/android/reference/com/google/android/gms/…
Alan

168

Es ist möglich, Position, Zoom, Peilung und Neigung auf einmal zu ändern. Es ist auch möglich, die Dauer des animateCamera()Anrufs festzulegen.

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

Schauen Sie sich die Dokumente hier an:

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


52

Dies ist eine einfache Lösung für Ihre Frage

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

13

Versuchen Sie es auf diese Weise -

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

Sie können auch beide Parameter einstellen wie:

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

Dadurch wird Ihre Karte an einer bestimmten Position lokalisiert und gezoomt. Ich benutze dies beim Einrichten meiner Karte.


3

Es ist eine späte Antwort, aber ich denke, es wird helfen. Verwenden Sie diese Methode:

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

Verwenden Sie diese Methode nach dem Laden der Karte. Prost!


1

Der einfachste Weg, dies zu tun, ist die Verwendung von CancelableCallback. Sie sollten überprüfen, ob die erste Aktion abgeschlossen ist, und dann die zweite aufrufen:

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

Die Antwort von @ CommonsWare funktioniert nicht wirklich. Ich habe festgestellt, dass dies richtig funktioniert:

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

0

1. Fügen Sie Ihrem Layout XML-Code für die Anzeige von Karten hinzu.

2. Aktivieren Sie die Google Maps-API und erhalten Sie den unten angegebenen API-Schlüsselplatz.

<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. Fügen Sie diesen Code in oncreate hinzu.

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

4. Fügen Sie diesen Code nach dem Erstellen hinzu. Greifen Sie dann mit der Markierung auf den aktuellen Standort zu

@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

Sie können nicht zwei Dinge (wie zoomen und zu meinem Standort gehen) in einer Google Map animieren.
Verwenden Sie also die Kamera zum Bewegen und Animieren, um zu zoomen

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)));
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.