Подтвердить что ты не робот

Обнаружение "у нас нет изображений" google maps street view статические изображения

Я создаю статические изображения уличного вида, например:

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

Если вы посетите эту ссылку, вы увидите изображение, в котором говорится: "Извините, у нас нет изображений для этого..."

Есть ли способ обнаружить это "извините" состояние, чтобы я мог вернуться к другому изображению?

4b9b3361

Ответ 1

эта ситуация уже встроена в версию 3.0 из-за состояние булевского теста === streetviewStatus.Ok, вот фрагмент из моей ситуации, решая

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

Ответ 2

Одним из быстрых решений было бы загрузить файл изображения с помощью xmlrpc и проверить, что его md5sum 30234b543d5438e0a0614bf07f1ebd25, или его размер равен 1717 байтам (маловероятно, что другое изображение может иметь точно такой же размер), но это не очень надежный, так как я видел, как Google меняет положение текста на изображении. Хотя это очень хороший старт для прототипа.

Вместо этого вы можете использовать обработку изображений. Обратите внимание, что он по-прежнему не очень надежный, поскольку Google может в любое время изменить внешний вид изображения. Вы должны решить, стоит ли это.

В любом случае, вот как я буду делать это с помощью jQuery:

  • загрузите изображение и откройте 2D-контекст для прямого доступа к файлам (см. этот вопрос, как это сделать)
  • проанализировать изображение:
    • выборки групп из 2 × 2 пикселей в случайных местах; Я рекомендую не менее 30 групп.
    • группа из 2 × 2 пикселей хороша, если все пиксели имеют одинаковое значение, а их значения R/G/B не отличаются более чем на 10% (т.е. они серые).
    • подсчитать отношение хороших групп пикселей в изображении
  • Если есть более 70% хороших групп пикселей, то мы уверены, что это версия "no imagery": замените ее другим изображением по вашему выбору.

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

Ответ 3

Вы можете использовать функцию 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>
 }
}

Ответ 4

Запросить изображение улиц google google и, если у него есть определенный размер файла, это "Недоступно для просмотра улиц". Я сделал следующее:

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(); 

Ответ 5

Другой способ - загрузить изображение, а затем сравнить несколько цветов. Изображение "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 изменяет изображение, которое возвращает этот код, он сломается.

Ответ 6

По состоянию на 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=YOUR_API_KEY

{
   ...
   "status" : "OK"
}