Google Maps v2 - đặt cả vị trí của tôi và phóng to


123

Câu hỏi của tôi là, có ai biết cách thiết lập bản đồ google, để mở cả vị trí của tôi và trong chế độ xem phóng to không?

Hiện tại, chế độ xem chính mở ra châu Phi, tất cả các cách thu nhỏ.

Và vì vậy tôi đã tìm kiếm nhiều ngày nay và tất cả những gì tôi có thể tìm thấy là:

1) Bạn không thể làm động hai thứ (như phóng to và đi đến vị trí của tôi) trong một bản đồ google? Vì vậy, nếu tôi có thể tìm ra cách đặt thu phóng trước khi tôi đặt hoạt hình, thì vấn đề này sẽ được giải quyết. Đó có xu hướng là vấn đề, bạn có thể thay đổi một, nhưng không phải cả hai.

2) Tôi đã tìm thấy các lớp khác có thể hữu ích, nhưng không có trợ giúp về cách thiết lập mã để lớp có thể thao tác trên bản đồ google.

Đây là mã tôi đã giữ cho đến nay, một số tác phẩm, một số thì không. Một số tôi nghĩ có thể hữu ích sau này.

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

Câu trả lời:


205

Bạn không thể làm động hai thứ (như phóng to và đi đến vị trí của tôi) trong một bản đồ google?

Từ quan điểm mã hóa, bạn sẽ thực hiện chúng tuần tự:

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

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

Ở đây, tôi di chuyển camera trước, sau đó làm động camera, mặc dù cả hai có thể là animateCamera()cuộc gọi. Cho dù GoogleMaphợp nhất những điều này thành một sự kiện duy nhất, tôi không thể nói, vì nó diễn ra quá nhanh. :-)

Đây là dự án mẫu mà tôi đã kéo đoạn mã trên.


Xin lỗi, câu trả lời này là thiếu sót. Xem câu trả lời của Rob để biết cách thực sự làm điều này trong một lần bắn, bằng cách tạo CameraPositionvà sau đó tạo một CameraUpdatetừ đó CameraPosition.


Không nên là câu trả lời được chấp nhận. Câu trả lời của Mubeen1992 là đúng.
Matthew

1
@AlanHaverty: Ứng dụng mẫu mà tôi liên kết đến trong câu trả lời có chứa mã đó. Nó chạy hoàn toàn tốt. Tôi vừa thử nghiệm nó trên Nexus 9 chạy Android 7.0 và Nexus 6P chạy Android 6.0.1. Nó đã chạy hoàn toàn tốt trong một vài năm. Nó không thực hiện chúng trong một lần bắn và tôi đồng ý rằng Rob là một câu trả lời vượt trội, như tôi đã lưu ý trong câu trả lời của mình. Nếu bạn tin rằng bạn có bằng chứng cho thấy mã này không hoạt động, hãy đăng một dự án mẫu ở đâu đó.
CommonsWare

@CommonsWare Lời xin lỗi của tôi, trong khi kiểm tra mã của bạn, góc trên bên trái của bản đồ của tôi dường như được đặt với lat lng. Tôi giả sử bạn đã nhầm những gì .newLatLng () đã làm. Tôi không chắc tại sao nó lại bị tắt, nó chắc chắn là thứ gì đó khác của tôi, tài liệu api chứng minh trường hợp của bạn, xin lỗi vì đã kích hoạt hạnh phúc cho câu trả lời của bạn! Xóa nhận xét đầu tiên của tôi để tránh nhầm lẫn .. Nguồn API: developers.google.com/android/reference/com/google/android/gms/
Alan

168

Có thể thay đổi vị trí, thu phóng, mang và nghiêng tất cả trong một lần. Cũng có thể đặt thời lượng cho animateCamera()cuộc gọi.

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

Hãy xem các tài liệu ở đây:

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


52

đây là giải pháp đơn giản cho câu hỏi của bạn

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

13

Hãy thử theo cách này -

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

Bạn cũng có thể đặt cả hai tham số như,

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

Điều này định vị bản đồ của bạn trên một vị trí cụ thể và thu phóng. Tôi sử dụng điều này trên việc thiết lập bản đồ của tôi.


3

Đó là một câu trả lời muộn nhưng tôi nghĩ nó sẽ giúp. Sử dụng phương pháp này:

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

Sử dụng phương pháp này sau khi tải bản đồ. Chúc mừng!


1

Cách đơn giản nhất để làm điều đó là sử dụng CancableCallback. Bạn nên kiểm tra hành động đầu tiên đã hoàn tất và sau đó gọi lần thứ hai:

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

Câu trả lời của @ CommonsWare không thực sự hoạt động. Tôi thấy rằng điều này đang hoạt động đúng:

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

0

1.Thêm mã xml trong bố cục của bạn để hiển thị bản đồ.

2.Enable google maps api sau đó lấy vị trí chính của api bên dưới.

<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.Thêm mã này vào oncreate.

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

4.Thêm mã này sau khi điều trị. sau đó truy cập vị trí hiện tại với điểm đánh dấu được đặt trong đó

@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

Bạn không thể làm động hai thứ (như phóng to và đi đến vị trí của tôi) trong một bản đồ google.
Vì vậy, sử dụng di chuyển và hoạt hình Camera để phóng to

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)));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.