откриваме, че нямаме изображения на статични изображения на google maps street view

Генерирам статични изображения за уличен изглед така:

https://maps.googleapis.com/maps/api/streetview?size=1080x400&location=%s&fov=90&heading=235&pitch=0&key=%s

Ако посетите тази връзка, ще видите изображение, което казва: „Съжаляваме, нямаме изображения за това...“

Има ли някакъв начин да се открие това състояние "съжалявам", за да мога да се върна към друго изображение?


person tester    schedule 20.10.2011    source източник


Отговори (6)


тази ситуация вече е вградена във версия 3.0 поради състоянието на булевия тест === streetviewStatus. Добре, ето фрагмент от моето решаване на ситуация

if (status === google.maps.StreetViewStatus.OK) {
            var img = document.createElement("IMG");
            img.src = 'http://maps.googleapis.com/maps/api/streetview?size=160x205&location='+ lat +','+ lng  +'&sensor=false&key=AIzaSyC_OXsfB8-03ZXcslwOiN9EXSLZgwRy94s';
            var oldImg = document.getElementById('streetViewImage');
            document.getElementById('streetViewContainerShow').replaceChild(img, streetViewImage);
        } else {
            var img = document.createElement("IMG");
            img.src = '../../images/ProfilnoProfilPicture.jpg';
            img.height = 205;
            img.width = 160;
            var oldImg = document.getElementById('streetViewImage');
            document.getElementById('streetViewContainerShow').replaceChild(img, streetViewImage);
        }
person thegrunt    schedule 19.12.2012
comment
Това работи частично, но имайте предвид, че JavaScript API може да върне панорами (ID на панорама близо до latlng), които не са налични в Street View Image API. Вижте code.google.com/p/gmaps-api-issues/issues/detail?id=10402 за пълни подробности. - person miguev; 25.11.2016

Едно бързо решение би било да заредите файла с изображение с помощта на xmlrpc и да проверите дали неговият md5sum е 30234b543d5438e0a0614bf07f1ebd25 или дали размерът му е 1717 байта (малко вероятно е друго изображение да има точно същия размер), но това не е много надеждно, тъй като съм виждал Google променя позицията на текста в изображението. Въпреки че е много добро начало за прототип.

Вместо това можете да използвате обработка на изображения. Имайте предвид, че все още не е напълно стабилен, тъй като Google може да реши да промени външния вид на изображението по всяко време. Ще трябва да решите дали си заслужава.

Както и да е, ето как бих го направил с помощта на jQuery:

  • заредете изображението и отворете 2D контекст за директен pxiel достъп (вижте този въпрос за това как да го направите)
  • analyse the image:
    • sample groups of 2×2 pixels at random locations; I recommend at least 30 groups
    • група от 2×2 пиксела е добра, ако всички пиксели имат еднаква стойност и техните R/G/B стойности не се различават с повече от 10% (т.е. те са сиви)
    • пребройте съотношението на добрите групи пиксели в изображението
  • ако има повече от 70% добри пикселни групи, тогава сме почти сигурни, че това е версията „без изображения“: заменете я с друго изображение по ваш избор.

Причината, поради която не препоръчвам да тествате директно за RGB стойност, е, че декомпресията на JPEG може да има малко по-различно поведение в различните браузъри.

person sam hocevar    schedule 04.11.2011
comment
Вижте stackoverflow.com/a/40803070/1069142 за по-надежден метод, който току-що стана достъпен. - person miguev; 25.11.2016

Можете да използвате функцията getPanoramaByLocation (вижте http://code.google.com/apis/maps/documentation/javascript/services.html#StreetViewService).

опитайте нещо подобно:

function handleMapClick()
{
 var ll= new google.maps.LatLng(latitude,longitude);
 sv.getPanoramaByLocation(ll, 50, processSVData);
}

function processSVData(data, status) {
 if (status==google.maps.StreetViewStatus.ZERO_RESULTS)
 {
   <DO SOMETHING>
 }
}
person mikescandy    schedule 26.10.2011
comment
Това работи частично, но имайте предвид, че JavaScript API може да върне панорами (ID на панорама близо до latlng), които не са налични в Street View Image API. Вижте code.google.com/p/gmaps-api-issues/issues/detail?id=10402 за пълни подробности. - person miguev; 25.11.2016

От 2016 г. можете да използвате новия API за метаданни за изображения на Street View.

Сега ви трябва само полето status, за да разберете дали панорама се намира.


Примерни заявки:

https://maps.googleapis.com/maps/api/streetview/metadata?size=600x300&location=78.648401,14.194336&fov=90&heading=235&pitch=10&key=YOUR_API_KEY

{
   "status" : "ZERO_RESULTS"
}


https://maps.googleapis.com/maps/api/streetview/metadata?size=600x300&location=eiffel%20tower,%20paris,%20france&heading=-45&pitch=42&fov=110&key=ВАШИЯ_API_KEY

{
   ...
   "status" : "OK"
}
person Thomas Orlita    schedule 06.06.2017

Заявете изображение на google street view и ако има конкретен размер на файла, това е „Не е наличен изглед на улицата“. Направих следното:

var url = 'google street view url';

var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'blob';

xhr.onload = function (e) {
  if (this.status == 200) {
    try {
      var image = new Blob([this.response], {type: 'image/jpeg'});

      if (image.size) {
        if (url.indexOf('640x640') > -1 && image.size === 8410) {
          // Not street view
        }

        if (url.indexOf('400x300') > -1 && image.size === 3946) {
           // Not street view
        }
      }
    } catch (err) {
      // IE 9 doesn't support blob
    }
  }
};

xhr.send(); 
person lata    schedule 19.05.2015
comment
хубаво проучване, но това винаги ще бъде една промяна на изображението от счупване. - person tester; 19.05.2015

Друг начин е да заредите изображението и след това да сравните цветовете на някои пиксели. Изображението „no streetview“ от Google винаги е едно и също. Ето как бихте сравнили 2 пиксела:

var url = STREETVIEWURL
var img = new Image();
// Add some info to prevent cross origin tainting
img.src = url + '?' + new Date().getTime();
img.setAttribute('crossOrigin', '');
img.crossOrigin = "Anonymous";
img.onload = function() {
    var context = document.createElement('CANVAS').getContext('2d');
    context.drawImage(img, 0, 0);
    //load 2 pixels.  I chose the first one and the 5th row
    var data1 = context.getImageData(0, 0, 1, 1).data;
    var data2 = context.getImageData(0, 5, 1, 1).data;
    console.log(data1);
    // google unknown image is this pixel color [228,227,223,255]
    if(data1[0]==228 && data1[1]==227 && data1[2]==223 && data1[3]==255 && 
                     data2[0]==228 && data2[1]==227 && data2[2]==223 && data2[3]==255){
        console.log("NO StreetView Available");
    }else{
         console.log("StreetView is Available");
    }
};

Някои потенциални проблеми: Виждал съм някои грешки при замърсяването на CrossOrigin. Освен това, ако Google промени върнатото изображение, този код ще се повреди.

person mogile_oli    schedule 01.04.2016