2013-06-19 8 views
7

내 앱 오프라인지도를 사용하고이지도를 사용하여 경로가있는 gpx 파일을 사용하고 싶습니다. openstreetmap에서 찾은 것이지만 더 나은 서비스가 있습니까? (레벨 곡선이있는 최상의 솔루션) 감사합니다.IOS : 오프라인지도 사용

+0

http://www.mapbox.com? – Wain

답변

9

오프라인지도에는 많은 프로젝트와 예제가 없기 때문에 iOS에서 약간의 경험이 필요합니다. 그러나 시작 지점을 줄 수있는 Route-Me이라는 프로젝트가 있습니다. Metro Valencia Offline을 개발하여 App Store에 성공적으로 적용했습니다. Route-Me를 프로젝트에 추가하는 방법에 대해 small tutorial이라고 썼습니다.

기본적으로 원하는지도 피드를 사용할 수 있습니다 (OpenStreetMaps는 물론 그 중 하나입니다). 당신은 무엇을해야 할 것이다 것은 :

  1. 다운로드지도 타일 (https://metacpan.org/pod/Geo::OSM::Tiles)
  2. SQLite 데이터베이스로 넣어 (http://shikii.net/blog/downloads/map2sqlite-bin.zip)
  3. 수정 루트 - 나 타일은 데이터베이스에서 공급되는 위해 skobbler의/TeleNav에를 : : 대신 오픈 스트리트 맵 웹 사이트에서
+0

이 예외를 설명해 주시겠습니까?"SimpleMap [1020 : 907] *** 캐치되지 않은 예외 'NSInternalInconsistencyException'로 인해 앱 종료 중입니다. [내용 minZoom]이 [tileSource minZoom]보다 작을 경우 그래픽 및 메모리에 과도한 세금이 부과됩니다." " – CrazyDev

+3

실제로 Route-Me에 의해 던져진 NSAssert는 결코 완전히 이해하지 못했습니다. 나는 그것을 주석 처리했으며 전혀 문제가 없었습니다. NSAssert는'setTileSource :'PS 메소드의'RMMapContents.m'에서 찾을 수 있습니다. 'setMinZoom :'에는 또 하나가 있지만 마지막으로 그대로 두었습니다. –

+0

와우 환상적, 이제는 작동! 감사합니다 ... 다른 질문이 있으면 여기에 쓸 수 있습니까? – CrazyDev

2

의 또한 테스트 할 수 있습니다 그것은 OpenStreetMap에 기반으로 http://developer.skobbler.com/support#download을 그들이 전체 오프라인 기능을 가지고 (GPX는 & R 라우팅 내비게이션,지도 렌더링을 추적 eruting)

1

Nutiteq Maps SDK : http://developer.nutiteq.com, iOS 및 Android 용 오프라인지도, Xamarin IDE (C#) 및 기본 언어 (Java, ObjectiveC, Swift)를 지원합니다. 라우팅과 네비게이션 (예 : Skobbler)은 아니지만 대화 형 레이어 (지도 위에 점, 선 및 다각형)가있는 복잡한지도에 초점을 맞춘 경우가 많습니다. 한 가지 장점은 OpenStreetMap뿐 아니라 SDK 자체에서 제공하는 고유 한 기본지도 소스 (사내, 타사)를 사용할 수 있다는 것입니다.

면책 조항 : 나는 그것의 개발자입니다.

0

MapKit의 기본지도와 MKTileOverlay의 하위 클래스를 사용하여 다운로드 한 타일을 저장하고 다운로드하지 않고 이미 캐시 된 타일을 반환 할 수있었습니다.

1) 변경 MapKit에서 기본 맵에 대한 소스와 MKTileOverlay의 서브 클래스를 사용합니다 (여기에서 "열려 거리지도") MKTileOverlay

@interface VHTileOverlay() // MKTileOverlay subclass 
@property (nonatomic, strong) NSOperationQueue *operationQueue; 
@end 

@implementation VHTileOverlay 

-(instancetype)initWithURLTemplate:(NSString *)URLTemplate{ 

    self = [super initWithURLTemplate:URLTemplate]; 
    if(self){ 
     self.directoryPath = cachePath; 
     self.operationQueue = [NSOperationQueue new]; 
    } 
    return self; 
} 


-(NSURL *)URLForTilePath:(MKTileOverlayPath)path { 
    return [NSURL URLWithString:[NSString stringWithFormat:@"http://tile.openstreetmap.org/%ld/%ld/%ld.png", (long)path.z, (long)path.x, (long)path.y]]; 
} 

-(void)loadTileAtPath:(MKTileOverlayPath)path 
       result:(void (^)(NSData *data, NSError *error))result 
{ 
    if (!result) { 
     return; 
    } 

    NSString *pathToFilfe = [[self URLForTilePath:path] absoluteString]; 
    pathToFilfe = [pathToFilfe stringByReplacingOccurrencesOfString:@"/" withString:@"|"]; 
    // @"/" - those are not approriate for file's url... 

    NSData *cachedData = [self loadFileWithName:pathToFilfe]; 
    if (cachedData) { 
     result(cachedData, nil); 
    } else { 
     NSURLRequest *request = [NSURLRequest requestWithURL:[self URLForTilePath:path]]; 
     __block VHTileOverlay *weakSelf = self; 
     [NSURLConnection sendAsynchronousRequest:request 
              queue:self.operationQueue 
           completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
            NSLog(@"%@",[weakSelf URLForTilePath:path]); 

            if(data){ 
             [self saveFileWithName:[[weakSelf URLForTilePath:path] absoluteString] imageData:data]; 
            } 
            result(data, connectionError); 
     }]; 
    } 
} 

