【问题标题】:Xcode - Google Street View api 3D panoramaXcode - Google Street View api 3D 全景图
【发布时间】:2012-10-29 07:48:47
【问题描述】:

我的目标是使用 Google Street View API 向用户显示完整的承诺全景可滚动街景图像。基本上,API 为我提供了许多图像,我可以在其中改变方向、高度、缩放、位置等。我可以检索所有这些并希望将它们拼接在一起并查看它。第一个问题是,你知道演示这个完整的谷歌街景演示工作的任何资源吗?用户可以在其中滑动以移动街景,就像我相信我们都想念的旧 iOS 5 地图街景一样......

如果没有,我基本上会下载数百张垂直和水平方向不同的照片。是否有库或 API 或资源或方法可以让我将所有这些照片拼接在一起以制作大全景图,并使其用户可以滑动以在 iPhone 小屏幕上查看大全景图?

谢谢大家!

【问题讨论】:

  • 作为一个不直接了解 Street View API 的人,要明确这一点,他们已经完成了 3d 数学运算,因此如果 URL 获取神奇地变得即时,您就可以通过在每次相机移动时提供新参数来运行人们会识别为街景的东西?你的问题是,你能做些什么来缓存一小部分可用查询并在客户端执行你自己的 3d 数学来填补空白?
  • @Tommy 是的,我所做的是我创建了一个应用程序,您可以在其中按左右按钮来更改“方向”的参数,这很有效,但我想要一个拼接在一起的 180 度版本
  • @Tommy 没错,我需要客户端上的 3d 数学来填补空白 :)

标签: iphone objective-c ios xcode photos


【解决方案1】:

我拼凑了一个快速实现来为您做很多这样的演示。有一些优秀的开源库可以让街景的业余版本变得非常简单。你可以在 GitHub 上查看我的演示:https://github.com/ocrickard/StreetViewDemo

您可以使用 Google StreetView API 中的航向和俯仰参数来生成图块。正如 Bilal 和 Geraud.ch 所建议的那样,这些图块可以排列在 UIScrollView 中。不过,我真的很喜欢 JCTiledScrollView,因为它包含一个非常好的注释系统,可以像 Google 一样在图像上添加图钉,而且它的数据源/委托结构可以进行一些非常直接的图像处理。

我的实现的主要部分如下:

- (UIImage *)tiledScrollView:(JCTiledScrollView *)scrollView imageForRow:(NSInteger)row column:(NSInteger)column scale:(NSInteger)scale
{
    float fov = 45.f / scale;

    float heading = fmodf(column*fov, 360.f);
    float pitch = (scale - row)*fov;

    if(lastRequestDate) {
        while(fabsf([lastRequestDate timeIntervalSinceNow]) < 0.1f) {
            //continue only if the time interval is greater than 0.1 seconds
        }
    }

    lastRequestDate = [NSDate date];

    int resolution = (scale > 1.f) ? 640 : 200;

    NSString *path = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/streetview?size=%dx%d&location=40.720032,-73.988354&fov=%f&heading=%f&pitch=%f&sensor=false", resolution, resolution, fov, heading, pitch];
    NSError *error = nil;
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:path] options:0 error:&error];
    if(error) {
        NSLog(@"Error downloading image:%@", error);
    }
    UIImage *image = [UIImage imageWithData:data];

    //Distort image using GPUImage
    {
        //This is where you should try to transform the image.  I messed around
        //with the math for awhile, and couldn't get it.  Therefore, this is left
        //as an exercise for the reader... :)

        /*
        GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:image];
        GPUImageTransformFilter *stillImageFilter = [[GPUImageTransformFilter alloc] init];
        [stillImageFilter forceProcessingAtSize:image.size];

        //This is actually based on some math, but doesn't work...
        //float xOffset = 200.f;

        //CATransform3D transform = [ViewController rectToQuad:CGRectMake(0, 0, image.size.width, image.size.height) quadTLX:-xOffset quadTLY:0 quadTRX:(image.size.width+xOffset) quadTRY:0.f quadBLX:0.f quadBLY:image.size.height quadBRX:image.size.width quadBRY:image.size.height];
        //[(GPUImageTransformFilter *)stillImageFilter setTransform3D:transform];

        //This is me playing guess and check...
        CATransform3D transform = CATransform3DIdentity;
        transform.m34 = fabsf(pitch) / 60.f * 0.3f;

        transform = CATransform3DRotate(transform, pitch*M_PI/180.f, 1.f, 0.f, 0.f);
        transform = CATransform3DScale(transform, 1.f/cosf(pitch*M_PI/180.f), sinf(pitch*M_PI/180.f) + 1.f, 1.f);
        transform = CATransform3DTranslate(transform, 0.f, 0.1f * sinf(pitch*M_PI/180.f), 0.f);

        [stillImageFilter setTransform3D:transform];


        [stillImageSource addTarget:stillImageFilter];
        [stillImageFilter prepareForImageCapture];
        [stillImageSource processImage];

        image = [stillImageFilter imageFromCurrentlyProcessedOutput];
         */
    }

    return image;
}

现在,为了获得 Google 的完整 360 度无限滚动效果,您必须在观察 UIScrollView 的 contentOffset 的 observeValueForKeyPath 方法中做一些诡计。我已经开始实施这个,但没有完成它。这个想法是,当用户到达视图的左侧或右侧时,滚动视图的contentOffset 属性被推送到滚动视图的另一侧。如果您可以使内容正确对齐,并且您将 contentSize 设置得恰到好处,那么这应该可以工作。

最后,我要注意的是,谷歌街景系统有每秒 10 张图片的限制,所以你必须限制你的请求,否则设备的 IP 地址将被列入黑名单一段时间(我的家庭互联网是现在在接下来的几个小时内从街景请求中消失了,因为我一开始不明白这一点)。

【讨论】:

  • 哈哈太棒了!现在在学校,我稍后再看看
  • 太棒了!这是一个出色的演示,我将努力使用它!真的太棒了!
  • 这太棒了,我不敢相信你把它放在一起或者帮我找到了这个,所以明天再增加 100 个声望!
【解决方案2】:

你需要使用UIScrollView,将其clipSubviews属性设置为true,将所有图片添加到UIScrollView,并根据图片添加UIScrollView的contentsOffset。

【讨论】:

    【解决方案3】:

    你应该使用这篇文章中描述的方法:http://mobiledevelopertips.com/user-interface/creating-circular-and-infinite-uiscrollviews.html

    您将不得不制作一些工厂来将图像转换为合适的尺寸和您的视口(iPhone/iPad)。然后添加一些按钮,你可以点击去下一个地方。

    不幸的是,如果您想使用地球仪版本(而不是管子版本),我认为您需要使用完整的 openGL 才能在此 3D 表面中显示图像。

    【讨论】:

    • 可能代码有点老了,但需要原理,然后你自己去吧。
    • 是的....我不会直接复制粘贴,我只希望jist,Apis等工作
    • 以及属性和方法
    • 嗨 geruad.ch,这不是我想要的,我要求的是类似于谷歌街景的东西,除了水平滚动.....它将照片缝合在一起,你可以滚动查看整个全景图,但它不会相互折叠……这样想……在划伤的 uP iPhone 5 上拍摄全景图并放大然后滚动,这是一种类似的效果我需要的(假设你有苹果产品:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多