Android Maps API v2: увеличение текущего местоположения и маркера

У меня есть карта, включенная в приложение. Мне нужна карта, чтобы увеличить маркер и местоположение пользователей, но держать маркер в центре. Увеличение работает отлично, но, конечно, маркер не центрируется на карте.

@Override
public void onLocationChanged(Location location) {
    if (mListener != null) {
        mListener.onLocationChanged(location);

        LatLngBounds bounds = new LatLngBounds.Builder()
        .include(new LatLng(location.getLatitude(),location.getLongitude()))
        .include((new LatLng(52.3563, 4.8790)))
        .build();

        mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 35));


    }
}

Каков наилучший способ держать оба в пределах границ, но держать маркер в центре? Я не могу найти решение в официальной документации.


person Raymond P    schedule 22.02.2013    source источник


Ответы (3)


Я бы назвал две функции: одну для центрирования маркера, а другую для масштабирования карты до тех пор, пока ваше текущее местоположение все еще не будет видно.

Мое решение для увеличения до точки с уровнем масштабирования 15:

myMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLngToCenter, 1));

масштабирование до тех пор, пока все маркеры не будут видны (вместо этого измените код, чтобы он соответствовал маркеру и вашей позиции):

public void fitZoomAndPositionToMapByMarkers() {

    int minLat = Integer.MAX_VALUE;
    int maxLat = Integer.MIN_VALUE;
    int minLon = Integer.MAX_VALUE;
    int maxLon = Integer.MIN_VALUE;

    List<MyMapMarker> markersShownOnMap = getMarkersToShow();

    for (MyMapMarker item : markersShownOnMap) {

        int lat = (int) (item.getLatitude() * 1E6);
        int lon = (int) (item.getLongitude() * 1E6);

        maxLat = Math.max(lat, maxLat);
        minLat = Math.min(lat, minLat);
        maxLon = Math.max(lon, maxLon);
        minLon = Math.min(lon, minLon);
    }

    double latitudeToGo = (maxLat + minLat) / 1E6 / 2;
    double longitudeToGo = (maxLon + minLon) / 1E6 / 2;
    LatLng toCenter = new LatLng(latitudeToGo, longitudeToGo);

    centerCameraToProperPosition(toCenter);

    LatLng southWestLatLon = new LatLng(minLat / 1E6, minLon / 1E6);
    LatLng northEastLatLon = new LatLng(maxLat / 1E6, maxLon / 1E6);

    zoomInUntilAllMarkersAreStillVisible(southWestLatLon, northEastLatLon);
}

Надеюсь это поможет!

private void zoomInUntilAllMarkersAreStillVisible(final LatLng southWestLatLon, final     LatLng northEastLatLon) {

    myMap.setOnCameraChangeListener(new OnCameraChangeListener() {

        @Override
        public void onCameraChange(CameraPosition arg0) {

            myMap.moveCamera(CameraUpdateFactory.newLatLngBounds(new LatLngBounds(southWestLatLon, northEastLatLon), 50));
            myMap.setOnCameraChangeListener(null);

        }
    });

}
person Analizer    schedule 25.02.2013
comment
myMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLngToCenter, 1)); РАБОТАЕТ ДЛЯ МЕНЯ :) СПАСИБО - person Fawwad Shafi; 09.05.2013
comment
centerCameraToProperPosition (до центра); где определяется? - person Ali; 09.03.2016
comment
вы можете решить эту проблему, используя myMap.moveCamera(CameraUpdateFactory.newLatLng(toCenter)) - person Analizer; 09.03.2016

Здравствуйте, я нашел хороший и простой способ использования LatLngbounds:

googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(new LatLngBounds(latlngSW, latlngNE, 50));

эта функция будет использовать самую юго-западную точку и самую северо-восточную точку для создания прямоугольника для центрирования вида с отступом 50, но вам нужно сначала проверить, какая из точек должна быть указана в качестве первого или второго параметра, вот мой код:

public void centerMap(LatLng latLng){
    if(fenceMarker != null){
        LatLngBounds center; 
        LatLng fence = fenceMarker.getPosition();
        if(fence.latitude < latLng.latitude || fence.longitude < latLng.longitude)
            center = new LatLngBounds(fenceMarker.getPosition(), latLng);
        else{
            center = new LatLngBounds(latLng, fenceMarker.getPosition());
        }
        googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(center, 50));
    }
}

2 точки — это моя позиция latLng и маркер, который у меня есть для GeoFence, FenceMarker.

Я вызываю эту функцию centerMap(latLng) из onLocationChanged():

@Override
public void onLocationChanged(Location location) {
    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
    centerMap(latLng);
}
person Roi    schedule 23.05.2013

Установка границ –

Перегруженный метод newLatLngBounds(boundary, width, height, padding) позволяет
указать ширину и высоту в пикселях для прямоугольника с намерение, чтобы
они соответствовали размерам карты. Прямоугольник располагается таким образом, что его центр совпадает с центром вида карты (так что, если указанные размеры совпадают с размерами вида карты, прямоугольник совпадает с видом карты) . Возвращаемый объект CameraUpdate перемещает камеру таким образом, чтобы указанные LatLngBounds были центрированы на экране в заданном прямоугольнике при максимально возможном уровне масштабирования с учетом требуемого отступа.
Справочник – https://developers.google.com/maps/documentation/android/views#target_location

person Anukool    schedule 22.02.2013
comment
Может быть, я что-то упускаю, но я не вижу, чтобы сам маркер помещался в центр экрана, а пользователи располагались где-то еще в пределах границ. - person Raymond P; 22.02.2013