Page Summary
-
Google Street View API provides 360° panoramas and lets you integrate Street View into your applications.
-
You can customize Street View by controlling the display, location, point-of-view, and user interactions.
-
Overlays, such as markers and info windows, can be added to Street View panoramas to highlight specific points of interest.
-
The API enables accessing Street View data programmatically and creating custom panoramas for unique locations.
-
Custom panoramas can be seamlessly integrated with existing Google Street View imagery, enhancing the user experience.
Overview
Google Street View provides panoramic 360 degree views from
designated roads throughout its coverage area. Street View's API
coverage is the same as that for the Google Maps application
(https://maps.google.com/). The list of currently
supported cities for Street View is available at the
Google
Maps website.
A sample Street View image is shown below.
The Maps JavaScript API provides a Street View service for obtaining and manipulating the imagery used in Google Maps Street View. This Street View service is supported natively within the browser.
Street View Map Usage
Although Street View can be used within a
standalone DOM element, it is most
useful when indicating a location on a map. By default, Street View is
enabled on a map, and a Street View Pegman control appears
integrated within the navigation (zoom and pan) controls. You may hide this
control within the map's MapOptions by setting
streetViewControl to false. You may also change
the default position of the Street View control by
setting the Map's streetViewControlOptions.position
property to a new ControlPosition.
The Street View Pegman control allows you to view Street View panoramas directly within the map. When the user clicks and holds the Pegman, the map updates to show blue outlines around Street View-enabled streets, offering a user experience similar to the Google Maps app.
When the user drops the Pegman marker onto a street, the map updates to display a Street View panorama of the indicated location.
Street View Panoramas
Street View images are supported through use of the
StreetViewPanorama object, which provides an API
interface to a Street View "viewer." Each map contains a default
Street View panorama, which you can retrieve by calling the
map's getStreetView() method. When you add a Street View
control to the map by setting its streetViewControl
option to true, you automatically connect the Pegman
control to this default Street View panorama.
You may also create your own StreetViewPanorama
object and set the map to use that instead of the default, by
setting the map's streetView property explicitly to
that constructed object. You may wish to override the default panorama
if you want to modify default behavior, such as the automatic
sharing of overlays between the map and the panorama. (See
Overlays within Street View below.)
Street View Containers
You may instead wish to display a StreetViewPanorama
within a separate DOM element, often a <div> element.
Simply pass the DOM element within the StreetViewPanorama's
constructor. For optimum display of images, we recommend a minimum size of
200 pixels by 200 pixels.
Note: Although Street View functionality is designed to be used in conjunction with a map, this usage is not required. You may use a standalone Street View object without a map.
Street View Locations and Point-of-View (POV)
The StreetViewPanorama constructor also allows you to
set the Street View location and point of view using the
StreetViewOptions parameter. You may call
setPosition() and setPov() on the object after
construction to change its location and POV.
The Street View location defines the placement of the camera focus
for an image, but it does not define the orientation of the camera
for that image. For that purpose, the StreetViewPov object
defines two properties:
heading(default0) defines the rotation angle around the camera locus in degrees relative from true north. Headings are measured clockwise (90 degrees is true east).pitch(default0) defines the angle variance "up" or "down" from the camera's initial default pitch, which is often (but not always) flat horizontal. (For example, an image taken on a hill will likely exhibit a default pitch that is not horizontal.) Pitch angles are measured with positive values looking up (to +90 degrees straight up and orthogonal to the default pitch) and negative values looking down (to -90 degrees straight down and orthogonal to the default pitch).
The StreetViewPov object is most often used to determine the
point of view of the Street View camera. You can also determine the
point-of-view of the photographer — typically the direction the
car
or trike was facing — with the
StreetViewPanorama.getPhotographerPov() method.
The following code displays a map of Boston with an initial view of Fenway Park. Selecting the Pegman and dragging it to a supported location on the map will change the Street View panorama:
TypeScript
function initialize() { const fenway = { lat: 42.345573, lng: -71.098326 }; const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { center: fenway, zoom: 14, } ); const panorama = new google.maps.StreetViewPanorama( document.getElementById("pano") as HTMLElement, { position: fenway, pov: { heading: 34, pitch: 10, }, } ); map.setStreetView(panorama); } declare global { interface Window { initialize: () => void; } } window.initialize = initialize;
JavaScript
function initialize() { const fenway = { lat: 42.345573, lng: -71.098326 }; const map = new google.maps.Map(document.getElementById("map"), { center: fenway, zoom: 14, }); const panorama = new google.maps.StreetViewPanorama( document.getElementById("pano"), { position: fenway, pov: { heading: 34, pitch: 10, }, }, ); map.setStreetView(panorama); } window.initialize = initialize;
CSS
html, body { height: 100%; margin: 0; padding: 0; } #map, #pano { float: left; height: 100%; width: 50%; }
HTML
<html>
<head>
<title>Street View split-map-panes</title>
<link rel="stylesheet" type="text/css" href="./style.css" />
<script type="module" src="./index.js"></script>
</head>
<body>
<div id="map"></div>
<div id="pano"></div>
<!--
The `defer` attribute causes the script to execute after the full HTML
document has been parsed. For non-blocking uses, avoiding race conditions,
and consistent behavior across browsers, consider loading using Promises. See
https://developers.google.com/maps/documentation/javascript/load-maps-js-api
for more information.
-->
<script
src="https://maps.googleapis.com/maps/api/js?key=AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg&callback=initialize&v=weekly"
defer
></script>
</body>
</html>Motion tracking on mobile devices
On devices that support device orientation events, the API offers users the ability to change the Street View point of view based on the movement of the device. Users can look around by moving their devices. This is called motion tracking or device rotation tracking.
As app developer, you can change the default behavior as follows:
- Enable or disable the motion tracking functionality. By default, motion
tracking is enabled on any device that supports it. The following sample
disables motion tracking, but leaves the motion tracking control visible.
(Note that the user can turn on motion tracking by tapping the control.)
var panorama = new google.maps.StreetViewPanorama( document.getElementById('pano'), { position: {lat: 37.869260, lng: -122.254811}, pov: {heading: 165, pitch: 0}, motionTracking: false });
-
Hide or show the motion tracking control. By default, the control is shown on devices that support motion tracking. The user can tap the control to turn motion tracking on or off. Note that the control will never appear if the device doesn't support motion tracking, regardless of the value of
motionTrackingControl.The following sample disables both motion tracking and the motion tracking control. In this case, the user can't turn motion tracking on:
var panorama = new google.maps.StreetViewPanorama( document.getElementById('pano'), { position: {lat: 37.869260, lng: -122.254811}, pov: {heading: 165, pitch: 0}, motionTracking: false, motionTrackingControl: false });
- Change the default position of the motion tracking control. By default,
the control appears near the bottom right of the panorama (position
RIGHT_BOTTOM). The following sample sets the position of the control to left bottom:var panorama = new google.maps.StreetViewPanorama( document.getElementById('pano'), { position: {lat: 37.869260, lng: -122.254811}, pov: {heading: 165, pitch: 0}, motionTrackingControlOptions: { position: google.maps.ControlPosition.LEFT_BOTTOM } });
To see motion tracking in action, view the following sample on a mobile device (or any device that supports device orientation events):
Overlays within Street View
The default StreetViewPanorama object supports the native
display of map
overlays.
Overlays generally appear at "street level" anchored at LatLng
positions. (Markers will appear with their tails anchored to the location's
horizontal plane within the Street View panorama for example.)
Currently, the types of overlays which are supported on Street View
panoramas are limited to Markers, InfoWindows and
custom OverlayViews. Overlays which you display on a map may be
displayed on a Street View panorama by treating the panorama as a substitute
for the Map object, calling setMap() and passing
the StreetViewPanorama as an argument instead of a map. Info
windows similarly may be opened within a Street View panorama by calling
open(), passing the StreetViewPanorama() instead of
a map.
Additionally, when creating a map with a default
StreetViewPanorama, any markers created on a map are shared
automatically with the map's associated Street View panorama, provided that
panorama is visible. To retrieve the default Street View panorama, call
getStreetView() on the Map object. Note that if you
explicitly set the map's streetView property to a
StreetViewPanorama of your own construction, you will override
the default panorama.
The following example shows markers denoting various locations around
Astor Place, New York City. Toggle the display to Street View to show the
shared markers displaying within the StreetViewPanorama.
TypeScript
let panorama: google.maps.StreetViewPanorama; let innerMap: google.maps.Map; async function init() { // Request needed libraries. const [{ Marker }] = await Promise.all([ google.maps.importLibrary('marker'), google.maps.importLibrary('maps'), ]); // Set the location of Astor Place. const astorPlace = { lat: 40.729884, lng: -73.990988 }; const mapElement = document.querySelector('gmp-map')!; innerMap = mapElement.innerMap; document .getElementById('streetview-toggle-button')! .addEventListener('click', toggleStreetView); const cafeIcon = document.createElement('img'); cafeIcon.src = new URL('./public/cafe_icon.svg', import.meta.url).href; const dollarIcon = document.createElement('img'); dollarIcon.src = new URL('./public/bank_icon.svg', import.meta.url).href; const busIcon = document.createElement('img'); busIcon.src = new URL('./public/bus_icon.svg', import.meta.url).href; // Set up the markers on the map new Marker({ position: { lat: 40.730031, lng: -73.991428 }, map: innerMap, title: 'Cafe', icon: cafeIcon.src, }); new Marker({ position: { lat: 40.729681, lng: -73.991138 }, map: innerMap, title: 'Bank', icon: dollarIcon.src, }); new Marker({ position: { lat: 40.729559, lng: -73.990741 }, map: innerMap, title: 'Bus Stop', icon: busIcon.src, }); // We get the map's default panorama and set up some defaults. // Note that we don't yet set it visible. panorama = innerMap.getStreetView()!; // TODO fix type panorama.setPosition(astorPlace); panorama.setPov({ heading: 265, pitch: 0, }); } function toggleStreetView(): void { const toggle = panorama.getVisible(); if (!toggle) { panorama.setVisible(true); } else { panorama.setVisible(false); } } void init();
JavaScript
let panorama; let innerMap; async function init() { // Request needed libraries. const [{ Marker }] = await Promise.all([ google.maps.importLibrary('marker'), google.maps.importLibrary('maps'), ]); // Set the location of Astor Place. const astorPlace = { lat: 40.729884, lng: -73.990988 }; const mapElement = document.querySelector('gmp-map'); innerMap = mapElement.innerMap; document .getElementById('streetview-toggle-button') .addEventListener('click',