Street View

O Google Street View oferece vistas panorâmicas de 360 graus de vias designadas em toda a área de cobertura.

Este vídeo mostra como usar o serviço Street View para exibir aos usuários uma visão realista de um endereço no mapa, oferecendo um contexto importante sobre o destino deles ou qualquer outro lugar em que tenham interesse.

A cobertura disponível pela API Google Maps Android v2 é a mesma oferecida no app Google Maps no seu dispositivo Android. Leia mais sobre o Street View e veja as áreas compatíveis em um mapa interativo. Acesse Sobre o Street View.

A classe StreetViewPanorama modela o panorama do Street View no seu aplicativo. Na IU, os panoramas são representados por objetos StreetViewPanoramaFragment ou StreetViewPanoramaView.

Exemplos de código

O repositório ApiDemos no GitHub inclui exemplos de uso do Street View.

Exemplos Java:

Exemplos de Kotlin:

Visão geral do Street View no SDK do Maps para Android

O SDK do Maps para Android oferece um serviço do Street View para recuperar e manipular imagens usadas no Google Street View. As imagens retornam como panoramas.

Cada panorama do Street View é uma imagem ou um conjunto de imagens que oferece uma visualização completa em 360 graus de um único local. As imagens estão de acordo com a projeção equidistante (Plate Carrée), que contém 360 graus de visualização horizontal (uma volta completa ao redor de um ponto) e 180 graus de visualização vertical (do ponto mais alto ao mais baixo). O panorama de 360 graus resultante define uma projeção em uma esfera com a imagem ajustada à superfície bidimensional dessa esfera.

StreetViewPanorama fornece um visualizador que renderiza o panorama como uma esfera e com uma câmera no centro. É possível manipular o StreetViewPanoramaCamera para controlar o zoom e a orientação (inclinação e orientação) da câmera.

Primeiros passos

Siga o guia de primeiros passos para configurar um projeto do SDK do Maps para Android. Depois, adicione um panorama do Street View, conforme descrito abaixo.

A biblioteca de cliente do SDK do Google Play Services inclui alguns exemplos do Street View que podem ser importados para o projeto e usados como base do desenvolvimento. Consulte a introdução para ver orientações sobre como fazer essa importação.

Usar a API

Siga as instruções abaixo para adicionar um panorama do Street View a um fragmento do Android. Essa é a maneira mais simples de incluir o Street View no aplicativo. Depois, leia mais sobre os fragmentos, as visualizações e a personalização do panorama.

Adicionar um panorama do Street View

Siga as etapas abaixo para adicionar um panorama do Street View, como este:

Demonstração do panorama do Street View

Resumindo:

  1. Adicione um objeto Fragment à Activity que lidará com o panorama do Street View. A maneira mais fácil de fazer isso é incluir um elemento <fragment> no arquivo de layout da Activity.
  2. Implemente a interface OnStreetViewPanoramaReadyCallback e use o método de callback onStreetViewPanoramaReady(StreetViewPanorama) se quiser um identificador para o objeto StreetViewPanorama.
  3. Chame getStreetViewPanoramaAsync() no fragmento para registrar o callback.

Veja a seguir mais detalhes sobre cada etapa.

Adicionar um fragmento

Inclua um elemento <fragment> no arquivo de layout da atividade para configurar um objeto Fragment. Nesse elemento, defina o atributo class como com.google.android.gms.maps.StreetViewPanoramaFragment (ou SupportStreetViewPanoramaFragment).

Veja um exemplo de um fragmento em um arquivo de layout:

<fragment
    android:name="com.google.android.gms.maps.StreetViewPanoramaFragment"
    android:id="@+id/streetviewpanorama"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

Adicionar o código do Street View

Para trabalhar com o panorama do Street View dentro do seu app, é necessário implementar a interface OnStreetViewPanoramaReadyCallback e definir uma instância do callback em um objeto StreetViewPanoramaFragment ou StreetViewPanoramaView. Este tutorial usa um StreetViewPanoramaFragment, porque essa é a maneira mais simples de adicionar o Street View ao app. A primeira etapa é implementar a interface de callback:

Java

class StreetViewActivity extends AppCompatActivity implements OnStreetViewPanoramaReadyCallback {
    // ...
}
      

Kotlin

