【问题标题】:Getting the POV for Google StreetView API获取 Google StreetView API 的 POV
【发布时间】:2011-08-15 17:32:10
【问题描述】:

我目前正在使用Google Street View Panorama embed,我想获取特定地址的 POV(更具体地说是标题)。

Google 通过maps.google.com 执行此操作,在给定地址后,它会将您带到街景中,并且它会面向正确的方向。但是,我似乎无法找出/找到通过 API 查找 POV 标题的方法的文档。

我可以使用LatLng 让街景嵌入功能正常工作,但摄像头通常朝向错误的方向。有什么想法吗?

编辑:清晰

我想设置 POV,但我不知道将其设置为什么值...

【问题讨论】:

    标签: google-maps google-street-view


    【解决方案1】:

    所需地址的latLng和全景位置的latLng(街景车拍摄图像的位置)不一样。据我所知,API 没有将标题设置为地址 latlng 的正确方向,您必须自己设置。

    我就是这样做的,我使用 StreetViewService 找到最近的可用全景照片,然后使用 computeHeading 方法 here 计算 Pov 航向

    【讨论】:

    • 太棒了,正是我正在寻找的答案。更多实现信息:您需要加载几何库:参数库=几何。如果您使用 getPanoramaByLocation(),在您的回调函数中,您会从数据对象中获取街景汽车位置的 LatLng 对象:var carLatLng = data.location.latLng;并针对目标的 LatLng 对象使用它来计算航向: var heading = google.maps.geometry.spherical.computeHeading(carLatLng, targetLatLng);与 setPov() 一起使用
    • 一个令人困惑的部分是 computeHeading() 返回一个介于 -180 到 180 之间的数字,而 pov 对象的 heading 属性预计在 0 到 360 之间。会假设只需将 180 添加到 computeHeading() 的结果就可以了,但我得到的结果不一致。
    • 它应该双向工作,查看他们的示例 (developers.google.com/maps/documentation/javascript/examples/…),他们已将初始航向设置为 270,但是当您四处移动时 getPov() 返回 -90 而不是设置的 270 .
    【解决方案2】:

    正如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
        }
    });
    

    【讨论】:

      【解决方案3】:

      这样做的原因是街景 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);
                  }
              });
          }
      

      【讨论】:

      • 我不知道这是否是最佳实践,但增量效果很好。
      • @Trevor:是的;我喜欢更好的方式来做到这一点。谷歌没有办法在一定范围内获得最近的视图,这似乎很愚蠢。
      【解决方案4】:

      我发现这个页面很有帮助,谢谢你们。我仍然需要从这个和一些来源中拼凑出完整的解决方案,所以我想我会把它包括在这里给你。

      <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>
      

      【讨论】:

        【解决方案5】:

        如果您想将 POV 设置为朝向街道或分别与该街道成 90 度右/左,我已经实施了一个解决方案。

        Google Street View heading issue

        我希望这会有所帮助。

        【讨论】:

          【解决方案6】:

          不知道你是想获取还是设置 POV

          按照此处的说明进行设置:http://code.google.com/apis/maps/documentation/javascript/services.html#StreetViewPanoramas

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

          得到:

          alert( panoramaOptions.pov.heading );
          

          【讨论】:

          • 我想设置,但不知道设置什么
          • 所以你想将航向设置为面向街道
          猜你喜欢
          • 2023-03-25
          • 2014-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-25
          相关资源
          最近更新 更多