내 앱 오프라인지도를 사용하고이지도를 사용하여 경로가있는 gpx 파일을 사용하고 싶습니다. openstreetmap에서 찾은 것이지만 더 나은 서비스가 있습니까? (레벨 곡선이있는 최상의 솔루션) 감사합니다.IOS : 오프라인지도 사용
답변
오프라인지도에는 많은 프로젝트와 예제가 없기 때문에 iOS에서 약간의 경험이 필요합니다. 그러나 시작 지점을 줄 수있는 Route-Me이라는 프로젝트가 있습니다. Metro Valencia Offline을 개발하여 App Store에 성공적으로 적용했습니다. Route-Me를 프로젝트에 추가하는 방법에 대해 small tutorial이라고 썼습니다.
기본적으로 원하는지도 피드를 사용할 수 있습니다 (OpenStreetMaps는 물론 그 중 하나입니다). 당신은 무엇을해야 할 것이다 것은 :
- 다운로드지도 타일 (https://metacpan.org/pod/Geo::OSM::Tiles)
- SQLite 데이터베이스로 넣어 (http://shikii.net/blog/downloads/map2sqlite-bin.zip)
- 수정 루트 - 나 타일은 데이터베이스에서 공급되는 위해 skobbler의/TeleNav에를 : : 대신 오픈 스트리트 맵 웹 사이트에서
이 예외를 설명해 주시겠습니까?"SimpleMap [1020 : 907] *** 캐치되지 않은 예외 'NSInternalInconsistencyException'로 인해 앱 종료 중입니다. [내용 minZoom]이 [tileSource minZoom]보다 작을 경우 그래픽 및 메모리에 과도한 세금이 부과됩니다." " – CrazyDev
실제로 Route-Me에 의해 던져진 NSAssert는 결코 완전히 이해하지 못했습니다. 나는 그것을 주석 처리했으며 전혀 문제가 없었습니다. NSAssert는'setTileSource :'PS 메소드의'RMMapContents.m'에서 찾을 수 있습니다. 'setMinZoom :'에는 또 하나가 있지만 마지막으로 그대로 두었습니다. –
와우 환상적, 이제는 작동! 감사합니다 ... 다른 질문이 있으면 여기에 쓸 수 있습니까? – CrazyDev
의 또한 테스트 할 수 있습니다 그것은 OpenStreetMap에 기반으로 http://developer.skobbler.com/support#download을 그들이 전체 오프라인 기능을 가지고 (GPX는 & R 라우팅 내비게이션,지도 렌더링을 추적 eruting)
Nutiteq Maps SDK : http://developer.nutiteq.com, iOS 및 Android 용 오프라인지도, Xamarin IDE (C#) 및 기본 언어 (Java, ObjectiveC, Swift)를 지원합니다. 라우팅과 네비게이션 (예 : Skobbler)은 아니지만 대화 형 레이어 (지도 위에 점, 선 및 다각형)가있는 복잡한지도에 초점을 맞춘 경우가 많습니다. 한 가지 장점은 OpenStreetMap뿐 아니라 SDK 자체에서 제공하는 고유 한 기본지도 소스 (사내, 타사)를 사용할 수 있다는 것입니다.
면책 조항 : 나는 그것의 개발자입니다.
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를 사용 중지하면 어쨌든지도를 가져올 수 있습니다.
http://www.mapbox.com? – Wain