Как я могу определить, что API Google Streetview Image возвращает «Извините, у нас нет изображения» (т. Е. NULL) Результат? - PullRequest
17 голосов
/ 21 марта 2012

API Google Street View Image позволяет встраивать статическую (неинтерактивную) панораму или миниатюру Street View в веб-страницу без использования JavaScript.

URL запроса:http://maps.googleapis.com/maps/api/streetview?parameters

+ Проблема +

Если я даю ему адрес, для которого у него нет StreetView, он возвращает изображение, которое говорит: «Извините, у нас нет изображений здесь».

Исходя из текущего API, У меня нет возможности определить, нашел он StreetView или нет .У кого-нибудь есть взлом или предложение для выяснения этого?

+ Примеры +

Правильный просмотр улиц: http://maps.googleapis.com/maps/api/streetview?size=300x300&sensor=false&location=100+Highland+Ave+Baltimore,+MD+21224

Извините Просмотр улиц: http://maps.googleapis.com/maps/api/streetview?size=300x300&sensor=false&location=1600+Pennsylvania+Ave,+Washington,+DC+20500

Ответы [ 8 ]

6 голосов
/ 10 июня 2012

Рассмотрите возможность использования объектов StreetViewService и StreetViewStatus в Картах Google: https://developers.google.com/maps/documentation/javascript/streetview#StreetViewService

По сути, вам нужно создать объект StreetViewService, который попытается найти панораму на основе местоположения, используя метод getPanoramaByLocation(latlng:LatLng, radius:number, callback:function(StreetViewPanoramaData, StreetViewStatus)).

В функции обратного вызова есть условный аргумент, который будет проверять доступность данных if (status == google.maps.StreetViewStatus.OK). На основе логического возврата выполните нужные действия. Первая ссылка, которую я предоставил, получила отличный пример использования этих методов.

Примечание: я также заметил, что у вас есть местоположения на основе адресов. Это можно просто преобразовать в LatLng с помощью службы геокодирования (https://developers.google.com/maps/documentation/javascript/geocoding)

4 голосов
/ 25 ноября 2016

Просто запросите Метаданные изображений улиц API.

Это новая функция, добавленная в API-интерфейс Street View Image в ноябре 2016 года, которая позволяет запрашивать доступность панорам Street View в заданных местах (адрес или адрес) или даже идентификаторов панорамы. Эти запросы бесплатны.

3 голосов
/ 18 октября 2012

Кажется, что Google использует конечную точку json за кулисами. Я думаю, это то, что вы ищете http://andresmartinezsoto.wordpress.com/category/computing/google-maps-api/

Возвращает пустой объект ({}), когда изображение недоступно.

Ранее я использовал запрос HEAD для получения длины содержимого и сравнивал его, чтобы узнать, существует изображение или нет.

2 голосов
/ 14 января 2014

Это работает для меня:

$(function() {
    $('img[src*="maps.googleapis.com"]').each(
        function(){
             $(this).hide();  // you may want to replace this with a css rule
             var img=($(this).attr('src'));
             var xhr = new XMLHttpRequest();
             xhr.img=$(this);
             xhr.open("GET", img, true);
             xhr.responseType = "arraybuffer";
             xhr.onreadystatechange = function() {
                 if(this.readyState == this.DONE) {
                     if (this.response.byteLength!=8381) this.img.fadeIn();
                     // Here is a good place to measure the byteLength of 
                     // grey images in your requested size  
                 }
             };
             xhr.send(null);
        });
});        

Вы можете добавить правило CSS:

img[src*="maps.googleapis.com"] {display:none;}

Вместо строки:

$(this).hide();

Что гладче.

Обратите внимание, что длина содержимого ответа для серого изображения может варьироваться в зависимости от размеров, указанных в вашем запросе, поэтому обязательно протестируйте и замените this.response.byteLength!=8381 на то, что вы получите для своего конкретного размера. 8381 - правильное значение для 600 x 600 изображений.

Кроме того, Google может изменить отсутствующее изображение или местоположение текста на нем, поэтому необходимо тщательное тестирование.

Метод, который следует рассмотреть, заключается в проверке, является ли response.byteLength на выше данного порогового значения, серые изображения, являющиеся отличными целями для сжатия, обычно намного меньше, чем реальные изображения.

2 голосов
/ 02 августа 2012

Я написал небольшой взлом для этой проблемы. В основном он использует этот плагин для получения BASE64 изображения, рисует его на холсте (с видимостью «скрытый») и проверяет цвет изображения, возвращаемого Google.

 function checkImage(url){

        var error_image_color = {
            0: 228,
            1: 227,
            2: 223,
            3: 255
        }

        $.getImageData({
            url: url,
            success: function(image){
                var append_img = $(image);
                var img_base64 = $(image).attr('src');
                var image = new Image();
                image.src = img_base64;
                var canvas = document.getElementById('canvas').getContext('2d');
                canvas.drawImage(image, 0, 0);
                var data = canvas.getImageData(10, 10, 1, 1).data;

                if (data[0] != error_image_color[0]){
                    $('body').append(append_img);                       
                }
            },
            error: function(a,b,c){
                console.log([a,b,c]);
            }
        });

}
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 голосов
/ 23 января 2015

Еще один вариант - проверить размер ответа. Размер байта серого изображения «Нет изображения» зависит от требуемой ширины и высоты. Тем не менее, он намного меньше, чем существующее изображение. Например, с angularJS:

$http.get("https://maps.googleapis.com/maps/api/streetview?size=600x300&location=46.404382,10.013988")
    .success(function(response) { 
        if(response.length < 5000) {
            console.log("This is a no-image image");
            }
    });
0 голосов
/ 16 февраля 2013

Ну, вы легко можете проверить размер возвращаемого файла.

Я пишу свое решение на примере PHP.Эта функция имеет два входа: URL-адрес API Google Streat View и размер «Пустое изображение».

<?
function street_view_check($url,$size_of_blank_image){
    $str=file_get_contents($url);
   if(strlen($str)==$size_of_blank_image){
            return false;
   }
   return true;
}

 $url1="http://maps.googleapis.com/maps/api/streetview?size=640x480&location=40.648215,-8.624296&fov=90&heading=$i&pitch=0&sensor=false";
 $url2="http://maps.googleapis.com/maps/api/streetview?size=640x480&location=41.157207,-8.62378&fov=90&heading=$i&pitch=0&sensor=false";

 echo street_view_check($url1,6778);
 echo street_view_check($url2,6778);
?>
...