обнаружение "у нас нет изображений" карт Google просмотр улиц статические изображения - PullRequest
13 голосов
/ 20 октября 2011

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

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

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

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

Ответы [ 6 ]

7 голосов
/ 04 ноября 2011

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

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

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

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

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

3 голосов
/ 19 декабря 2012

эта ситуация уже встроена в версию 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);
        }
1 голос
/ 06 июня 2017

С 2016 года вы можете использовать новый API метаданных изображений для просмотра улиц .

Теперь вам просто нужно 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"
}
1 голос
/ 26 октября 2011

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

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

0 голосов
/ 19 мая 2015

Запрос изображения 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(); 
...