2011-08-15 85 views
35

我目前使用的是Google Street View Panorama embed,我想獲取特定地址的POV(更具體的標題)。獲取谷歌StreetView API的POV

Google會通過maps.google.com來做到這一點,在給定地址的情況下,它會讓您進入街景並且會面臨正確的方向。但是,我似乎無法找到/查找通過API查找POV標題的文檔。

我可以將街景視圖嵌入到LatLng,但攝像機通常會面臨錯誤的方向。有任何想法嗎?

編輯:清晰度

我想設置POV,但我不知道是什麼價值,將其設置爲...

如果你想獲取或設置

回答

38

所需地址的latLng和全景位置的latLng(從拍攝圖像的街景車的位置)是不一樣的。據我所知,API不會將地址latlng的標題設置爲正確的方向,您必須自己設置它。

這是我做到了,我用了StreetViewService找到最近的全景拍攝使用,然後計算出過氧化值使用computeHeading方法here

+13

真棒,準確的答案我一直在尋找。一些實現的更多信息: 您需要加載幾何庫:參數庫=幾何。 如果您在回調函數中使用getPanoramaByLocation(),您將從數據對象中獲取街景車的位置的LatLng對象: var carLatLng = data.location.latLng; 並將其用於您的目標的LatLng對象以計算標題: var heading = google.maps.geometry.spherical.computeHeading(carLatLng,targetLatLng); 使用setPov() – Tilman

+2

@manubkk你可以添加一個jsfiddle嗎? – Omar

+1

一個令人困惑的部分是'computeHeading()'返回-180到180範圍內的數字,而pov對象的'heading'屬性預計在0到360之間。我假設簡單地添加180'computeHeading()'的結果本來可以做到,但是我得到的結果不一致。 – Trevor

29

究竟是什麼manubkk該航向,我使用下面的代碼來獲得正確的航向SV

var $this = $(this), 
    _lat = $this.data("lat"), 
    _lng = $this.data("lng"), 
    streetViewMaxDistance = 100;   

var point = new google.maps.LatLng(_lat,_lng); 
var streetViewService = new google.maps.StreetViewService(); 
var panorama = spaces.map.map.getStreetView(); 

// We get the map's default panorama and set up some defaults. 
    // Note that we don't yet set it visible. 


//panorama = spaces.map.map.getStreetView(); 

streetViewService.getPanoramaByLocation(point, streetViewMaxDistance, function (streetViewPanoramaData, status) { 

    if(status === google.maps.StreetViewStatus.OK){ 

     var oldPoint = point; 
      point = streetViewPanoramaData.location.latLng; 

     var heading = google.maps.geometry.spherical.computeHeading(point,oldPoint);    

     panorama.setPosition(point); 
     panorama.setPov({ 
      heading: heading, 
      zoom: 1, 
      pitch: 0 
     }); 
     panorama.setVisible(true); 

    }else{ 
     $this.text("Sorry! Street View is not available."); 
     // no street view available in this range, or some error occurred 
    } 
}); 
+0

工作很好 - 謝謝! – Yarin

4

原因是街景POV默認爲卡車在拍攝圖像時所面對的方向(轉到圖)。你需要得到卡車的位置和房子的位置,並計算出一個「標題」從第一位置到第二:使用街景

// adrloc=target address 
// svwloc=street-view truck location 
svwService.getPanoramaByLocation(adrloc,svwdst,function(dta,sts) { 
    if(sts==google.maps.StreetViewStatus.OK) { 
     var svwloc=dta.location.latLng; 
     var svwhdg=google.maps.geometry.spherical.computeHeading(svwloc,adrloc); 
     var svwmap=avwMap.getStreetView(); 
     svwmap.setPosition(svwloc); 
     svwmap.setPov({ heading: svwhdg, pitch: 0 }); 
     svwMarker=new google.maps.Marker({ map:svwmap, position: adrloc }); 
     svwmap.setVisible(true); 
     } 
    else { 
     ... 
     } 

另一個技巧/陷阱是,你需要獲得通過反覆調用getPanoramaByLocation,以增加距離,直到您成功或達到某個最大距離,您的地址位置的最近街道視圖。我使用此代碼解決此問題:

var SVW_MAX=100; // maximum street-view distance in meters 
var SVW_INC=10; // increment street-view distance in meters 
var svwService=new google.maps.StreetViewService(); // street view service 
var svwMarker=null; // street view marker 

// NOTE: avwMap is the aerial view map, code not shown 
... 
resolveStreetView(avwMap.getCenter(),SVW_INC); 
... 

var resolveStreetView=function(adrloc,svwdst) { 
    svwService.getPanoramaByLocation(adrloc,svwdst,function(dta,sts) { 
     if(sts==google.maps.StreetViewStatus.OK) { 
      var svwloc=dta.location.latLng; 
      var svwhdg=google.maps.geometry.spherical.computeHeading(svwloc,adrloc); 
      var svwmap=avwMap.getStreetView(); 
      svwmap.setPosition(svwloc); 
      svwmap.setPov({ heading: svwhdg, pitch: 0 }); 
      svwMarker=new google.maps.Marker({ map:svwmap, position: adrloc }); 
      svwmap.setVisible(true); 
      } 
     else if(svwdst<SVW_MAX) { 
      resolveStreetView(adrloc,svwdst+SVW_INC); 
      } 
     }); 
    } 
+0

我不知道這是否是最佳做法,但增量效果很好。 – Trevor

+0

@Trevor:是的;我喜歡更好的方式來做到這一點。谷歌無法在一定範圍內獲得最接近的觀點似乎很愚蠢。 –

2

我發現此頁面非常有幫助,謝謝你們。我仍然需要從這個和幾個來源拼湊完整的解決方案,所以我想我會在這裏爲你包括它。

<script> 
var panorama; 

    function loadStreetView() { 

    var _lat = your_lat; 
    var _lng = your_long; 

    var target = new google.maps.LatLng(_lat,_lng); 

    var sv = new google.maps.StreetViewService(); 

    panorama = new google.maps.StreetViewPanorama(document.getElementById('hero-street-view')); 

    var pano = sv.getPanoramaByLocation(target, 50, function(result, status) { 

     if (status == google.maps.StreetViewStatus.OK) { 

     var heading = google.maps.geometry.spherical.computeHeading(result.location.latLng, target); 

     panorama.setPosition(result.location.latLng); 
     panorama.setPov({ 
      heading: heading, 
      pitch: 0, 
      zoom: 1 
     }); 
     panorama.setVisible(true); 

     } 
     else { 

     console.log("Cannot find a street view for this property."); 
     return; 

     } 

    }); 
    } 

    </script> 

    <script async defer 
    src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=geometry&callback=loadStreetView"> 
    </script>