2011-08-15 7 views
35

현재 Google Street View Panorama embed을 사용하고 있으며 특정 주소에 대한 POV (더 구체적으로 표제)를 가져오고 싶습니다.Google StreetView API POV 얻기

Google은 maps.google.com을 통해 주소를 제공하며 주소를 입력하면 스트리트 뷰로 표시되며 올바른 방향으로 향하게됩니다. 그러나 API를 통해 POV 표제를 찾는 방법에 대한 설명서를 찾아서 찾지 못하는 것 같습니다.

LatLng으로 스트리트 뷰 임베드를 정상적으로 작동 시키지만 카메라가 일반적으로 잘못된 방향을 향하고 있습니다. 어떤 아이디어?

편집 : ... 명확

은 내가 POV를 설정하려면,하지만 난 그것에 설정 할 값을 모르는

가져 오거나 설정하려면

답변

38

필요한 주소의 latLng와 파노라마 위치의 latLng (이미지가 촬영 된 streetview 카의 위치)가 동일하지 않습니다. 내가 아는 한 API는 주소의 올바른 방향으로 제목을 설정하지 않으므로 직접 설정해야합니다.

이것은 내가 그것을 어떻게, 내가, 내가 얻을 수있는 다음 코드를 사용하고 가능한 가장 가까운 파노라마 샷을 찾기 위해 같이 StreetViewService을 사용하고 POV가 here

+13

신난다, 정확하게 대답은 내가 찾던 거리를 향하도록 제목을 설정하려면 원하는 – Tilman

+2

@manubkk jsfiddle을 추가 할 수 있습니까? – Omar

+1

이것에 대한 하나의 혼란스러운 부분은'computeHeading()'은 -180에서 180 사이의 숫자를 반환하는 반면 pov 객체의'heading' 속성은 0에서 360 사이의 값을 가질 것이라는 것입니다. 180에서'computeHeading()'의 결과는 트릭을 끝내지 만, 일관성없는 결과가 나타납니다. – Trevor

-3

는 말할 수 없다 http://code.google.com/apis/maps/documentation/javascript/services.html#StreetViewPanoramas

var panoramaOptions = { 
    position: fenway, 
    pov: { 
    heading: 34, 
    pitch: 10, 
    zoom: 1 
    } 
}; 

이 얻을 : 다음 POV

여기의 지침에 따라 설정

alert(panoramaOptions.pov.heading); 
+0

나는 그것을 설정하려면,하지만 난 그래서 당신은 –

+0

로 설정 해야할지 모르겠어. 구현을위한 추가 정보 : 매개 변수 라이브러리 = geometry를 사용하여 형상 라이브러리를로드해야합니다. getPanoramaByLocation() 사용을 사용하는 경우 콜백 함수에서 데이터 객체의 스트리트 뷰 자동차 위치의 LatLng 객체를 가져옵니다. var carLatLng = data.location.latLng; 표제를 계산하려면 표적의 LatLng 개체에 대해 다음을 사용합니다. var heading = google.maps.geometry.spherical.compute Heading (carLatLng, targetLatLng); setPov()와 함께 사용 – Galen

29

그냥 어떤 manubkk가 말했다는 computeHeading 방법을 사용하여 제목 계산이다 오른쪽 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 { 
     ... 
     } 

또 다른 트릭/트랩의 스트리트 뷰 (Street View)를 사용하는 것입니다 : 당신은 트럭의 위치와 집의 위치를 ​​확인하고 첫 번째 위치에서 두 번째로 "제목 것은"계산해야 가장 가까운 거리에 도달 할 때까지 거리가 멀어 질 때까지 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 : 예; 나는 그것을하는 더 좋은 방법을 좋아합니다. Google이 어떤 범위 내에서 가장 가까운보기를 얻을 수있는 방법이 없다는 것은 어리석은 것처럼 보입니다. –

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>