我正在生成街景静态图像,如下所示:
如果您访问该链接,您会看到一张图片,上面写着“抱歉,我们没有这方面的图片......”
有什么方法可以检测到这种“抱歉”状态,以便我可以退回到另一张图片?
我正在生成街景静态图像,如下所示:
如果您访问该链接,您会看到一张图片,上面写着“抱歉,我们没有这方面的图片......”
有什么方法可以检测到这种“抱歉”状态,以便我可以退回到另一张图片?
一种快速的解决方案是使用 xmlrpc 加载图像文件并检查它的 md5sum 是否为30234b543d5438e0a0614bf07f1ebd25
,或者它的大小是否为1717
字节(另一个图像不太可能具有完全相同的大小),但这不是很健壮,因为我已经看到 Google 更改文本在图像中的位置。尽管对于原型来说这是一个很好的开始。
您可以改为进行图像处理。请注意,由于 Google 可以决定随时更改图像的外观,因此它仍然不是非常强大。你必须决定它是否值得。
无论如何,这里是我将如何使用 jQuery:
我不建议直接测试 RGB 值的原因是因为 JPEG 解压缩在不同浏览器上的行为可能略有不同。
由于布尔测试状态=== streetviewStatus,这种情况已经在3.0版本中内置。好的,这是我解决情况的片段
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);
}
您可以使用 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>
}
}
自 2016 年起,您可以使用新的Street View Image Metadata API。
现在您只需要该status
字段即可知道是否找到了全景图。
示例请求:
{
"status" : "ZERO_RESULTS"
}
{
...
"status" : "OK"
}
请求谷歌街景图像,如果它具有特定的文件大小,则它是“不可用的街景”。我做了以下操作:
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();
另一种方法是加载图像,然后比较一些像素颜色。谷歌的“无街景”图像总是一样的。以下是比较 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 更改返回的图像,此代码将中断。