Genel Bakış
Google Street View, hakkında haber yapılan bölgedeki belirli yollarda 360 derecelik panoramik görünümler sunar. Street View'ın API kapsamı, Google Haritalar uygulamasının kapsamıyla aynıdır (https://maps.google.com/). Street View'ın şu anda desteklediği şehirlerin listesini Google Haritalar web sitesinde bulabilirsiniz.
Aşağıda örnek bir Street View görüntüsü gösterilmektedir.
Maps JavaScript API, Google Haritalar Street View'da kullanılan görüntüleri elde etmek ve değiştirmek için bir Street View hizmeti sağlar. Bu Street View hizmeti, tarayıcıda yerel olarak desteklenir.
Street View Harita Kullanımı
Street View, bağımsız bir DOM öğesinde kullanılabilse de en çok haritada bir konum belirtirken faydalıdır. Varsayılan olarak, haritalarda Street View etkinleştirilir ve navigasyon (yakınlaştırma ve kaydırma) kontrollerine entegre edilmiş bir Street View Pegman kontrolü görünür. streetViewControl ayarını false olarak belirleyerek bu kontrolü haritanın MapOptions bölümünde gizleyebilirsiniz. Ayrıca Map öğesinin streetViewControlOptions.position özelliğini yeni bir ControlPosition olarak ayarlayarak Street View kontrolünün varsayılan konumunu da değiştirebilirsiniz.
Street View Pegman kontrolü, Street View panoramalarını doğrudan harita üzerinde görüntülemenizi sağlar. Kullanıcı Pegman'i tıklayıp basılı tuttuğunda harita, Street View'ın etkin olduğu sokakların etrafında mavi ana hatlar gösterecek şekilde güncellenir. Bu sayede, Google Haritalar uygulamasına benzer bir kullanıcı deneyimi sunulur.
Kullanıcı Pegman işaretçisini bir sokağa bıraktığında harita, belirtilen konumun Street View panoramasını gösterecek şekilde güncellenir.
Street View Panoramaları
Street View görüntüleri, Street View "görüntüleyicisine" API arayüzü sağlayan StreetViewPanorama nesnesi kullanılarak desteklenir. Her haritada varsayılan bir Street View panoraması bulunur. Bu panoramayı, haritanın getStreetView() yöntemini çağırarak alabilirsiniz. streetViewControl seçeneğini true olarak ayarlayarak haritaya bir Street View kontrolü eklediğinizde Pegman kontrolünü otomatik olarak bu varsayılan Street View panoramasına bağlarsınız.
Ayrıca kendi StreetViewPanorama
nesnenizi oluşturabilir ve haritanın streetView özelliğini açıkça bu oluşturulan nesneye ayarlayarak haritanın varsayılan yerine bu nesneyi kullanmasını sağlayabilirsiniz. Harita ile panorama arasındaki yer paylaşımlarının otomatik olarak paylaşılması gibi varsayılan davranışları değiştirmek istiyorsanız varsayılan panoramayı geçersiz kılabilirsiniz. (Aşağıdaki Street View'daki yer paylaşımları bölümüne bakın.)
Street View Kapsayıcıları
Bunun yerine, genellikle bir <div> öğesi olan ayrı bir DOM öğesinde StreetViewPanorama
görüntülemek isteyebilirsiniz.
DOM öğesini StreetViewPanorama's
oluşturucusuna iletmeniz yeterlidir. Resimlerin optimum şekilde gösterilmesi için minimum 200 x 200 piksel boyutunda olmasını öneririz.
Not: Street View işlevi haritayla birlikte kullanılacak şekilde tasarlanmış olsa da bu kullanım zorunlu değildir. Bağımsız bir Street View nesnesini harita olmadan kullanabilirsiniz.
Street View Konumları ve Bakış Açısı (POV)
StreetViewPanorama oluşturucusu, StreetViewOptions parametresini kullanarak Street View konumunu ve bakış açısını ayarlamanıza da olanak tanır. Konumunu ve bakış açısını değiştirmek için inşaat tamamlandıktan sonra
setPosition() ve setPov() numaralarını arayabilirsiniz.
Street View konumu, bir resim için kamera odağının yerleşimini tanımlar ancak bu resim için kameranın yönünü tanımlamaz. Bu amaçla, StreetViewPov nesnesi iki özellik tanımlar:
heading(varsayılan0), gerçek kuzeye göre derece cinsinden kamera yerinin etrafındaki dönme açısını tanımlar. Başlıklar saat yönünde ölçülür (90 derece tam doğudur).pitch(varsayılan0), genellikle (ancak her zaman değil) düz yatay olan kameranın ilk varsayılan eğiminden "yukarı" veya "aşağı" açı varyansını tanımlar. (Örneğin, bir tepede çekilen bir resimde muhtemelen yatay olmayan varsayılan bir eğim gösterilir.) Yatay eğim açıları, yukarı bakarken pozitif değerlerle (varsayılan yatay eğime dik ve doğrudan yukarı doğru +90 dereceye kadar), aşağı bakarken ise negatif değerlerle (varsayılan yatay eğime dik ve doğrudan aşağı doğru -90 dereceye kadar) ölçülür.
StreetViewPov nesnesi, Street View kamerasının bakış açısını belirlemek için en sık kullanılan nesnedir. StreetViewPanorama.getPhotographerPov() yöntemiyle fotoğrafçının bakış açısını (genellikle arabanın
veya üç tekerlekli bisikletin yönü) de belirleyebilirsiniz.
Aşağıdaki kod, Boston'ın haritasını Fenway Park'ın ilk görünümüyle birlikte gösterir. Pegman'i seçip haritada desteklenen bir konuma sürüklediğinizde Street View panoraması değişir:
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>Mobil cihazlarda hareket izleme
Cihaz yönlendirme etkinliklerini destekleyen cihazlarda API, kullanıcılara cihazın hareketine göre Street View bakış açısını değiştirme olanağı sunar. Kullanıcılar cihazlarını hareket ettirerek etrafa bakabilir. Buna hareket izleme veya cihaz döndürme izleme denir.
Uygulama geliştirici olarak varsayılan davranışı aşağıdaki şekilde değiştirebilirsiniz:
- Hareket izleme işlevini etkinleştirin veya devre dışı bırakın. Hareket izleme, varsayılan olarak destekleyen tüm cihazlarda etkindir. Aşağıdaki örnekte
hareket izleme devre dışı bırakılır ancak hareket izleme kontrolü görünür kalır.
(Kullanıcının, denetime dokunarak hareket izlemeyi etkinleştirebileceğini unutmayın.)
var panorama = new google.maps.StreetViewPanorama( document.getElementById('pano'), { position: {lat: 37.869260, lng: -122.254811}, pov: {heading: 165, pitch: 0}, motionTracking: false });
-
Hareket izleme kontrolünü gizleyin veya gösterin. Kontrol, varsayılan olarak hareket izlemeyi destekleyen cihazlarda gösterilir. Kullanıcı, hareket izlemeyi etkinleştirmek veya devre dışı bırakmak için denetime dokunabilir. Cihaz,
motionTrackingControldeğerinden bağımsız olarak hareket izlemeyi desteklemiyorsa denetimin hiçbir zaman görünmeyeceğini unutmayın.Aşağıdaki örnek, hem hareket izlemeyi hem de hareket izleme kontrolünü devre dışı bırakır. Bu durumda kullanıcı hareket izlemeyi etkinleştiremez:
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 });
- Hareket izleme kontrolünün varsayılan konumunu değiştirin. Kontrol, varsayılan olarak panoramanın sağ alt kısmına yakın bir yerde görünür (konum
RIGHT_BOTTOM). Aşağıdaki örnekte kontrolün konumu sol alt olarak ayarlanmıştır: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 } });
Hareket izlemeyi iş başında görmek için aşağıdaki örneği bir mobil cihazda (veya cihaz yönlendirme etkinliklerini destekleyen herhangi bir cihazda) görüntüleyin:
Street View'daki yer paylaşımları
Varsayılan StreetViewPanorama nesnesi, harita yer paylaşımlarının yerel olarak görüntülenmesini destekler.
Yer paylaşımları genellikle LatLng konumlarına sabitlenmiş olarak "sokak düzeyinde" görünür. (Örneğin, işaretçiler, kuyrukları konumun Street View panoramasındaki yatay düzlemine sabitlenmiş şekilde görünür.)
Şu anda Street View panoramalarında desteklenen yer paylaşımı türleri Marker, InfoWindow ve özel OverlayView ile sınırlıdır. Haritada gösterdiğiniz yer paylaşımları, panoramayı Map nesnesinin yerine kullanıp setMap()'i çağırarak ve StreetViewPanorama'yi harita yerine bağımsız değişken olarak geçirerek Street View panoramasında gösterilebilir. Bilgi pencereleri de benzer şekilde open() çağrılarak Street View panoramasında açılabilir. Bu durumda harita yerine StreetViewPanorama() iletilir.
Ayrıca, varsayılan StreetViewPanorama ile harita oluştururken haritada oluşturulan tüm işaretler, panorama görünür olduğu sürece haritanın ilişkili Street View panoramasıyla otomatik olarak paylaşılır. Varsayılan Street View panoramasını almak için Map nesnesinde getStreetView() işlevini çağırın. Haritanın streetView özelliğini açıkça kendi oluşturduğunuz bir StreetViewPanorama olarak ayarlarsanız varsayılan panoramayı geçersiz kılacağınızı unutmayın.
Aşağıdaki örnekte, New York City, Astor Place çevresindeki çeşitli konumları gösteren işaretçiler yer almaktadır. Paylaşılan işaretçilerin StreetViewPanorama içinde gösterilmesi için ekranı Street View'a geçirin.
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', 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() { const toggle = panorama.getVisible(); if (!toggle) { panorama.setVisible(true); } else { panorama.setVisible(false); } } void init(); export {};
CSS
/* * Always set the map height explicitly to define the size of the div element * that contains the map. */ #map { height: 100%; } /* * Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; } #floating-panel { position: absolute; top: 10px; left: 25%; z-index: 5; background-color: #fff; padding: 5px; border: 1px solid #999; text-align: center; font-family: 'Roboto', sans-serif; line-height: 30px; padding-left: 10px; } #streetview-toggle-button { height: 40px; display: flex; align-items: center; justify-content: center; padding: 0 17px; border: none; background: white; cursor: pointer; border-radius: 2px; box-shadow: 0 1px 4px -1px rgba(0, 0, 0, 0.3); margin: 10px 0px 10px -2px; font-family: Roboto, Arial, sans-serif; font-size: 18px; font-weight: 400; color: rgb(86, 86, 86); } #streetview-toggle-button:hover { background: #f4f4f4; color: #000; }
HTML
<html>
<head>
<title>Overlays Within Street View</title>
<link rel="stylesheet" type="text/css" href="./style.css" />
<script type="module" src="./index.js"></script>
<script>
// prettier-ignore
(g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})({
key: "GOOGLE_MAPS_API_KEY"
});
</script>
</head>
<body>
<gmp-map map-id="DEMO_MAP_ID" center="40.729884, -73.990988" zoom="18">
<input
type="button"
value="Toggle Street View"
id="streetview-toggle-button"
slot="control-block-start-inline-start" />
</gmp-map>
</body>
</html>Street View Etkinlikleri
Street View arasında gezinirken veya yönünü değiştirirken StreetViewPanorama durumundaki değişiklikleri gösteren çeşitli etkinlikleri izlemek isteyebilirsiniz:
pano_changed, her bir pano kimliği değiştiğinde tetiklenir. Bu etkinlik, panoramadaki ilişkili verilerin (ör. bağlantılar) bu etkinlik tetiklendiğinde değiştiğini garanti etmez. Bu etkinlik yalnızca pano kimliğinin değiştiğini gösterir. Pano kimliğinin (bu panoramaya referans vermek için kullanabilirsiniz) yalnızca mevcut tarayıcı oturumunda sabit olduğunu unutmayın.position_changed, panoramanın temel (LatLng) konumu her değiştiğinde tetiklenir. Bir panoramayı döndürmek bu etkinliği tetiklemez. API, en yakın pano kimliğini otomatik olarak panonun konumuyla ilişkilendireceğinden, ilişkili pano kimliğini değiştirmeden bir panonun temel konumunu değiştirebileceğinizi unutmayın.pov_changed, Street View'unStreetViewPovher değiştiğinde tetiklenir. Bu etkinliğin, konum ve pano kimliği sabit kalırken tetiklenebileceğini unutmayın.- Street View bağlantıları her değiştiğinde
links_changedtetiklenir. Bu etkinliğin,pano_changedile belirtilen pano kimliğinde değişiklik yapıldıktan sonra eşzamansız olarak tetiklenebileceğini unutmayın. - Street View'un görünürlüğü her değiştiğinde
visible_changedtetiklenir. Bu etkinliğin,pano_changedile belirtilen pano kimliğinde değişiklik yapıldıktan sonra eşzamansız olarak tetiklenebileceğini unutmayın.
Aşağıdaki kod, temel StreetViewPanorama hakkında veri toplamak için bu etkinliklerin nasıl işlenebileceğini gösterir:
TypeScript
function initPano() { const panorama = new google.maps.StreetViewPanorama( document.getElementById("pano") as HTMLElement, { position: { lat: 37.869, lng: -122.255 }, pov: { heading: 270, pitch: 0, }, visible: true, } ); panorama.addListener("pano_changed", () => { const panoCell = document.getElementById("pano-cell") as HTMLElement; panoCell.innerHTML = panorama.getPano(); }); panorama.addListener("links_changed", () => { const linksTable = document.getElementById("links_table") as HTMLElement; while (linksTable.hasChildNodes()) { linksTable.removeChild(linksTable.lastChild as ChildNode); } const links = panorama.getLinks(); for (const i in links) { const row = document.createElement("tr"); linksTable.appendChild(row); const labelCell = document.createElement("td"); labelCell.innerHTML = "<b>Link: " + i + "</b>"; const valueCell = document.createElement("td"); valueCell.innerHTML = links[i].description as string; linksTable.appendChild(labelCell); linksTable.appendChild(valueCell); } }); panorama.addListener("position_changed", () => { const positionCell = document.getElementById( "position-cell" ) as HTMLElement; (positionCell.firstChild as HTMLElement).nodeValue = panorama.getPosition() + ""; }); panorama.addListener("pov_changed", () => { const headingCell = document.getElementById("heading-cell") as HTMLElement; const pitchCell = document.getElementById("pitch-cell") as HTMLElement; (headingCell.firstChild as HTMLElement).nodeValue = panorama.getPov().heading + ""; (pitchCell.firstChild as HTMLElement).nodeValue = panorama.getPov().pitch + ""; }); } declare global { interface Window { initPano: () => void; } } window.initPano = initPano;
JavaScript
function initPano() { const panorama = new google.maps.StreetViewPanorama( document.getElementById("pano"), { position: { lat: 37.869, lng: -122.255 }, pov: { heading: 270, pitch: 0, }, visible: true, }, ); panorama.addListener("pano_changed", () => { const panoCell = document.getElementById("pano-cell"); panoCell.innerHTML = panorama.getPano(); }); panorama.addListener("links_changed", () => { const linksTable = document.getElementById("links_table"); while (linksTable.hasChildNodes()) { linksTable.removeChild(linksTable.lastChild); } const links = panorama.getLinks(); for (const i in links) { const row = document.createElement("tr"); linksTable.appendChild(row); const labelCell = document.createElement("td"); labelCell.innerHTML = "<b>Link: " + i + "</b>"; const valueCell = document.createElement("td"); valueCell.innerHTML = links[i].description; linksTable.appendChild(labelCell); linksTable.appendChild(valueCell); } }); panorama.addListener("position_changed", () => { const positionCell = document.getElementById("position-cell"); positionCell.firstChild.nodeValue = panorama.getPosition() + ""; }); panorama.addListener("pov_changed", () => { const headingCell = document.getElementById("heading-cell"); const pitchCell = document.getElementById("pitch-cell"); headingCell.firstChild.nodeValue = panorama.getPov().heading + ""; pitchCell.firstChild.nodeValue = panorama.getPov().pitch + ""; }); } window.initPano = initPano;
CSS
/* * Always set the map height explicitly to define the size of the div element * that contains the map. */ #map { height: 100%; } /* * Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; } #floating-panel { position: absolute; top: 10px; left: 25%; z-index: 5; background-color: #fff; padding: 5px; border: 1px solid #999; text-align: center; font-family: "Roboto", "sans-serif"; line-height: 30px; padding-left: 10px; } #pano { width: 50%; height: 100%; float: left; } #floating-panel { width: 45%; height: 100%; float: right; text-align: left; overflow: auto; position: static; border: 0px solid #999; }
HTML
<html>
<head>
<title>Street View Events</title>
<link rel="stylesheet" type="text/css" href="./style.css" />
<script type="module" src="./index.js"></script>
</head>
<body>
<div id="pano"></div>
<div id="floating-panel">
<table>
<tr>
<td><b>Position</b></td>
<td id="position-cell"> </td>
</tr>
<tr>
<td><b>POV Heading</b></td>
<td id="heading-cell">270</td>
</tr>
<tr>
<td><b>POV Pitch</b></td>
<td id="pitch-cell">0.0</td>
</tr>
<tr>
<td><b>Pano ID</b></td>
<td id="pano-cell"> </td>
</tr>
<table id="links_table"></table>
</table>
</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=initPano&v=weekly"
defer
></script>
</body>
</html>Street View Kontrolleri
StreetViewPanorama gösterilirken varsayılan olarak panoramada çeşitli kontroller görünür. StreetViewPanoramaOptions içindeki uygun alanları true veya false olarak ayarlayarak bu kontrolleri etkinleştirebilir ya da devre dışı bırakabilirsiniz:
panControl, panoramayı döndürme olanağı sağlar. Bu kontrol, varsayılan olarak standart bir entegre pusula ve kaydırma kontrolü şeklinde görünür.PanControlOptionsalanındapanControlOptionssağlayarak kontrolün konumunu değiştirebilirsiniz.zoomControlsimgesi, resim içinde yakınlaştırma yapmanızı sağlar. Bu denetim, varsayılan olarak panoramanın sağ alt kısmına yakın bir yerde görünür.zoomControlOptionsalanınaZoomControlOptionsgirerek kontrolün görünümünü değiştirebilirsiniz.addressControl, ilişkili konumun adresini gösteren bir metin yer paylaşımı sağlar ve konumu Google Haritalar'da açmak için bir bağlantı sunar.addressControlOptionsalanınaStreetViewAddressControlOptionsgirerek kontrolün görünümünü değiştirebilirsiniz.fullscreenControlsimgesi, Street View'u tam ekran modunda açma seçeneği sunar.fullscreenControlOptionsalanınaFullscreenControlOptionsgirerek kontrolün görünümünü değiştirebilirsiniz.motionTrackingControl, mobil cihazlarda hareket izlemeyi etkinleştirme veya devre dışı bırakma seçeneği sunar. Bu kontrol yalnızca cihaz yönü etkinliklerini destekleyen cihazlarda görünür. Kontrol, varsayılan olarak panoramanın sağ alt kısmına yakın bir yerde görünür.MotionTrackingControlOptionssağlayarak kontrolün konumunu değiştirebilirsiniz. Daha fazla bilgi için hareket izleme bölümüne bakın.linksControlsimgesi, bitişik panorama resimlerine gitmek için resimde kılavuz oklar sağlar.- Kapat denetimi, kullanıcının Street View görüntüleyicisini kapatmasına olanak tanır. Kapatma kontrolünü etkinleştirmek veya devre dışı bırakmak için
enableCloseButtonayarınıtrueveyafalseolarak belirleyebilirsiniz.
Aşağıdaki örnek, ilişkili Street View'da gösterilen kontrolleri değiştirir ve görünümün bağlantılarını kaldırır:
TypeScript
function initPano() { // Note: constructed panorama objects have visible: true // set by default. const panorama = new google.maps.StreetViewPanorama( document.getElementById("map") as HTMLElement, { position: { lat: 42.345573, lng: -71.098326 }, addressControlOptions: { position: google.maps.ControlPosition.BOTTOM_CENTER, }, linksControl: false, panControl: false, enableCloseButton: false, } ); } declare global { interface Window { initPano: () => void; } } window.initPano = initPano;
JavaScript
function initPano() { // Note: constructed panorama objects have visible: true // set by default. const panorama = new google.maps.StreetViewPanorama( document.getElementById("map"), { position: { lat: 42.345573, lng: -71.098326 }, addressControlOptions: { position: google.maps.ControlPosition.BOTTOM_CENTER, }, linksControl: false, panControl: false, enableCloseButton: false, }, ); } window.initPano = initPano;
CSS
/* * Always set the map height explicitly to define the size of the div element * that contains the map. */ #map { height: 100%; } /* * Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; }
HTML
<html>
<head>
<title>Street View Controls</title>
<link rel="stylesheet" type="text/css" href="./style.css" />
<script type="module" src="./index.js"></script>
</head>
<body>
<div id="map"></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=initPano&v=weekly"
defer
></script>
</body>
</html>Street View verilerine doğrudan erişme
Street View verilerinin kullanılabilirliğini programlı bir şekilde belirlemek veya belirli panoramalarla ilgili bilgileri harita/panorama üzerinde doğrudan işlem yapmadan döndürmek isteyebilirsiniz. Bunu, Google'ın Street View hizmetinde depolanan verilere arayüz sağlayan StreetViewService nesnesini kullanarak yapabilirsiniz.
Street View Hizmet İstekleri
Google Haritalar API'sinin harici bir sunucuya çağrı yapması gerektiğinden Street View hizmetine erişim eşzamansızdır. Bu nedenle, istek tamamlandığında yürütülecek bir geri çağırma yöntemi iletmeniz gerekir. Bu geri çağırma yöntemi, sonucu işler.
StreetViewService ile StreetViewPanoRequest veya StreetViewLocationRequest kullanarak istek başlatabilirsiniz.
StreetViewPanoRequest kullanılan bir istek, panoramayı benzersiz şekilde tanımlayan bir referans kimliği verildiğinde panorama verilerini döndürür. Bu referans kimliklerinin yalnızca söz konusu panoramanın görüntüleri süresince sabit olduğunu unutmayın.
StreetViewLocationRequest parametresinin kullanıldığı bir istek, aşağıdaki parametreleri kullanarak belirtilen konumdaki panorama verilerini arar:
location, panorama aranacak konumu (enlem ve boylam) belirtir.preference, yarıçap içinde hangi panaromanın bulunması gerektiğiyle ilgili bir tercih belirler: sağlanan konuma en yakın olan veya yarıçap içindeki en iyi panorama.radius, belirli enlem ve boylamda ortalanmış bir panoramayı aramak için metre cinsinden belirtilen bir yarıçap ayarlar. Sağlanmazsa varsayılan değer 50'dir.source, aranacak panoramaların kaynağını belirtir. Geçerli değerler:default, Street View için varsayılan kaynakları kullanır; aramalar belirli kaynaklarla sınırlı değildir.outdooraramaları dış mekan koleksiyonlarıyla sınırlar. Belirtilen konum için dış mekan panoramalarının mevcut olmayabileceğini unutmayın.
Street View Hizmeti Yanıtları
İşlevin, Street View hizmetinden bir sonuç alındığında yürütülecek bir getPanorama()
geri çağırma işlevine ihtiyacı vardır. Bu geri çağırma işlevi, StreetViewPanoramaData nesnesi içinde bir dizi panorama verisi ve istek durumunu belirten bir StreetViewStatus kodu döndürür.
Bir StreetViewPanoramaData nesne spesifikasyonu, aşağıdaki biçimde bir Street View panoramasıyla ilgili meta veriler içerir:
{ "location": { "latLng": LatLng, "description": string, "pano": string }, "copyright": string, "links": [{ "heading": number, "description": string, "pano": string, "roadColor": string, "roadOpacity": number }], "tiles": { "worldSize": Size, "tileSize": Size, "centerHeading": number } }
Bu veri nesnesinin StreetViewPanorama
nesnesi olmadığını unutmayın. Bu verileri kullanarak bir Street View nesnesi oluşturmak için StreetViewPanorama oluşturmanız ve döndürülen location.pano alanında belirtildiği gibi kimliği ileterek setPano() yöntemini çağırmanız gerekir.
status kodu aşağıdaki değerlerden birini döndürebilir:
OK, hizmetin eşleşen bir panorama bulduğunu gösterir.ZERO_RESULTS, hizmetin, iletilen ölçütlerle eşleşen bir panorama bulamadığını gösterir.UNKNOWN_ERROR, tam nedeni bilinmemekle birlikte bir Street View isteğinin işlenemediğini gösterir.
Aşağıdaki kod, haritada kullanıcı tıklamalarına yanıt veren bir StreetViewService
oluşturur. Bu, tıklanıldığında ilgili
konumun StreetViewPanorama bilgisini gösteren işaretçiler oluşturur. Kod, hizmetten döndürülen StreetViewPanoramaData
içeriğini kullanır.
TypeScript
/* * Click the map to set a new location for the Street View camera. */ let map: google.maps.Map; let panorama: google.maps.StreetViewPanorama; function initMap(): void { const berkeley = { lat: 37.869085, lng: -122.254775 }; const sv = new google.maps.StreetViewService(); panorama = new google.maps.StreetViewPanorama( document.getElementById("pano") as HTMLElement ); // Set up the map. map = new google.maps.Map(document.getElementById("map") as HTMLElement, { center: berkeley, zoom: 16, streetViewControl: false, }); // Set the initial Street View camera to the center of the map sv.getPanorama({ location: berkeley, radius: 50 }).then(processSVData); // Look for a nearby Street View panorama when the map is clicked. // getPanorama will return the nearest pano when the given // radius is 50 meters or less. map.addListener("click", (event) => { sv.getPanorama({ location: event.latLng, radius: 50 }) .then(processSVData) .catch((e) => console.error("Street View data not found for this location.") ); }); } function processSVData({ data }: google.maps.StreetViewResponse) { const location = data.location!; const marker = new google.maps.Marker({ position: location.latLng, map, title: location.description, }); panorama.setPano(location.pano as string); panorama.setPov({ heading: 270, pitch: 0, }); panorama.setVisible(true); marker.addListener("click", () => { const markerPanoID = location.pano; // Set the Pano to use the passed panoID. panorama.setPano(markerPanoID as string); panorama.setPov({ heading: 270, pitch: 0, }); panorama.setVisible(true); }); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
/* * Click the map to set a new location for the Street View camera. */ let map; let panorama; function initMap() { const berkeley = { lat: 37.869085, lng: -122.254775 }; const sv = new google.maps.StreetViewService(); panorama = new google.maps.StreetViewPanorama( document.getElementById("pano"), ); // Set up the map. map = new google.maps.Map(document.getElementById("map"), { center: berkeley, zoom: 16, streetViewControl: false, }); // Set the initial Street View camera to the center of the map sv.getPanorama({ location: berkeley, radius: 50 }).then(processSVData); // Look for a nearby Street View panorama when the map is clicked. // getPanorama will return the nearest pano when the given // radius is 50 meters or less. map.addListener("click", (event) => { sv.getPanorama({ location: event.latLng, radius: 50 }) .then(processSVData) .catch((e) => console.error("Street View data not found for this location."), ); }); } function processSVData({ data }) { const location = data.location; const marker = new google.maps.Marker({ position: location.latLng, map, title: location.description, }); panorama.setPano(location.pano); panorama.setPov({ heading: 270, pitch: 0, }); panorama.setVisible(true); marker.addListener("click", () => { const markerPanoID = location.pano; // Set the Pano to use the passed panoID. panorama.setPano(markerPanoID); panorama.setPov({ heading: 270, pitch: 0, }); panorama.setVisible(true); }); } window.initMap = initMap;
CSS
/* * Always set the map height explicitly to define the size of the div element * that contains the map. */ #map { height: 100%; } /* * Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; }
HTML
<html>
<head>
<title>Directly Accessing Street View Data</title>
<link rel="stylesheet" type="text/css" href="./style.css" />
<script type="module" src="./index.js"></script>
</head>
<body>
<div id="map" style="width: 45%; height: 100%; float: left"></div>
<div id="pano" style="width: 45%; height: 100%; float: left"></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=initMap&v=weekly"
defer
></script>
</body>
</html>Özel Street View Panoramaları Sağlama
Maps JavaScript API, StreetViewPanorama nesnesi içinde özel panoramaların gösterilmesini destekler. Özel panoramalar kullanarak binaların içini, manzaralı yerlerden görünümleri veya hayal gücünüzdeki her şeyi gösterebilirsiniz. Hatta bu özel panoramaları Google'ın mevcut Street View panoramalarına bağlayabilirsiniz.
Özel panorama görüntüleri oluşturmak için aşağıdaki adımları uygulayın:
- Her özel panorama için temel bir panoramik görüntü oluşturun. Bu temel resim, yakınlaştırılmış görüntü yayınlamak istediğiniz en yüksek çözünürlüklü resim olmalıdır.
- (İsteğe bağlı ancak önerilir) Temel resimden farklı yakınlaştırma düzeylerinde bir dizi panoramik döşeme oluşturun.
- Özel panoramalarınız arasında bağlantılar oluşturun.
- (İsteğe bağlı) Google'ın mevcut Street View görüntüleri içinde"giriş" panoramaları belirleyin ve özel setten standart sete/standart setten özel sete giden bağlantıları özelleştirin.
StreetViewPanoramaDatanesnesindeki her panorama görüntüsü için meta verileri tanımlayın.- Özel panorama verilerini ve resimlerini belirleyen bir yöntem uygulayın ve bu yöntemi
StreetViewPanoramanesnesinde özel işleyiciniz olarak atayın.
Bu süreç aşağıdaki bölümlerde açıklanmaktadır.
Özel panoramalar oluşturma
Her Street View panoraması, tek bir konumdan 360 derecelik tam görünüm sağlayan bir resim veya resim grubudur.
StreetViewPanorama nesnesi, eşit dikdörtgen (Plate Carrée) projeksiyonuna uygun görüntüler kullanır. Bu tür bir projeksiyon, 360 derecelik yatay görünüm (tamamen sarılmış) ve 180 derecelik dikey görünüm (tam yukarıdan tam aşağıya) içerir. Bu görüş alanları, 2:1 en boy oranına sahip bir resimle sonuçlanır. Aşağıda tam bir 360 derece panorama gösterilmektedir.

Panorama görüntüleri genellikle tek bir konumdan birden fazla fotoğraf çekilerek ve panorama yazılımı kullanılarak birleştirilerek elde edilir. (Daha fazla bilgi için Wikipedia'nın Fotoğraf birleştirme uygulamalarının karşılaştırması başlıklı makalesine bakın.) Bu tür resimler, panorama resimlerinin her birinin çekildiği tek bir "kamera" noktasına sahip olmalıdır. Elde edilen 360 derecelik panorama, kürenin iki boyutlu yüzeyine sarılmış görüntüyle küre üzerinde bir projeksiyon tanımlayabilir.

Panoramayı, doğrusal koordinat sistemine sahip bir küre üzerindeki projeksiyon olarak ele almak, görüntüyü doğrusal döşemelere bölmek ve görüntüleri hesaplanan döşeme koordinatlarına göre sunmak açısından avantajlıdır.
Özel Panorama Döşemeleri Oluşturma
Street View, yakınlaştırma kontrolü sayesinde farklı düzeylerde görüntü ayrıntılarını da destekler. Bu kontrol, varsayılan görünümde yakınlaştırma ve uzaklaştırma yapmanıza olanak tanır. Genellikle Street View, herhangi bir panorama görüntüsü için beş düzeyde yakınlaştırma çözünürlüğü sunar. Tüm yakınlaştırma düzeylerinde tek bir panorama görüntüsünü kullanırsanız bu görüntü ya çok büyük olur ve uygulamanızı önemli ölçüde yavaşlatır ya da daha yüksek yakınlaştırma düzeylerinde çözünürlüğü o kadar düşük olur ki pikselli bir görüntü yayınlarsınız. Ancak, farklı yakınlaştırma seviyelerinde Google'ın harita döşemelerini sunmak için kullanılan benzer bir tasarım kalıbını kullanarak her yakınlaştırma seviyesinde panoramalar için uygun çözünürlükte görüntüler sağlayabiliriz.
Bir StreetViewPanorama ilk yüklendiğinde varsayılan olarak, 1. yakınlaştırma seviyesinde panoramanın yatay genişliğinin %25'ini (90 derecelik yay) oluşturan bir resim gösterilir. Bu görünüm, normal bir insanın görüş alanına yaklaşık olarak karşılık gelir. Bu varsayılan görünümden "uzaklaştırma" işlemi, daha geniş bir yay sağlar. Yakınlaştırma ise görünüm alanını daha küçük bir yayla daraltır. StreetViewPanorama, seçilen yakınlaştırma seviyesi için uygun görüş alanını otomatik olarak hesaplar ve ardından yatay görüş alanının boyutlarıyla kabaca eşleşen bir döşeme grubu seçerek bu çözünürlüğe en uygun görüntüleri belirler. Aşağıdaki görüş alanları Street View'daki yakınlaştırma düzeyleriyle eşlenir:
| Street View yakınlaştırma seviyesi | Görüş alanı (derece) |
|---|---|
| 0 | 180 |
| 1 (varsayılan) | 90 |
| 2 | 45 |
| 3 | 22,5 |
| 4 | 11,25 |
Street View'da gösterilen resmin boyutunun tamamen Street View kapsayıcısının ekran boyutuna (genişliğine) bağlı olduğunu unutmayın. Daha geniş bir kapsayıcı sağlarsanız hizmet, belirli bir yakınlaştırma seviyesi için aynı görüş alanını sağlamaya devam eder ancak bunun yerine bu çözünürlüğe daha uygun parçalar seçebilir.
Her panorama, eşit dikdörtgen projeksiyondan oluştuğu için panorama döşemeleri oluşturmak nispeten kolaydır. Projeksiyon, 2:1 en-boy oranına sahip bir görüntü sağladığından 2:1 oranlı döşemelerin kullanımı daha kolaydır. Ancak kare döşemeler, kare haritalarda daha iyi performans sağlayabilir (çünkü görüş alanı kare olur).
2:1 döşemeler için, tüm panoramayı kapsayan tek bir resim, 0 yakınlaştırma seviyesinde tüm panorama "dünyasını" (temel resim) temsil eder. Her artan yakınlaştırma seviyesi 4zoomLevel döşeme sunar. (Örn.2. yakınlaştırma seviyesinde, tüm panorama 16 parçadan oluşur.) Not: Street View döşemelerindeki yakınlaştırma düzeyleri, Street View kontrolü kullanılarak sağlanan yakınlaştırma düzeyleriyle doğrudan eşleşmez. Bunun yerine, Street View kontrolü yakınlaştırma düzeyleri, uygun döşemelerin seçildiği bir görüş alanı (FoV) belirler.

Genellikle, resim döşemelerinizi programatik olarak seçilebilecek şekilde adlandırmak istersiniz. Bu tür bir adlandırma şeması, Özel Panorama İsteklerini İşleme bölümünde ele alınmıştır.
Özel Panorama İsteklerini İşleme
Özel bir panoramayı kullanmak için StreetViewPanorama.registerPanoProvider() yöntemini çağırın ve özel panorama sağlayıcı yönteminizin adını belirtin. Panorama sağlayıcı yöntemi bir StreetViewPanoramaData nesnesi döndürmeli ve aşağıdaki imzaya sahip olmalıdır:
Function(pano):StreetViewPanoramaData
Bir StreetViewPanoramaData, aşağıdaki biçimde bir nesnedir:
{ copyright: string, location: { description: string, latLng: google.maps.LatLng, pano: string }, tiles: { tileSize: google.maps.Size, worldSize: google.maps.Size, heading: number, getTileUrl: Function }, links: [ description: string, heading: number, pano: string, roadColor: string, roadOpacity: number ] }
Özel bir panoramayı aşağıdaki şekilde görüntüleyin:
StreetViewPanoramaOptions.panoözelliğini özel bir değere ayarlayın.- Özel bir panorama sağlayıcı işlevi sağlamak için
StreetViewPanorama.registerPanoProvider()işlevini çağırın. - Belirtilen
panodeğerini işlemek için özel panorama sağlayıcı işlevinizi uygulayın. StreetViewPanoramaDatanesnesi oluşturun.StreetViewTileData.getTileUrlözelliğini, sağladığınız özel döşeme sağlayıcı işlevinin adıyla ayarlayın. Örneğin,getCustomPanoramaTileUrl.- Özel karo sağlayıcı işlevinizi aşağıdaki örneklerde gösterildiği gibi uygulayın.
StreetViewPanoramaDatanesnesini döndürür.
Not: Özel panoramalar göstermek istediğinizde position
değerini doğrudan StreetViewPanorama üzerinde ayarlamayın. Bu konum, Street View hizmetine ilgili konumun yakınındaki varsayılan Street View görüntülerini isteme talimatı verir. Bunun yerine, bu konumu özel StreetViewPanoramaData nesnesinin location.latLng alanında ayarlayın.
Aşağıdaki örnekte, Google Sidney ofisinin özel bir panoraması gösterilmektedir. Bu örnekte harita veya varsayılan Street View görüntüleri kullanılmadığını unutmayın:
TypeScript
function initPano() { // Set up Street View and initially set it visible. Register the // custom panorama provider function. Set the StreetView to display // the custom panorama 'reception' which we check for below. const panorama = new google.maps.StreetViewPanorama( document.getElementById("map") as HTMLElement, { pano: "reception", visible: true } ); panorama.registerPanoProvider(getCustomPanorama); } // Return a pano image given the panoID. function getCustomPanoramaTileUrl( pano: string, zoom: number, tileX: number, tileY: number ): string { return ( "https://developers.google.com/maps/documentation/javascript/examples/full/images/" + "panoReception1024-" + zoom + "-" + tileX + "-" + tileY + ".jpg" ); } // Construct the appropriate StreetViewPanoramaData given // the passed pano IDs. function getCustomPanorama(pano: string): google.maps.StreetViewPanoramaData { if (pano === "reception") { return { location: { pano: "reception", description: "Google Sydney - Reception", }, links: [], // The text for the copyright control. copyright: "Imagery (c) 2010 Google", // The definition of the tiles for this panorama. tiles: { tileSize: new google.maps.Size(1024, 512), worldSize: new google.maps.Size(2048, 1024), // The heading in degrees at the origin of the panorama // tile set. centerHeading: 105, getTileUrl: getCustomPanoramaTileUrl, }, }; } // @ts-ignore TODO fix typings return null; } declare global { interface Window { initPano: () => void; } } window.initPano = initPano;
JavaScript
function initPano() { // Set up Street View and initially set it visible. Register the // custom panorama provider function. Set the StreetView to display // the custom panorama 'reception' which we check for below. const panorama = new google.maps.StreetViewPanorama( document.getElementById("map"), { pano: "reception", visible: true }, ); panorama.registerPanoProvider(getCustomPanorama); } // Return a pano image given the panoID. function getCustomPanoramaTileUrl(pano, zoom, tileX, tileY) { return ( "https://developers.google.com/maps/documentation/javascript/examples/full/images/" + "panoReception1024-" + zoom + "-" + tileX + "-" + tileY + ".jpg" ); } // Construct the appropriate StreetViewPanoramaData given // the passed pano IDs. function getCustomPanorama(pano) { if (pano === "reception") { return { location: { pano: "reception", description: "Google Sydney - Reception", }, links: [], // The text for the copyright control. copyright: "Imagery (c) 2010 Google", // The definition of the tiles for this panorama. tiles: { tileSize: new google.maps.Size(1024, 512), worldSize: new google.maps.Size(2048, 1024), // The heading in degrees at the origin of the panorama // tile set. centerHeading: 105, getTileUrl: getCustomPanoramaTileUrl, }, }; } // @ts-ignore TODO fix typings return null; } window.initPano = initPano;
CSS
/* * Always set the map height explicitly to define the size of the div element * that contains the map. */ #map { height: 100%; } /* * Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; }
HTML
<html>
<head>
<title>Custom Street View Panoramas</title>
<link rel="stylesheet" type="text/css" href="./style.css" />
<script type="module" src="./index.js"></script>
</head>
<body>
<div id="map"></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=initPano&v=weekly"
defer
></script>
</body>
</html>Özel panorama sağlayıcı, iletilen panorama kimliği, yakınlaştırma seviyesi ve panorama parça koordinatları göz önünde bulundurularak uygun döşemeyi döndürür.
Resim seçimi bu iletilen değerlere bağlı olduğundan, bu iletilen değerler göz önünde bulundurularak programatik olarak seçilebilecek resimleri adlandırmak faydalıdır. Örneğin, pano_zoom_tileX_tileY.png.
Aşağıdaki örnekte, varsayılan Street View gezinme oklarına ek olarak, Google Sidney'e doğru yönelen ve özel görüntülere bağlanan başka bir ok eklenmektedir:
TypeScript
let panorama: google.maps.StreetViewPanorama; // StreetViewPanoramaData of a panorama just outside the Google Sydney office. let outsideGoogle: google.maps.StreetViewPanoramaData; // StreetViewPanoramaData for a custom panorama: the Google Sydney reception. function getReceptionPanoramaData(): google.maps.StreetViewPanoramaData { return { location: { pano: "reception", // The ID for this custom panorama. description: "Google Sydney - Reception", latLng: new google.maps.LatLng(-33.86684, 151.19583), }, links: [ { heading: 195, description: "Exit", pano: (outsideGoogle.location as google.maps.StreetViewLocation).pano, }, ], copyright: "Imagery (c) 2010 Google", tiles: { tileSize: new google.maps.Size(1024, 512), worldSize: new google.maps.Size(2048, 1024), centerHeading: 105, getTileUrl: function ( pano: string, zoom: number, tileX: number, tileY: number ): string { return ( "https://developers.google.com/maps/documentation/javascript/examples/full/images/" + "panoReception1024-" + zoom + "-" + tileX + "-" + tileY + ".jpg" ); }, }, }; } function initPanorama() { panorama = new google.maps.StreetViewPanorama( document.getElementById("street-view") as HTMLElement, { pano: (outsideGoogle.location as google.maps.StreetViewLocation).pano } ); // Register a provider for the custom panorama. panorama.registerPanoProvider( (pano: string): google.maps.StreetViewPanoramaData => { if (pano === "reception") { return getReceptionPanoramaData(); } // @ts-ignore TODO fix typings return null; } ); // Add a link to our custom panorama from outside the Google Sydney office. panorama.addListener("links_changed", () => { if ( panorama.getPano() === (outsideGoogle.location as google.maps.StreetViewLocation).pano ) { panorama.getLinks().push({ description: "Google Sydney", heading: 25, pano: "reception", }); } }); } function initMap(): void { // Use the Street View service to find a pano ID on Pirrama Rd, outside the // Google office. new google.maps.StreetViewService() .getPanorama({ location: { lat: -33.867386, lng: 151.195767 } }) .then(({ data }: google.maps.StreetViewResponse) => { outsideGoogle = data; initPanorama(); }); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
let panorama; // StreetViewPanoramaData of a panorama just outside the Google Sydney office. let outsideGoogle; // StreetViewPanoramaData for a custom panorama: the Google Sydney reception. function getReceptionPanoramaData() { return { location: { pano: "reception", // The ID for this custom panorama. description: "Google Sydney - Reception", latLng: new google.maps.LatLng(-33.86684, 151.19583), }, links: [ { heading: 195, description: "Exit", pano: outsideGoogle.location.pano, }, ], copyright: "Imagery (c) 2010 Google", tiles: { tileSize: new google.maps.Size(1024, 512), worldSize: new google.maps.Size(2048, 1024), centerHeading: 105, getTileUrl: function (pano, zoom, tileX, tileY) { return ( "https://developers.google.com/maps/documentation/javascript/examples/full/images/" + "panoReception1024-" + zoom + "-" + tileX + "-" + tileY + ".jpg" ); }, }, }; } function initPanorama() { panorama = new google.maps.StreetViewPanorama( document.getElementById("street-view"), { pano: outsideGoogle.location.pano }, ); // Register a provider for the custom panorama. panorama.registerPanoProvider((pano) => { if (pano === "reception") { return getReceptionPanoramaData(); } // @ts-ignore TODO fix typings return null; }); // Add a link to our custom panorama from outside the Google Sydney office. panorama.addListener("links_changed", () => { if (panorama.getPano() === outsideGoogle.location.pano) { panorama.getLinks().push({ description: "Google Sydney", heading: 25, pano: "reception", }); } }); } function initMap() { // Use the Street View service to find a pano ID on Pirrama Rd, outside the // Google office. new google.maps.StreetViewService() .getPanorama({ location: { lat: -33.867386, lng: 151.195767 } }) .then(({ data }) => { outsideGoogle = data; initPanorama(); }); } window.initMap = initMap;
CSS
html, body { height: 100%; margin: 0; padding: 0; } #street-view { height: 100%; }
HTML
<html>
<head>
<title>Custom Street View Panorama Tiles</title>
<link rel="stylesheet" type="text/css" href="./style.css" />
<script type="module" src="./index.js"></script>
</head>
<body>
<div id="street-view"></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=initMap&v=weekly"
defer
></script>
</body>
</html>