Google Street View обеспечивает панорамный 360-градусный вид с обозначенных дорог по всей зоне покрытия.
В этом видео показано, как вы можете использовать службу Просмотра улиц, чтобы дать пользователям реальный опыт работы с адресом на карте, предоставляя им содержательный контекст о пункте назначения или любом интересующем их месте.
Покрытие, доступное через Google Maps Android API v2, такое же, как и для приложения Google Maps на вашем устройстве Android. Вы можете узнать больше о просмотре улиц и увидеть поддерживаемые области на интерактивной карте в разделе О просмотре улиц .
Класс StreetViewPanorama
моделирует панораму Просмотра улиц в вашем приложении. В пользовательском интерфейсе панорама представлена объектом StreetViewPanoramaFragment
или StreetViewPanoramaView
.
Примеры кода
Репозиторий ApiDemos на GitHub содержит примеры, демонстрирующие использование просмотра улиц.
Образцы Java:
- StreetViewPanoramaBasicDemoActivity : основы использования просмотра улиц.
- StreetViewPanoramaEventsDemoActivity : прослушивание событий
- StreetViewPanoramaNavigationDemoActivity : программное управление панорамами просмотра улиц.
- StreetViewPanoramaOptionsDemoActivity : изменение параметров пользовательского интерфейса и жестов
- StreetViewPanoramaViewDemoActivity : Использование
StreetViewPanoramaView
(вместо фрагмента) - SplitStreetViewPanoramaAndMapDemoActivity : создание действия, отображающего вид улицы и карту.
Образцы Котлина:
- StreetViewPanoramaBasicDemoActivity : основы использования просмотра улиц.
- StreetViewPanoramaEventsDemoActivity : прослушивание событий
- StreetViewPanoramaNavigationDemoActivity : программное управление панорамами просмотра улиц.
- StreetViewPanoramaOptionsDemoActivity : изменение параметров пользовательского интерфейса и жестов
- StreetViewPanoramaViewDemoActivity : Использование
StreetViewPanoramaView
(вместо фрагмента) - SplitStreetViewPanoramaAndMapDemoActivity : использование действия, отображающего вид улицы и карту.
Обзор просмотра улиц в Maps SDK для Android
Maps SDK для Android предоставляет службу Street View для получения изображений, используемых в Google Street View, и управления ими. Изображения возвращаются в виде панорам.
Каждая панорама Просмотра улиц представляет собой изображение или набор изображений, обеспечивающих полный обзор на 360 градусов из одного места. Изображения соответствуют равнопрямоугольной проекции (Plate Carrée), которая содержит 360 градусов по горизонтали (полный охват) и 180 градусов по вертикали (от прямо вверх до прямо вниз). Результирующая 360-градусная панорама определяет проекцию на сферу с изображением, обернутым на двухмерную поверхность этой сферы.
StreetViewPanorama
предоставляет средство просмотра, отображающее панораму в виде сферы с камерой в центре. Вы можете манипулировать StreetViewPanoramaCamera
, чтобы управлять масштабированием и ориентацией (наклоном и азимутом) камеры.
Начать
Следуйте руководству по началу работы , чтобы настроить проект Maps SDK для Android. Затем добавьте панораму Просмотра улиц, как описано ниже.
В клиентской библиотеке SDK сервисов Google Play есть несколько примеров Просмотра улиц, которые вы можете импортировать в свой проект и использовать в качестве основы для разработки. Инструкции по импорту образцов см. во введении.
Используйте API
Следуйте приведенным ниже инструкциям, чтобы добавить панораму просмотра улиц во фрагмент Android. Это самый простой способ добавить Просмотр улиц в свое приложение. Тогда читайте больше о фрагментах, видах и настройке панорамы.
Добавьте панораму просмотра улиц
Выполните следующие действия, чтобы добавить панораму просмотра улиц, подобную этой:

В итоге:
- Добавьте объект Fragment в Activity , который будет обрабатывать панораму Street View. Самый простой способ сделать это — добавить элемент
<fragment>
в файл макета дляActivity
. - Реализуйте интерфейс
OnStreetViewPanoramaReadyCallback
и используйте метод обратного вызоваonStreetViewPanoramaReady(StreetViewPanorama)
, чтобы получить дескриптор объектаStreetViewPanorama
. - Вызовите
getStreetViewPanoramaAsync()
для фрагмента, чтобы зарегистрировать обратный вызов.
Ниже более подробно о каждом шаге.
Добавить фрагмент
Добавьте элемент <fragment>
в файл макета действия, чтобы определить объект Fragment . В этом элементе задайте для атрибута class
значение com.google.android.gms.maps.StreetViewPanoramaFragment
(или SupportStreetViewPanoramaFragment
).
Вот пример фрагмента в файле макета:
<fragment android:name="com.google.android.gms.maps.StreetViewPanoramaFragment" android:id="@+id/streetviewpanorama" android:layout_width="match_parent" android:layout_height="match_parent"/>
Добавить код просмотра улиц
Чтобы работать с панорамой Просмотра улиц в приложении, вам потребуется реализовать интерфейс OnStreetViewPanoramaReadyCallback
и установить экземпляр обратного вызова в объекте StreetViewPanoramaFragment
или StreetViewPanoramaView
. В этом руководстве используется StreetViewPanoramaFragment
, так как это самый простой способ добавить Просмотр улиц в ваше приложение. Первым шагом является реализация интерфейса обратного вызова:
Джава
class StreetViewActivity extends AppCompatActivity implements OnStreetViewPanoramaReadyCallback { // ... }
Котлин
class StreetViewActivity : AppCompatActivity(), OnStreetViewPanoramaReadyCallback { // ... }
В методе onCreate()
вашей Activity
установите файл макета в качестве представления содержимого. Например, если файл макета имеет имя main.xml
, используйте этот код:
Джава
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_street_view); SupportStreetViewPanoramaFragment streetViewPanoramaFragment = (SupportStreetViewPanoramaFragment) getSupportFragmentManager() .findFragmentById(R.id.street_view_panorama); streetViewPanoramaFragment.getStreetViewPanoramaAsync(this); }
Котлин
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_street_view) val streetViewPanoramaFragment = supportFragmentManager .findFragmentById(R.id.street_view_panorama) as SupportStreetViewPanoramaFragment streetViewPanoramaFragment.getStreetViewPanoramaAsync(this) }
Получите дескриптор фрагмента, вызвав FragmentManager.findFragmentById()
и передав ему идентификатор ресурса вашего элемента <fragment>
. Обратите внимание, что идентификатор ресурса R.id.streetviewpanorama
автоматически добавляется в проект Android при создании файла макета.
Затем используйте getStreetViewPanoramaAsync()
, чтобы установить обратный вызов для фрагмента.
Джава
SupportStreetViewPanoramaFragment streetViewPanoramaFragment = (SupportStreetViewPanoramaFragment) getSupportFragmentManager() .findFragmentById(R.id.street_view_panorama); streetViewPanoramaFragment.getStreetViewPanoramaAsync(this);
Котлин
val streetViewPanoramaFragment = supportFragmentManager .findFragmentById(R.id.street_view_panorama) as SupportStreetViewPanoramaFragment streetViewPanoramaFragment.getStreetViewPanoramaAsync(this)
Используйте метод обратного вызова onStreetViewPanoramaReady(StreetViewPanorama)
, чтобы получить ненулевой экземпляр StreetViewPanorama
, готовый к использованию.
Джава
@Override public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) { LatLng sanFrancisco = new LatLng(37.754130, -122.447129); streetViewPanorama.setPosition(sanFrancisco); }
Котлин
override fun onStreetViewPanoramaReady(streetViewPanorama: StreetViewPanorama) { val sanFrancisco = LatLng(37.754130, -122.447129) streetViewPanorama.setPosition(sanFrancisco) }
Подробнее о настройке начального состояния
В отличие от карты, исходное состояние панорамы Просмотра улиц невозможно настроить с помощью XML. Однако вы можете настроить панораму программно, передав объект StreetViewPanoramaOptions
, содержащий указанные вами параметры.
- Если вы используете
StreetViewPanoramaFragment
, используйте метод статической фабрикиStreetViewPanoramaFragment.newInstance(StreetViewPanoramaOptions options)
для создания фрагмента и передачи настроенных вами параметров. - Если вы используете
StreetViewPanoramaView
, используйте конструкторStreetViewPanoramaView(Context, StreetViewPanoramaOptions)
и передайте настроенные вами параметры.
Джава
LatLng sanFrancisco = new LatLng(37.754130, -122.447129); StreetViewPanoramaView view = new StreetViewPanoramaView(this, new StreetViewPanoramaOptions().position(sanFrancisco));
Котлин
val sanFrancisco = LatLng(37.754130, -122.447129) val view = StreetViewPanoramaView( this, StreetViewPanoramaOptions().position(sanFrancisco) )
Подробнее о StreetViewPanoramaFragment
StreetViewPanoramaFragment
является подклассом класса Android Fragment и позволяет размещать панораму просмотра улиц во фрагменте Android. Объекты StreetViewPanoramaFragment
действуют как контейнеры для панорамы и обеспечивают доступ к объекту StreetViewPanorama
.
StreetViewПанорамаView
StreetViewPanoramaView
, подкласс класса Android View
, позволяет размещать панораму Street View в Android View
. View
представляет собой прямоугольную область экрана и является основным строительным блоком для приложений и виджетов Android. Как и StreetViewPanoramaFragment
, StreetViewPanoramaView
выступает в качестве контейнера для панорамы, предоставляя основные функции через объект StreetViewPanorama
. Пользователи этого класса должны переадресовывать все методы жизненного цикла активности (такие как onCreate()
, onDestroy()
, onResume()
и onPause())
соответствующим методам в классе StreetViewPanoramaView
.
Настройте управляемую пользователем функциональность
По умолчанию пользователю доступны следующие функции при просмотре панорамы Просмотра улиц: панорамирование, масштабирование и переход к соседним панорамам. Вы можете включать и отключать жесты, управляемые пользователем, с помощью методов StreetViewPanorama
. Программные изменения по-прежнему возможны, когда жест отключен.
Установить местоположение панорамы
Чтобы установить местоположение панорамы Street View, вызовите StreetViewPanorama.setPosition()
, передав LatLng
. Вы также можете передать radius
и source
в качестве необязательных параметров.
Радиус полезен, если вы хотите расширить или сузить область, в которой Просмотр улиц будет искать подходящую панораму. Радиус 0 означает, что панорама должна быть связана именно с указанным LatLng
. Радиус по умолчанию составляет 50 метров. Если в совпадающей области находится более одной панорамы, API вернет наилучшее совпадение.
Источник полезен, если вы хотите ограничить Просмотр улиц, чтобы искать только панорамы, которые находятся на открытом воздухе. По умолчанию панорамы Street View могут быть внутри таких мест, как музеи, общественные здания, кафе и предприятия. Обратите внимание, что наружные панорамы могут не существовать для указанного местоположения.
Джава
LatLng sanFrancisco = new LatLng(37.754130, -122.447129); // Set position with LatLng only. streetViewPanorama.setPosition(sanFrancisco); // Set position with LatLng and radius. streetViewPanorama.setPosition(sanFrancisco, 20); // Set position with LatLng and source. streetViewPanorama.setPosition(sanFrancisco, StreetViewSource.OUTDOOR); // Set position with LaLng, radius and source. streetViewPanorama.setPosition(sanFrancisco, 20, StreetViewSource.OUTDOOR);
Котлин
val sanFrancisco = LatLng(37.754130, -122.447129) // Set position with LatLng only. streetViewPanorama.setPosition(sanFrancisco) // Set position with LatLng and radius. streetViewPanorama.setPosition(sanFrancisco, 20) // Set position with LatLng and source. streetViewPanorama.setPosition(sanFrancisco, StreetViewSource.OUTDOOR) // Set position with LaLng, radius and source. streetViewPanorama.setPosition(sanFrancisco, 20, StreetViewSource.OUTDOOR)
Кроме того, вы можете установить местоположение на основе идентификатора панорамы, передав panoId
в StreetViewPanorama.setPosition()
.
Чтобы получить идентификатор панорамы для соседних панорам, сначала используйте getLocation()
для получения StreetViewPanoramaLocation
. Этот объект содержит идентификатор текущей панорамы и массив объектов StreetViewPanoramaLink
, каждый из которых содержит идентификатор панорамы, связанной с текущей.
Джава
StreetViewPanoramaLocation location = streetViewPanorama.getLocation(); if (location != null && location.links != null) { streetViewPanorama.setPosition(location.links[0].panoId); }
Котлин
streetViewPanorama.location.links.firstOrNull()?.let { link: StreetViewPanoramaLink -> streetViewPanorama.setPosition(link.panoId) }
Увеличение и уменьшение масштаба
Вы можете изменить уровень масштабирования программно, установив StreetViewPanoramaCamera.zoom
. Установка масштаба на 1,0 увеличит изображение в 2 раза.
В следующем фрагменте используется StreetViewPanoramaCamera.Builder()
для создания новой камеры с наклоном и азимутом существующей камеры при увеличении масштаба на пятьдесят процентов.
Джава
float zoomBy = 0.5f; StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.getPanoramaCamera().zoom + zoomBy) .tilt(streetViewPanorama.getPanoramaCamera().tilt) .bearing(streetViewPanorama.getPanoramaCamera().bearing) .build();
Котлин
val zoomBy = 0.5f val camera = StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.panoramaCamera.zoom + zoomBy) .tilt(streetViewPanorama.panoramaCamera.tilt) .bearing(streetViewPanorama.panoramaCamera.bearing) .build()
Установите ориентацию камеры (точку зрения)
Вы можете определить ориентацию камеры просмотра улиц, установив азимут и наклон на StreetViewPanoramaCamera
.
- несущий
- Направление, в котором указывает камера, указанное в градусах по часовой стрелке от истинного севера вокруг геометрического места камеры. Истинный север — 0, восток — 90, юг — 180, запад — 270.
- наклон
- Ось Y наклоняется вверх или вниз. Диапазон составляет от -90 до 0 и 90, где -90 смотрит прямо вниз, 0 по центру горизонта и 90 смотрит прямо вверх. Дисперсия измеряется от исходного шага камеры по умолчанию, который часто (но не всегда) является плоским по горизонтали. Например, изображение, снятое на холме, вероятно, будет иметь не горизонтальный шаг по умолчанию.
В следующем фрагменте используется StreetViewPanoramaCamera.Builder()
для создания новой камеры с масштабированием и наклоном существующей камеры с изменением азимута на 30 градусов влево.
Джава
float panBy = 30; StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.getPanoramaCamera().zoom) .tilt(streetViewPanorama.getPanoramaCamera().tilt) .bearing(streetViewPanorama.getPanoramaCamera().bearing - panBy) .build();
Котлин
val panBy = 30f val camera = StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.panoramaCamera.zoom) .tilt(streetViewPanorama.panoramaCamera.tilt) .bearing(streetViewPanorama.panoramaCamera.bearing - panBy) .build()
Следующий фрагмент наклоняет камеру вверх на 30 градусов.
Джава
float tilt = streetViewPanorama.getPanoramaCamera().tilt + 30; tilt = (tilt > 90) ? 90 : tilt; StreetViewPanoramaCamera previous = streetViewPanorama.getPanoramaCamera(); StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder(previous) .tilt(tilt) .build();
Котлин
var tilt = streetViewPanorama.panoramaCamera.tilt + 30 tilt = if (tilt > 90) 90f else tilt val previous = streetViewPanorama.panoramaCamera val camera = StreetViewPanoramaCamera.Builder(previous) .tilt(tilt) .build()
Анимируйте движения камеры
Чтобы анимировать движения камеры, вызовите StreetViewPanorama.animateTo()
. Анимация интерполирует текущие атрибуты камеры и новые атрибуты камеры. Если вы хотите перейти прямо к камере без анимации, вы можете установить продолжительность на 0.
Джава
// Keeping the zoom and tilt. Animate bearing by 60 degrees in 1000 milliseconds. long duration = 1000; StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.getPanoramaCamera().zoom) .tilt(streetViewPanorama.getPanoramaCamera().tilt) .bearing(streetViewPanorama.getPanoramaCamera().bearing - 60) .build(); streetViewPanorama.animateTo(camera, duration);
Котлин
// Keeping the zoom and tilt. Animate bearing by 60 degrees in 1000 milliseconds. val duration: Long = 1000 val camera = StreetViewPanoramaCamera.Builder() .zoom(streetViewPanorama.panoramaCamera.zoom) .tilt(streetViewPanorama.panoramaCamera.tilt) .bearing(streetViewPanorama.panoramaCamera.bearing - 60) .build() streetViewPanorama.animateTo(camera, duration)
На следующем изображении показан результат, когда вы запланировали выполнение вышеуказанной анимации каждые 2000 миллисекунд с помощью Handler.postDelayed()
:
