Pytanie Jak sprawdzić, czy panorama ulicy jest dostępna w pomieszczeniu lub na zewnątrz


Obecnie coraz więcej firm korzysta z widoku ulicy, aby wyświetlać apartamenty z wnętrza.

Mój program umożliwia wyświetlanie widoku ulicy zgodnie z wybranym biznesem. Ale nie chcę pokazywać w domu. Tylko na zewnątrz. Ponieważ Indoors blokuje mi ruch, tylko po to, by obrócić się o 360 stopni.

Czy ktoś wie, jak pobrać z interfejsu API widoku ulicy jakąś wartość, jeśli mam wyświetlać w pomieszczeniu lub na zewnątrz? 

Dziękuję Ci bardzo,

To są moje fragmenty kodu do tej pory, które otwierają widok ulicy zgodnie z wybranym adresem:

function load_map_and_street_view_from_address(address) {

var geocoder = new google.maps.Geocoder();
geocoder.geocode( {
    'address': address
}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
        var gps = results[0].geometry.location;
        create_map_and_streetview(gps.lat(), gps.lng(), 'map_canvas', 'pano');
    }
 });
}


function create_map_and_streetview(lat, lng, map_id, street_view_id) {
var googlePos = new google.maps.LatLng(lat,lng);

addLatLng = new google.maps.LatLng(lat,lng);
var service = new google.maps.StreetViewService();
service.getPanoramaByLocation(addLatLng, 50, showPanoData);

}

function showPanoData(panoData, status) {
if (status != google.maps.StreetViewStatus.OK) {
    $('#pano').html('No StreetView Picture Available').attr('style', 'text-align:center;font-weight:bold').show();
    return;
}
$('#pano').show();
var angle = computeAngle(addLatLng, panoData.location.latLng);

var panoOptions = {
    position: addLatLng,
    addressControl: false,
    linksControl: false,
    panControl: false,
    zoomControlOptions: {
        style: google.maps.ZoomControlStyle.SMALL
    },
    pov: {
        heading: angle,
        pitch: 10,
        zoom: 1
    },
    enableCloseButton: true,
    visible:true
};

panorama.setOptions(panoOptions);

}

function computeAngle(endLatLng, startLatLng) {
var DEGREE_PER_RADIAN = 57.2957795;
var RADIAN_PER_DEGREE = 0.017453;

var dlat = endLatLng.lat() - startLatLng.lat();
var dlng = endLatLng.lng() - startLatLng.lng();

var yaw = Math.atan2(dlng * Math.cos(endLatLng.lat() * RADIAN_PER_DEGREE), dlat)
* DEGREE_PER_RADIAN;
return wrapAngle(yaw);
}

function wrapAngle(angle) {
if (angle >= 360) {
    angle -= 360;
} else if (angle < 0) {
    angle += 360;
}
return angle;
};

Główną ideą było zdobycie lokalizacji Panoramy i weryfikacja odległości do najbliższych miejsc wokół 360 stopni.


16
2018-02-10 10:06


pochodzenie


Wygląda na to, że podobne żądania zostały zgłoszone jako błędy / ulepszenia: code.google.com/p/gmaps-api-issues/issues/... - JSuar
Nie zamieszczam tego jako odpowiedzi, ponieważ może się to zmienić każdego dnia, ale na razie odkryłem, że każda właściwość pliku panorama.links ma właściwość opisową (zawierającą nazwę ulicy), jeśli lokalizacja panoramy znajduje się na zewnątrz i jest pusta, jeśli znajduje się w pomieszczeniu , więc na tej podstawie możesz sprawdzić, czy (panorama.links.length === 0 || panorama.links[0].description == ""), powinien zwracać wartość true, jeśli znajduje się w pomieszczeniu. Powinienem dodać, że nie testowałem go zbyt szeroko, więc nie jestem pewien, czy to się uda. I wierzę, że wkrótce to się zmieni - yoelp
Dzięki, pozwól mi sprawdzić swoją drogę - Maxim Shoustin
Twój przepływ działa dobrze, problemem jest to, że w przeciwnym razie potrzebuję otworzyć widok ulicy dla każdej lokalizacji panorama.links jest undefined. Zamierzam poszukać sposobu, aby nie otwierać widoku ulicy, tylko po to, by korzystać z jego interfejsu API. Dzięki i tak - Maxim Shoustin
Masz rację. Możesz zobaczyć, stosując parametr pano_id w wyniku, do tego interfejsu API cbk0.google.com/... , że najbliższa panorama znaleziona przez interfejs API dla tej lokalizacji znajduje się na zewnątrz budynku. Będę dalej badać :) - Ido.Co


