Facing the targeted building with Google StreetView

后端 未结 1 1414
孤城傲影
孤城傲影 2020-12-07 04:48

My question is very straightforward.

I need the heading value to know how to target the POV.

sv.getPanoramaByLocation() in this c

1条回答
  •  既然无缘
    2020-12-07 05:47

    Geocode the address of the building you want to "look at". Use the geometry library computeHeading(from:LatLng, to:LatLng) function to calculate the heading between the StreetView location and the building.

    (assumes that the geocoder returns a "rooftop" geocode)

    example (Statue of Liberty)

    another option, use the directions service:

    related question: Request main road StreetView panoramas instead of back alleys from API

    code snippet that uses the directions service to get a location on the road to use for street view "camera" location (works better now that you can get "interior" streetview locations returned):

    var map;
    var berkeley = new google.maps.LatLng(37.869085, -122.254775);
    var sv = new google.maps.StreetViewService();
    var geocoder = new google.maps.Geocoder();
    var directionsService = new google.maps.DirectionsService();
    var panorama;
    var myLatLng;
    var address = "525 Beacon St. Boston, MA";
    
    function initialize() {
    
      panorama = new google.maps.StreetViewPanorama(document.getElementById("pano"));
    
    
      directionsService.route({
        origin: address,
        destination: address,
        travelMode: google.maps.TravelMode.DRIVING
      }, function(response, status) {
        if (status == google.maps.DirectionsStatus.OK) {
          // myLatLng = response.routes[0].legs[0].start_location;
          sv.getPanoramaByLocation(response.routes[0].legs[0].start_location, 50, processSVData);
    
          var marker = new google.maps.Marker({
          position: response.routes[0].legs[0].start_location,
          map: map,
          title: "Directions"
        });
          map.setCenter(myLatLng);
    
    } else document.getElementById('info').innerHTML += "status:"+status+"
    "; }); geocoder.geocode({ 'address': address }, geocoderCallback); // Set up the map var myOptions = { zoom: 15 }; map = new google.maps.Map(document.getElementById('map_canvas'), myOptions); } google.maps.event.addDomListener(window, 'load', initialize); function processSVData(data, status) { if (status == google.maps.StreetViewStatus.OK) { panorama.setPano(data.location.pano); var camera = new google.maps.Marker({ position: data.location.latLng, map: map, draggable: true, title: "camera" }); var heading = google.maps.geometry.spherical.computeHeading(data.location.latLng, myLatLng); document.getElementById('info').innerHTML += "heading:"+heading+"
    " + "location: "+myLatLng.toUrlValue(6)+"
    " + "camera:"+data.location.latLng.toUrlValue(6)+"
    "; // alert(data.location.latLng+":"+myLatLng+":"+heading); panorama.setPov({ heading: heading, pitch: 0, zoom: 1 }); panorama.setVisible(true); } else { alert("Street View data not found for this location."); } } function geocoderCallback(results, status) { if (status == google.maps.GeocoderStatus.OK) { myLatLng = results[0].geometry.location; map.setCenter(myLatLng); if (results[0].geometry.viewport) map.fitBounds(results[0].geometry.viewport); else if (results[0].geometry.bounds) map.fitBounds(results[0].geometry.bounds); else map.setZoom(15); var marker = new google.maps.Marker({ position: myLatLng, map: map, title: address }); } else { alert("Geocode was not successful for the following reason: " + status); } };
    html,
    body {
      height: 100%;
      margin: 0;
      padding: 0;
    }
    #map_canvas {
      height: 100%;
    }
    
    
    

    0 讨论(0)
提交回复
热议问题