我试图要求谷歌街景图像,以便我可以渲染完整的全景在一个球体在3D。
不幸的是,这个API只允许请求高达120°FoV。理想情况下,我需要一个等长方形的图像,我可以投射到这个领域。
然后,我检查了Google Maps在请求全景图像以获取洞察力时所做的请求,发现它发出的请求类似于以下内容:
在https://geo0.ggpht.com/cbk?cb_client=maps_sv.tactile&panoid=${panorama_id}&output=tile&x=${tile_x}&y=${tile_y}&zoom=${zoom_level}&nbt&fover=2中,每个缩放级别将图像分割成更多的块,从而提供更高的分辨率。(视觉解释为这里)
这对于我正在做的事情来说是完美的--但是我发现它并没有从我通过元数据API得到的每个全景图中返回一个回复。
仔细观察,我发现Google有时会用不同的参数向不同的端点发出请求,有些甚至以完全不同的文件格式返回图像。
我现在很不确定如何从这里着手处理这个问题。我不能嵌入,因为我需要在一个已经3D的世界里渲染这个不能使用静态全景API,因为我不能从中获得完整的全景图像。
任何想法都很感谢,谢谢。:)
发布于 2019-07-22 08:53:41
您可以下载每个图像并将其保存在多维图像数组中。然后,您可以将每个瓷砖绘制到一个空白位图上。这篇文章解释了如何下载所有的瓷砖。
下面是我的c#代码,它接受全景ID并返回等长方形13312x6656位图,可以以任何图像格式保存:
public static Bitmap Panorama(string panoID)
{
ServicePointManager.DefaultConnectionLimit = Environment.ProcessorCount * 12;
Image[,] images = new Image[26, 13];
Parallel.For(0, 26, x =>
{
Parallel.For(0, 13, y =>
{
using (WebClient client = new WebClient())
images[x, y] = Image.FromStream(new MemoryStream(client.DownloadData(Get.TileURL(panoID, x, y)))); //converts downloaded byte array to image
});
});
Bitmap result = new Bitmap(26 * 512, 13 * 512);
for (int x = 0; x < 26; x++)
for (int y = 0; y < 13; y++)
using (Graphics g = Graphics.FromImage(result))
g.DrawImage(images[x, y], x * 512, y * 512);
return result;
}要获得url,您还可以使用cbk0.google.com。Get.TileURL:
public static string TileURL(string panoID, int x, int y, int zoomLevel = 5)
{
return "http://cbk0.google.com/cbk?output=tile&panoid=" + panoID + "&zoom=" + zoomLevel + "&x=" + x + "&y=" + y;
}Parallel.For循环只是为了加快速度,可以代替普通循环。
这个方法的唯一问题是它不适用于以CAoSLEFGMVFpcE开头的panos。我目前正在试图找到一个解决方案,如果我找到了解决方案,我将更新这个答案。
注意:这样做将违反谷歌的服务条款,
https://stackoverflow.com/questions/51800326
复制相似问题