2012-10-29 4 views
1

내 목표는 Google 스트리트 뷰 API를 사용하여 사용자에게 파노라마로 스크롤 할 수있는 완전한 스트리트 뷰 이미지를 표시하는 것입니다. 기본적으로 API는 방향, 높이, 줌, 위치 등을 다양하게 할 수있는 많은 이미지를 제공합니다.이 모든 것을 검색하여 함께 꿰매보고 볼 수 있기를 바랍니다. 첫 번째 질문은이 전체 Google 스트리트 뷰 데모가 작동하는 데 도움이되는 자료를 알고 계시나요? 사용자가 스 와이프하여 주변의 스트리트 뷰를 움직일 수있는 곳은 이전의 iOS 5지도 스트리트 뷰에서와 마찬가지로 ... 모두 0120. 수직 및 수평 방향으로. 라이브러리 나 API 또는 리소스 나 메소드가있어이 모든 사진을 결합하여 커다란 파노라마를 만들고 작은 아이폰 화면에서 큰 파노라마를보기 위해 스 와이프 할 수 있도록 만들 수 있습니까?Xcode - Google 스트리트 뷰 API 3D 파노라마

모두에게 감사드립니다.

+0

스트리트 뷰 API를 직접 알지 못하는 사람으로서이 점에 대해 분명히 알기 위해 그들은 3d 수학이 끝나야 만합니다. 따라서 URL 가져 오기가 마술처럼 순간적으로 이루어지면 사람들이 할 수있는 것을 실행할 수 있습니다. 카메라가 움직일 때마다 새 매개 변수를 제공하여 스트리트 뷰로 인식합니까? 그리고 당신의 질문은 이용 가능한 쿼리의 아주 작은 부분 집합을 캐싱하고 클라이언트에서 갭을 메우기 위해 자신의 3d 수학을 수행하기 위해 할 수있는 일은 무엇입니까? – Tommy

+0

@ 토미 예, 내가 한 일은 왼쪽 및 오른쪽 버튼을 눌러 작동하는 '방향'의 paremeters를 변경할 수있는 앱을 만들었지 만 함께 180도 버전을 함께 바르고 싶습니다. – MCKapur

+0

@ 토미 정확히, 필요합니다. 공백을 채우기 위해 클라이언트에서 3d 수학 :) – MCKapur

답변

4

빠른 구현을 던져서이 작업을 많은 데모로 수행했습니다. 아마추어 버전의 StreetView를 매우 단순하게 만드는 훌륭한 오픈 소스 라이브러리가 있습니다. GitHub에서 내 데모를 확인할 수 있습니다. https://github.com/ocrickard/StreetViewDemo

Google StreetView API의 heading 및 pitch 매개 변수를 사용하여 타일을 생성 할 수 있습니다. 이 타일들은 Bilal과 Geraud.ch가 제안한 것처럼 UIScrollView에 배열 될 수 있습니다. 그러나 JCTiledScrollView는 Google과 같은 이미지 위에 핀을 추가하는 꽤 좋은 주석 시스템을 포함하고 있기 때문에 JCTiledScrollView를 정말 좋아합니다. 데이터 소스/위임 구조로 인해 매우 직접적인 이미지 처리가 가능합니다.

내 구현 추적의 고기 부분 :

- (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; 
} 

이제 구글은이 무한 스크롤 효과를 전체 360 학위를 얻기 위해, 당신은 당신이 관찰 어디 observeValueForKeyPath 방법에 약간의 속임수를해야 할 것 UIScrollView의 contentOffset입니다. 구현을 시작했지만 끝내지 않았습니다. 사용자가 뷰의 왼쪽 또는 오른쪽 중 하나에 도달하면 scrollView의 contentOffset 속성이 scrollView의 반대쪽으로 푸시됩니다. 콘텐츠를 올바르게 정렬 할 수 있고 contentSize를 올바르게 설정하면이 방법이 효과적입니다.

마지막으로, Google StreetView 시스템에는 초당 10 개 이미지 제한이 있으므로 사용자의 요청을 제한해야하거나 기기의 IP 주소가 특정 시간 동안 블랙리스트에 올 것입니다. 앞으로 몇 시간 동안 StreetView 요청에서 검게 칠해졌습니다. 왜냐하면 처음에는 이것을 이해하지 못했기 때문입니다.)

+0

하하 멋진데! 지금 학교에서, 나는 이것을 나중에 체크 할 것이다 – MCKapur

+0

굉장한! 이것은 내가 사용하는 내 방식대로 일할 훌륭한 데모입니다! 정말 대단해! – MCKapur

+0

이것은 정말 놀라워요. 당신이 이걸 같이 모으거나 이걸 다른 100 가지의 명성을 얻는 데 도움이된다고 저는 믿을 수 없습니다! – MCKapur

1

당신은이 게시물에 설명 된 방법을 사용한다. 그런 다음 클릭하여 다음 장소로 이동할 수있는 버튼을 추가하십시오.

불행하게도 튜브 버전이 아닌 지구본 버전으로 가고 싶다면이 3D 표면에 이미지를 표시하려면 full OpenGL로 이동해야합니다.

+0

장갑이 필요하지 않습니다 .... il이 링크를 확인 – MCKapur

+0

아마 코드가 좀 오래되었지만 당신은 원칙이 필요하고 자신을 위해 갈 수 있습니다. –

+0

예 .... 직접 복사하고 붙여 넣지 않을 것입니다. 단지 jist, Apis 등이 작동하기를 바랍니다. – MCKapur

관련 문제