Google maps 从原始位置请求Google街景全景图平铺

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

我正试图请求谷歌街景图片,以便我可以渲染到三维球体上的完整全景

不幸的是,仅允许请求高达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}&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;
    }