2011-08-15 8 views
35

私は現在Google Street View Panorama embedを使用しており、特定の住所のPOV(具体的に見出し)を取得したいと考えています。Google StreetView APIのPOVを取得

Googleはmaps.google.comでこれを行います。住所を指定すると、ストリートビューになり、正しい向きになります。しかし、私はAPIを介してPOVの見出しを見つける方法のためのドキュメントを見つけ出す/見つけることができません。

LatLngでストリートビューの埋め込み機能を正常に動作させることはできますが、通常はカメラの向きが間違っています。何か案は?

編集:あなたが取得または設定したい場合は明快

私はPOVを設定したいが、私はそれを設定する値が分からない...

答えて

38

必要なアドレスのlatLngとパノラマロケーションのlatLng(画像が撮影されたストリートビューカーの位置)は同じではありません。私が知る限り、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

に設定するのか分かりません。実装の詳細: ジオメトリライブラリをロードする必要があります。パラメータライブラリ=ジオメトリが必要です。 getPanoramaByLocation()を使用する場合、コールバック関数では、データオブジェクトからストリートビュー車の位置のLatLngオブジェクトを取得します。 var carLatLng = data.location.latLng; ターゲットのLatLngオブジェクトに対してこれを使用して、見出しを計算します。 var heading = google.maps.geometry.spherical.computeHeading(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

-1

POVを通りに向かって、または90度右/左をその通りに設定したい場合は、解決策を実装しました。

Google Street View heading issue

私はそれが役立つことを願っています。

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

@トレヴァー:そうです。私はそれをするより良い方法が大好きです。 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> 
関連する問題