-(NSString *)pathToImageWithName:(NSString *)fileName 
{ 
    NSString *imageFilePath = [[OfflineMapCache sharedObject].cachePath stringByAppendingPathComponent:fileName]; 
    return imageFilePath; 
} 

- (NSData *)loadFileWithName:(NSString *)fileName 
{ 
    NSString *imagePath = [self pathToImageWithName:fileName]; 
    NSData *data = [[NSData alloc] initWithContentsOfFile:imagePath]; 
    return data; 
} 

- (void)saveFileWithName:(NSString *)fileName imageData:(NSData *)imageData 
{ 
// fileName = [fileName stringByReplacingOccurrencesOfString:@"/" withString:@"|"]; 
// NSString *imagePath = [self pathToImageWithName:fileName]; 
// [imageData writeToFile:imagePath atomically:YES]; 
} 

의 주석에서

- (void)viewDidLoad{ 
    [super viewDidLoad]; 
    static NSString * const template = @"http://tile.openstreetmap.org/{z}/{x}/{y}.png"; 

    VHTileOverlay *overlay = [[VHTileOverlay alloc] initWithURLTemplate:template]; 
    overlay.canReplaceMapContent = YES; 
    [self.mapView addOverlay:overlay level:MKOverlayLevelAboveLabels]; 
} 

2) 서브 클래스 "를 사용 saveFileWithName "을 실행하고 시뮬레이터에서 실행하십시오. 또한 NSLog (fileName)를 추가하여 필요한 모든 타일을 가져올 위치를 알 수 있습니다. (시뮬레이터 캐시가 사용자에/당신/라이브러리/개발자/CoreSimulator/디바이스/... 그리고 도서관은 숨겨진 디렉토리) 방금 앱의 번들에 넣을 필요가 모든 (단지 어떤처럼 캐시

후 다른 이미지, 상자 캐시 된 맵에서 원하는 경우). 그리고 번들로부터

- (void)loadTileAtPath:(MKTileOverlayPath)path 
       result:(void (^)(NSData *data, NSError *error))result 

얻을 수있는 타일을 말한다.

이제 앱을 설치하고 Wi-Fi를 사용 중지하면 어쨌든지도를 가져올 수 있습니다.