Odpowiedzi:


Nie mogę znaleźć dla tego żadnego oficjalnego API (może w przyszłości zaimplementują je) i nie sądzę, że możesz mieć pewność, że kafelki wewnętrzne będą opatrzone pustym opisem.

To, co dla mnie działa, to używanie tego interfejsu API: Uruchom HTTP GET na ten adres: "http://cbk0.google.com/cbk?output=xml&ll=52.358445,4.88103"z ll = LONG, LAT

To jest wewnętrzny interfejs API służący do znajdowania docelowej lokalizacji pano_id. Daje nam też trochę informacji o tym, co możemy z nim zrobić: poziomy powiększenia, na jakich ulicach się znajdujesz itp.

Zauważyłem, że wszystkie wyniki dla współrzędnych, które mają obrazy z widokiem z ulicy, mają scene="_number" level_id="_id"  w data_properties znacznik panoramy. W związku z tym dla każdej lokalizacji można uruchomić to żądanie i poszukać tych wartości w właściwości data_profile wynikowego pliku XML

kilka przykładów:

indoors:
http://cbk0.google.com/cbk?output=xml&ll=52.358445,4.88103
http://maps.google.com/cbk?output=xml&ll=32.051626,34.7613

outdoors:
http://cbk0.google.com/cbk?output=xml&ll=52.358766,4.880494
http://maps.google.com/cbk?output=xml&ll=32.07782,34.785789

Źródło: Hakowanie widoku ulicy w Google

Aktualizacja

Wygląda na to, że aby lokalne firmy miały prawa do pano_id, musisz je dodać &it=all do wniosku przykład:

http://cbk0.google.com/cbk?output=xml&hl=x-local&ll=34.058593,-118.240673&it=all

to jest odpowiedni parametr pano_id dla tego miejsca, możesz go zweryfikować za pomocą tego interfejsu API

http://cbk0.google.com/cbk?output=tile&panoid=70o9Pukc2KSjO-PfeHussw&zoom=3&x=5&y=1

9
2018-02-22 08:16



Jeśli w ciągu najbliższych 2 dni - żadnych innych wyborów, 50 punktów do ciebie, dzięki - Maxim Shoustin
Świetny kolega z pracy, :) dziękuję! - Maxim Shoustin


Oto prośba o funkcję przesłana do Google:
"Opcja wyłączenia wewnętrznych widoków ulicy"
https://code.google.com/p/gmaps-api-issues/issues/detail?id=4831

Zapraszam do zagrania w bilet, aby pomóc mu zwrócić na siebie uwagę

(Czy to jest w porządku etykieta? ... nie jest to prawdziwa odpowiedź (jeszcze), ale wydaje się godna dzielenia się tutaj, aby zainteresowane strony mogły zaznaczyć / śledzić bilet)


2
2018-04-11 22:30



Tak, to dobra informacja. Irytująca brakująca funkcja, bilet oznaczony gwiazdką. Mam nadzieję, że zwróci na to uwagę. - mahalie


Możliwość odfiltrowania panoram z wnętrza ulicy została zaimplementowana w Google Maps JavaScript API jakiś czas temu.

Możesz użyć StreetViewService do wyszukiwania tylko panoram zewnętrznych. W żądaniu powinieneś podać źródło jako zewnętrzne

https://developers.google.com/maps/documentation/javascript/reference/3/#StreetViewSource

Spójrz na poniższy przykładowy kod, który pokazuje, jak uzyskać tylko panoramy zewnętrzne

var panorama;
function initialize() {
    var svService = new google.maps.StreetViewService();
    var panoRequest = {
        location: new google.maps.LatLng(37.800953,-122.436738),
        preference: google.maps.StreetViewPreference.NEAREST,
        radius: 50,
        source: google.maps.StreetViewSource.OUTDOOR
    };

    svService.getPanorama(panoRequest, function(panoData, status){
        if (status === google.maps.StreetViewStatus.OK) {
            panorama = new google.maps.StreetViewPanorama(
                document.getElementById('street-view'),
                {
                    pano: panoData.location.pano,
                    pov: {
                        heading: 10,
                        pitch: 10
                    }
                });
        } else {
            //Handle other statuses here
        }
    });
}
html, body {
  height: 100%;
  margin: 0;
  padding: 0;
}
#street-view {
  height: 100%;
}
<div id="street-view"></div>
<script async defer
         src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDztlrk_3CnzGHo7CFvLFqE_2bUKEq1JEU&callback=initialize">
    </script>

Mam nadzieję, że to pomoże!


2
2018-03-19 13:34