令人惊讶的是,Bing 似乎没有直接提供此功能。我本来希望图像元数据响应包含一个字段,该字段指示将在该位置返回有效图像的最高缩放级别。但是,zoomMin 和 zoomMax 似乎基本没用。通常你会注意到 zoomMax 的图像会返回一个“破碎”的图像,而实际的图像只能在较低的缩放级别下使用。
我创建了一个似乎效果很好的解决方法。当图像实际存在于您在图像元数据请求 url 中指定的缩放级别时,vintageStart(和 vintageEnd)字段似乎填充了值(例如“2006 年 1 月 31 日 GMT”)。当真实图像不可用时,vintageStart 和 vintageEnd 似乎设置为空。(我想知道这是否绝对可靠?)
您可以从级别 21 开始并降低缩放级别。可以假设填充了 vintageStart 的第一个级别是具有有效图像的最佳可用缩放级别。
深度 21:vintageStart 为空
http://dev.virtualearth.net/REST/V1/Imagery/Metadata/Aerial/40.714550167322159,-74.007124900817871?zl=21&key=BING_API_KEY
请注意,maxZoom 显示为 21,但您会看到这没有有效的图像。
深度 21:破损图像
http://dev.virtualearth.net/REST/V1/Imagery/Map/aerial/40.714550167322159,-74.007124900817871/21?key=BING_API_KEY
深度 20:vintageStart 已填充
http://dev.virtualearth.net/REST/V1/Imagery/Metadata/Aerial/40.714550167322159,-74.007124900817871?zl=20&key=BING_API_KEY
深度 20:有效图像:-)
http://dev.virtualearth.net/REST/V1/Imagery/Map/aerial/40.714550167322159,-74.007124900817871/20?key=BING_API_KEY
PHP中的示例代码...
function getHighestZoomAtLocation($lon, $lat){
//Add extra zoom levels to check if necessary
foreach(array(21, 20, 19, 18) as $zoom){
$url = "http://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/{$lat},{$lon}?&zoomLevel={$zoom}&key=BING_API_KEY";
$imagery_meta_data_raw = file_get_contents($url);
$imagery_meta_data = json_decode($imagery_meta_data_raw, true);
if(!empty($imagery_meta_data['resourceSets'][0]['resources'][0]['imageUrl']) && !empty($imagery_meta_data['resourceSets'][0]['resources'][0]['vintageStart'])){
return $zoom;
}
}
return false;
}
(请注意,如果广泛使用这种方法可能会耗尽您的交易配额)