Обнаружение "у нас нет изображений" google maps street view статические изображения
Я создаю статические изображения уличного вида, например:
https://maps.googleapis.com/maps/api/streetview?size=1080x400&location=%s&fov=90&heading=235&pitch=0&key=%s
Если вы посетите эту ссылку, вы увидите изображение, в котором говорится: "Извините, у нас нет изображений для этого..."
Есть ли способ обнаружить это "извините" состояние, чтобы я мог вернуться к другому изображению?
Ответы
Ответ 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"
}