मैंने मैपकिट से डिफ़ॉल्ट मानचित्र और एमकेटाइल ओवरले के उप-वर्ग का उपयोग किया ताकि डाउनलोड टाइल्स को सहेज सकें और पहले से ही कैश किए गए टाइल्स को डाउनलोड किए बिना वापस कर सकें।
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 "और इसे सिम्युलेटर पर चलाएं। आपको यह जानने के लिए एनएसएलओजी (फ़ाइल नाम) भी जोड़ सकते हैं कि आपको आवश्यक सभी टाइल्स कहां प्राप्त करें। (सिम्युलेटर कैश उपयोगकर्ता में है/आप/Library/डेवलपर/CoreSimulator/उपकरणों/... और लाइब्रेरी एक छिपा निर्देशिका है)
के बाद आप सब आप बस अपने ऐप के बंडल में डाल की जरूरत है कैश की गई (सिर्फ एक किसी अन्य छवि की तरह , यदि आप बॉक्स कैश किए गए मानचित्र से चाहते हैं)।और अपने
- (void)loadTileAtPath:(MKTileOverlayPath)path
result:(void (^)(NSData *data, NSError *error))result
बंडल से टाइल प्राप्त करने के लिए बताएं।
तो अब मैं अपना ऐप इंस्टॉल कर सकता हूं, वाई-फाई बंद कर सकता हूं और मैं वैसे भी उन मानचित्रों को प्राप्त करूंगा।
स्रोत
2015-08-27 09:01:33
मुझे डर है कि कालेब सही है। यहां तक कि यदि आप किसी भी तरह से मानचित्र डेटा कैश कर सकते हैं - तो आप इसका उपयोग कर शर्तों को बंद कर देंगे। –