Google maps 从原始位置请求Google街景全景图平铺
我正试图请求谷歌街景图片,以便我可以渲染到三维球体上的完整全景 不幸的是,仅允许请求高达120°视野。理想情况下,我需要一个等矩形的图像,我可以投射到这个球体上 然后,我检查了Google Maps在为insight请求全景图像时发出的请求,发现它发出的请求与此类似:Google maps 从原始位置请求Google街景全景图平铺,google-maps,google-street-view,Google Maps,Google Street View,我正试图请求谷歌街景图片,以便我可以渲染到三维球体上的完整全景 不幸的是,仅允许请求高达120°视野。理想情况下,我需要一个等矩形的图像,我可以投射到这个球体上 然后,我检查了Google Maps在为insight请求全景图像时发出的请求,发现它发出的请求与此类似: https://geo0.ggpht.com/cbk?cb_client=maps_sv.tactile&panoid=${panorama\u id}&output=tile&x=${tile\u x}&y=${tile\u y
https://geo0.ggpht.com/cbk?cb_client=maps_sv.tactile&panoid=${panorama\u id}&output=tile&x=${tile\u x}&y=${tile\u y}&zoom=${zoom\u level}&nbt&fover=2
每个缩放级别将图像分割成更多的分片,从而提供更高的分辨率。(直观解释)
这对于我正在做的事情来说是完美的——但是我发现它并没有从我通过网络获得的每个全景id中返回响应
进一步研究,我发现谷歌地图有时会使用不同的参数向不同的端点发出请求,有些甚至返回完全不同的文件格式的图像
我现在很不确定如何从这里解决这个问题。我不能嵌入街景Javascript API,因为我不能使用静态全景API,因为我无法从中获得完整的全景图像
任何想法,谢谢。) 您可以下载每个图像并将其保存在多维图像数组中。然后,可以在空白位图上绘制每个单独的平铺。说明如何下载所有互动程序 这是我的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;
}
Parallel.For
循环只是为了加快速度,可以替代普通For循环
此方法的唯一问题是,它不适用于以CAoSLEFGMVFpcE
开头的panos。我目前正试图找到一个解决方案,如果找到解决方案,我会更新这个答案
注意:这样做会违反谷歌的服务条款运气好吗?我遇到了同样的问题。对于我的项目,我发现只有拥有Google版权的panos(例如官方的Google panos)使用
geo0
端点工作。失败的全景是用户创建的全景。我的猜测是,它们是用户生成的,并通过用户的Google(照片?)帐户(?)托管,因此URL端点不同且更随机。当然,这只是我的理论……好消息是,如果你过滤掉非谷歌panos,我很确定更可预测的geo0
URL应该会起作用。是的,找到了同样的东西。最后,我只是通过在查找请求中添加source=outdoor
来过滤panorama ID,从而只请求官方的Google panorama。
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;
}