Google Maps v2 центрирует и поворачивает положение камеры в соответствии с двумя маркерами

Я боюсь, как сделать движение с камерой, чтобы соответствовать моим двум маркерам и держать их на одном уровне. Таким образом, это подразумевает изменение масштабирования для их соответствия и поворот камеры для соответствия маркерам на одной линии.

Следующие два фото уточнят мой вопрос:

Текущее состояниеЖелаемое состояние

Итак, что я сделал до сих пор, так это:

public void centerIncidentRouteOnMap(List<LatLng> copiedPoints) { double minLat = Integer.MAX_VALUE; double maxLat = Integer.MIN_VALUE; double minLon = Integer.MAX_VALUE; double maxLon = Integer.MIN_VALUE; for (LatLng point : copiedPoints) { maxLat = Math.max(point.latitude, maxLat); minLat = Math.min(point.latitude, minLat); maxLon = Math.max(point.longitude, maxLon); minLon = Math.min(point.longitude, minLon); } final LatLngBounds bounds = new LatLngBounds.Builder().include(new LatLng(maxLat, maxLon)).include(new LatLng(minLat, minLon)).build(); mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 120)); } 

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

Может ли кто-нибудь помочь мне в этом?

Благодаря!

В – почти – псевдокод, попробуйте что-то вроде этого:

 CameraPosition cameraPosition = new CameraPosition.Builder() .target(Your_target) // Sets the center of the map .zoom(YourZoom) // Sets the zoom .bearing(Your_Angle) // -90 = west, 90 = east .tilt(Some_Tilt) map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 

Чтобы получить угол:

 float xDiff = x2 - x1; float yDiff = y2 - y1; return Math.Atan2(yDiff, xDiff) * 180.0 / Math.PI; 

Я не уверен, насколько я прав, но я просто делюсь своей идеей.

  1. Найдите среднюю точку (долгота широты) двух маркеров

     private LatLng midPoint(double lat1, double long1, double lat2,double long2) { return new LatLng((lat1+lat2)/2, (long1+long2)/2); } 
  2. Вычислите угол между средней точкой и любой другой позицией маркера.

     private double angleBteweenCoordinate(double lat1, double long1, double lat2, double long2) { double dLon = (long2 - long1); double y = Math.sin(dLon) * Math.cos(lat2); double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon); double brng = Math.atan2(y, x); brng = Math.toDegrees(brng); brng = (brng + 360) % 360; brng = 360 - brng; return brng; } 
  3. Поверните карту под этим углом.

    CameraPosition cameraPosition = new CameraPosition.Builder (). Target (midPoint (lat1, lng1, lat2, lng2)). Zoom (14) .bearing (angleBteweenCoordinate (lat1, lng1, lat2, lng2)). Build ();

    mMap.animateCamera (CameraUpdateFactory.newCameraPosition (cameraPosition));

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

Intereting Posts
Android удаляет панель действий приложения Как отключить вертикальную прокрутку webview для загрузки всей страницы в виде другого столбца Java.lang.RuntimeException: не удается запустить Activity ComponentInfo {…}: java.lang.NullPointerException Пользовательский TaskStack завершает родительскую активность из уведомления Редактирование текста Android скрыто при отображении виртуальной клавиатуры и задействован SurfaceView JQuery – разрешить клавиатуру Autoshow на мобильных устройствах JsonHttpParser устарел Как отключить lint abortOnError в Android Gradle Plugin из верхнего уровня многостраничной директории Buildozer не может скомпилировать Cython Обновление / изменение кэшированного растрового изображения с использованием Picasso и OkHttp AccountManager без адаптера синхронизации? Переходы общих элементов не работают в сочетании с координаторомLayout и CollapsingToolbarLayout Как я могу изменить поведение режима самолета Android, чтобы он не отключил сотовую радиостанцию? Получите высоту виртуальной клавиатуры в Android Android: <поддержка-экраны> Тег