internal class StreetViewActivity : AppCompatActivity(), OnStreetViewPanoramaReadyCallback {
    // ...
        // ...
    }

    override fun onStreetViewPanoramaReady(streetViewPanorama: StreetViewPanorama) {
        val sanFrancisco = LatLng(37.754130, -122.447129)
        streetViewPanorama.setPosition(sanFrancisco)
    }

    private fun newView() {
        val sanFrancisco = LatLng(37.754130, -122.447129)
        val view = StreetViewPanoramaView(
            this,
            StreetViewPanoramaOptions().position(sanFrancisco)
        )
    }

    private fun setLocationOfThePanorama(streetViewPanorama: StreetViewPanorama) {
        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)

        streetViewPanorama.location.links.firstOrNull()?.let { link: StreetViewPanoramaLink ->
            streetViewPanorama.setPosition(link.panoId)
        }
    }

    private fun zoom(streetViewPanorama: StreetViewPanorama) {
        val zoomBy = 0.5f
        val camera = StreetViewPanoramaCamera.Builder()
            .zoom(streetViewPanorama.panoramaCamera.zoom + zoomBy)
            .tilt(streetViewPanorama.panoramaCamera.tilt)
            .bearing(streetViewPanorama.panoramaCamera.bearing)
            .build()
    }

    private fun pan(streetViewPanorama: StreetViewPanorama) {
        val panBy = 30f
        val camera = StreetViewPanoramaCamera.Builder()
            .zoom(streetViewPanorama.panoramaCamera.zoom)
            .tilt(streetViewPanorama.panoramaCamera.tilt)
            .bearing(streetViewPanorama.panoramaCamera.bearing - panBy)
            .build()
    }

    private fun tilt(streetViewPanorama: StreetViewPanorama) {
        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()
    }

    private fun animate(streetViewPanorama: StreetViewPanorama) {
        // 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)
    }
}
      

No método onCreate() da Activity, defina o arquivo de layout como a visualização de conteúdo. Por exemplo, se o arquivo tiver o nome main.xml, use este código:

Java

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

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_street_view)
    // ...
}
      

Receba um identificador para o fragmento ao chamar FragmentManager.findFragmentById() e transmitir o ID do recurso do seu elemento <fragment>. O ID R.id.streetviewpanorama é adicionado automaticamente ao projeto Android quando você cria o arquivo de layout.

Depois, use getStreetViewPanoramaAsync() para definir o callback no fragmento.

Java

SupportStreetViewPanoramaFragment streetViewPanoramaFragment =
    (SupportStreetViewPanoramaFragment) getSupportFragmentManager()
        .findFragmentById(R.id.street_view_panorama);
streetViewPanoramaFragment.getStreetViewPanoramaAsync(this);
      

Kotlin

val streetViewPanoramaFragment =
    supportFragmentManager
        .findFragmentById(R.id.street_view_panorama) as SupportStreetViewPanoramaFragment
streetViewPanoramaFragment.getStreetViewPanoramaAsync(this)
      

Use o método de callback onStreetViewPanoramaReady(StreetViewPanorama) para recuperar uma instância não nula de StreetViewPanorama pronta para ser usada.

Java

@Override
public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) {
    LatLng sanFrancisco = new LatLng(37.754130, -122.447129);
    streetViewPanorama.setPosition(sanFrancisco);
}
      

Kotlin

override fun onStreetViewPanoramaReady(streetViewPanorama: StreetViewPanorama) {
    val sanFrancisco = LatLng(37.754130, -122.447129)
    streetViewPanorama.setPosition(sanFrancisco)
}
      

Mais informações sobre a configuração do estado inicial

Diferentemente dos mapas, não é possível configurar o estado inicial do panorama do Street View via XML. No entanto, você pode definir um panorama programaticamente transmitindo um objeto StreetViewPanoramaOptions com as opções especificadas.

Java

LatLng sanFrancisco = new LatLng(37.754130, -122.447129);
StreetViewPanoramaView view = new StreetViewPanoramaView(this,
    new StreetViewPanoramaOptions().position(sanFrancisco));
      

Kotlin

val sanFrancisco = LatLng(37.754130, -122.447129)
val view = StreetViewPanoramaView(
    this,
    StreetViewPanoramaOptions().position(sanFrancisco)
)
      

Mais informações sobre o StreetViewPanoramaFragment

O StreetViewPanoramaFragment é uma subclasse da classe Fragment do Android e permite incluir um panorama do Street View em um fragmento do Android. Os objetos StreetViewPanoramaFragment atuam como contêineres do panorama e permitem acesso ao objeto StreetViewPanorama.

StreetViewPanoramaView

A StreetViewPanoramaView, uma subclasse da classe View do Android, permite incluir um panorama do Street View em uma View do Android. Uma View representa uma região retangular da tela e é fundamental para os apps e widgets desse sistema operacional. Assim como um StreetViewPanoramaFragment, a StreetViewPanoramaView atua como um contêiner do panorama, expondo a funcionalidade principal por meio do objeto StreetViewPanorama. Os usuários dessa classe precisam encaminhar todos os métodos de ciclo de vida da atividade, como onCreate(), onDestroy(), onResume() e onPause()), aos métodos correspondentes na classe StreetViewPanoramaView.

Personalizar a funcionalidade controlada pelo usuário

Por padrão, as funcionalidades a seguir estão disponíveis para o usuário durante a visualização do panorama do Street View: deslocamento, alteração de zoom e acesso a panoramas adjacentes. É possível ativar e desativar os gestos controlados pelo usuário usando os métodos no StreetViewPanorama e fazer mudanças programáticas quando o gesto estiver desativado.

Definir o local do panorama

Para definir o local do panorama do Street View, chame StreetViewPanorama.setPosition(), enviando um LatLng. Também é possível transmitir radius e source como parâmetros opcionais.

