Как получить центр карты для карт v2 android?

83

В Google Maps для Android v1 , MapView был удобный метод: getMapCenter(). Теперь я не могу понять, как получить центр карты с v2 этого api. Я просмотрел документацию по API, но там нет упоминания о такой функции. Пожалуйста, порекомендуйте.

Спасибо игорь

Игорь Ганапольский
источник

Ответы:

196

У меня такая же проблема. Кажется, можно получить центр таким образом:

mMap.getCameraPosition().target

где mMap - это экземпляр GoogleMap из вашей активности. Это вернет объект LatLng, который в основном представляет центр карты.

Обратите внимание, что этот GeoPointкласс больше не доступен.

Согласно http://developer.android.com/reference/com/google/android/gms/maps/model/CameraPosition.html

target - «Место, на которое указывает камера». (Я тестировал его с помощью образца кода, и он работал у меня нормально)

Раду Команечи
источник
1
Спасибо, я не знал, что GeoPoint недоступен в версии 2. Я собирался использовать объект VisibleRegion для вычисления средней точки между четырьмя углами отображения карты.
Игорь Ганапольский
@Radu Comaneci Как сделать то же самое с html javascript? Любая идея
Анкеш Кумар Джайсансария
Хороший ответ, но это повлияет, если я использую отступы, например, для перемещения знака Google с авторским правом, поэтому центр карты также получит это значение заполнения
sdelvalle57
34

Я нашел два способа сделать это:

1) Самый простой. Первый - использовать свойство target в объекте CameraPosition на карте.

 LatLng center = mMap.getCameraPosition().target;

2) Второй использует объект VisibleRegion:

VisibleRegion visibleRegion = mMap.getProjection()
                    .getVisibleRegion();

Point x = mMap.getProjection().toScreenLocation(
                    visibleRegion.farRight);

Point y = mMap.getProjection().toScreenLocation(
                    visibleRegion.nearLeft);

Point centerPoint = new Point(x.x / 2, y.y / 2);

LatLng centerFromPoint = mMap.getProjection().fromScreenLocation(
                    centerPoint);

Я сравнил оба ответа:

Log.d("MapFragment: ", "Center From camera: Long: " + center.longitude
                        + " Lat" + center.latitude);

Log.d("Punto x", "x:" + x.x + "y:" + x.y);
Log.d("Punto y", "y:" + y.x + "y:" + y.y);

Log.d("MapFragment: ", "Center From Point: Long: "
                    + centerFromPoint.longitude + " Lat"
                    + centerFromPoint.latitude);
Shontauro
источник
1
Вариант 2 дает мне совершенно другой ответ, чем вариант 1. Может быть, потому что у меня прозрачная панель инструментов? Спасибо за совет!
Flyingkiwi, 04
3
так какой метод точен?
Абдулла Шоаиб
@shontauro Как сделать то же самое с html javascript? Любая идея
Анкеш Кумар Джайсансария
1
javascript понятия не имею.
shontauro
15

Вы можете использовать :

latlng=map.getProjection().getVisibleRegion().latLngBounds.getCenter();
AAP
источник
Получите точность с этим решением
VVB
6

чтобы получить центр карты, я использовал метод onMapReady () в действии, а затем использовал googleMap.setOnCameraChangeListener() method to get position of Came:

@Override
public void onMapReady(GoogleMap googMap) {
    googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
        @Override
        public void onCameraChange(CameraPosition cameraPosition) {

       Log.i("centerLat",cameraPosition.target.latitude);

       Log.i("centerLong",cameraPosition.target.longitude);

        }
    });
}
CommonSenseCode
источник
5

Если вы хотите получить позицию только один раз (например, после того, как пользователь перестал панорамировать карту), используйте setOnCameraIdleListener:

https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnCameraIdleListener

mMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() {
    @Override
    public void onCameraIdle() {
        LatLng position = mMap.getCameraPosition().target;
        Log.d("MapActivity", "Position: " + position);
    }
});

или используя лямбда Java 8:

mMap.setOnCameraIdleListener(() -> {
    LatLng position = mMap.getCameraPosition().target;
    Log.d("MapActivity", "Position: " + position);
});

Обратите внимание, что зарегистрированный слушатель setOnCameraChangeListenerвызывается много раз, и, как указано в документации :

Это может вызываться так часто, как один раз в каждом кадре, и не должно вызывать дорогостоящих операций.

Фридерблюмль
источник
3

лучший способ использовать cameraPosition

Ява:

LatLng centerMap = googleMap.getCameraPosition().target;

Котлин:

googleMap?.cameraPosition?.target?.let {
    // it is LatLng center
}
Расул Мири
источник