Use um raio para ampliar ou restringir a área em que o Street View pesquisa um panorama correspondente. Um raio 0 significa que o panorama precisa estar vinculado exatamente ao LatLng especificado. O valor padrão é de 50 metros. Se houver mais de um panorama na área correspondente, a API retornará a melhor correspondência.

Use uma origem para restringir o Street View de forma a procurar apenas panoramas ao ar livre. Por padrão, os panoramas do Street View podem estar em lugares como museus, edifícios públicos, cafés e empresas, e pode ser que não existam panoramas externos para o local especificado.

Java

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

Kotlin

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)
      

Como alternativa, você pode definir o local com base em um ID de panorama, transmitindo um panoId a StreetViewPanorama.setPosition().

Para recuperar o ID de panoramas adjacentes, use primeiro getLocation() para recuperar um StreetViewPanoramaLocation. Esse objeto contém o ID do panorama atual e uma matriz de objetos StreetViewPanoramaLink, cada um com o ID de um panorama conectado ao atual.

Java

StreetViewPanoramaLocation location = streetViewPanorama.getLocation();
if (location != null && location.links != null) {
    streetViewPanorama.setPosition(location.links[0].panoId);
}
      

Kotlin

streetViewPanorama.location.links.firstOrNull()?.let { link: StreetViewPanoramaLink ->
    streetViewPanorama.setPosition(link.panoId)
}
      

Aumentar e diminuir o zoom

Para alterar o nível de zoom de maneira programática, defina o StreetViewPanoramaCamera.zoom. Ajustar como 1.0 aumenta a imagem em um fator de 2.

O snippet a seguir usa o StreetViewPanoramaCamera.Builder() para gerar uma nova câmera com a inclinação e o rumo existente, aumentando o zoom em 50%.

Java

float zoomBy = 0.5f;
StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder()
    .zoom(streetViewPanorama.getPanoramaCamera().zoom + zoomBy)
    .tilt(streetViewPanorama.getPanoramaCamera().tilt)
    .bearing(streetViewPanorama.getPanoramaCamera().bearing)
    .build();
      

Kotlin

val zoomBy = 0.5f
val camera = StreetViewPanoramaCamera.Builder()
    .zoom(streetViewPanorama.panoramaCamera.zoom + zoomBy)
    .tilt(streetViewPanorama.panoramaCamera.tilt)
    .bearing(streetViewPanorama.panoramaCamera.bearing)
    .build()
      

Definir a orientação da câmera (ponto de vista)

É possível determinar a orientação da câmera do Street View, definindo o rumo e inclinando a StreetViewPanoramaCamera.

bearing
é a direção em que câmera aponta, especificada em graus no sentido horário a partir do norte verdadeiro, ao redor do lobo da câmera. O norte verdadeiro é 0, o leste é 90, o sul é 180 e o oeste é 270.
tilt
é a inclinação para cima ou para baixo do eixo Y. O intervalo é de -90 a 0 até 90, sendo -90 olhando para baixo, 0 centralizado no horizonte e 90 apontando para cima. A variação é medida a partir da inclinação inicial padrão da câmera, que é, geralmente, mas nem sempre, horizontal. Por exemplo, uma imagem capturada em uma colina provavelmente terá um valor padrão de inclinação não horizontal.

O snippet a seguir usa o StreetViewPanoramaCamera.Builder() para gerar uma nova câmera com o zoom e a inclinação da câmera existente, alterando o rumo em 30 graus para a esquerda.

Java

float panBy = 30;
StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder()
    .zoom(streetViewPanorama.getPanoramaCamera().zoom)
    .tilt(streetViewPanorama.getPanoramaCamera().tilt)
    .bearing(streetViewPanorama.getPanoramaCamera().bearing - panBy)
    .build();
      

Kotlin

val panBy = 30f
val camera = StreetViewPanoramaCamera.Builder()
    .zoom(streetViewPanorama.panoramaCamera.zoom)
    .tilt(streetViewPanorama.panoramaCamera.tilt)
    .bearing(streetViewPanorama.panoramaCamera.bearing - panBy)
    .build()
      

O fragmento a seguir inclina a câmera 30 graus para cima.

Java

float tilt = streetViewPanorama.getPanoramaCamera().tilt + 30;
tilt = (tilt > 90) ? 90 : tilt;

StreetViewPanoramaCamera previous = streetViewPanorama.getPanoramaCamera();

StreetViewPanoramaCamera camera = new StreetViewPanoramaCamera.Builder(previous)
    .tilt(tilt)
    .build();
      

Kotlin

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

Animar os movimentos da câmera

Para animar os movimentos da câmera, chame StreetViewPanorama.animateTo(). A animação alterna entre os atributos atuais da câmera e os novos. Se você quiser pular diretamente para a câmera, sem animação, defina a duração como 0.

Java

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

Kotlin

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

A imagem a seguir representa o resultado quando você programa a animação acima para ser executada a cada 2.000 milissegundos, usando Handler.postDelayed():

Demonstração de animação do panorama do Street View