2012-05-09 8 views
11

के लिए ऑफ़लाइन मैपकिट समाधान आपके लिए त्वरित प्रश्न। मेरे पास एक ऐप है जिस पर मैं काम कर रहा हूं उसे नक्शे के उपयोग की आवश्यकता होगी, लेकिन नेटवर्क कनेक्शन नहीं होगा। मैंने दूसरों को इस बारे में समान प्रश्न पूछने को देखा है, लेकिन मेरी आवश्यकताएं थोड़ी अलग हैं, इसलिए मैं एक नया प्रश्न पोस्ट करना चाहता था।आईओएस

यहां ऐप के लिए मेरी आवश्यकताएं हैं।

  1. अनुमति दें definable एनोटेशन के साथ एक नक्शा की चुटकी/ज़ूम
  2. मानचित्र ऑफ़लाइन उपलब्ध होना चाहिए
  3. मानचित्र एप्पल निरीक्षण पारित करने के लिए नहीं है एक निश्चित भू क्षेत्र
  4. अनुप्रयोग के लिए प्रतिबंधित किया जाना चाहिए। यह एक एंटरप्राइज़ ऐप है जो कियोस्क के रूप में काम करेगा।

तो क्या कोई नक्शा टाइल कैशिंग करने का कोई ढांचा या तरीका है जो कोई भी सुझाव दे सकता है?

धन्यवाद अग्रिम में बाहर जाना।

+0

मुझे डर है कि कालेब सही है। यहां तक ​​कि यदि आप किसी भी तरह से मानचित्र डेटा कैश कर सकते हैं - तो आप इसका उपयोग कर शर्तों को बंद कर देंगे। –

उत्तर

1

Google Maps Terms of Service के अनुभाग 10.3 की जांच करें और आप पाएंगे कि आपको किसी भी Google मानचित्र सामग्री को स्टोर करने की अनुमति नहीं है। इसका मतलब है कि आपको न केवल अपना नक्शा प्रदान करना होगा, बल्कि आसान नक्शाकिट कार्यक्षमता को भी प्रतिस्थापित करना होगा। जहां तक ​​मैं कह सकता हूं, आप वास्तव में ऑफ़लाइन एप्लिकेशन के लिए मैपकिट का उपयोग नहीं कर सकते हैं।

3

http://mapbox.com/ का उपयोग करने का प्रयास करें जिसमें आईओएस एसडीके और ऑफ़लाइन मानचित्र बनाने के लिए एक ऐप है।

+1

कोई भी मुफ्त समाधान? – BoilingLime

1

दुर्भाग्यवश MapKit Framework ऑफ़लाइन मानचित्र एक्सेस का समर्थन नहीं करता है। आप पसंद करते हैं चाहिए MapBox आईओएस एसडीके (MapBox iOS SDK का है, जो ऑफ़लाइन संचय नीति का समर्थन नक्शे आवेदन, जूमिंग सीमा, रेटिना प्रदर्शन व्यवहार के निर्माण समन्वय शुरू करने, और खींचने मानचित्र दृश्य मंदी आदि के लिए एक टूलसेट .... है

Find the example link

मुबारक कोडिंग

1

skobbler/Telenav SDK देखें - यह OpenStreetMap पर आधारित है और एक (लगभग) पूर्ण ढेर MapKit के लिए ऑफ़लाइन नक्शे के लिए एकीकृत समर्थन के साथ प्रतिस्थापन (मानचित्र प्रतिपादन, मोड़ नेविगेशन द्वारा & बारी मार्ग) है है

9

मैंने मैपकिट से डिफ़ॉल्ट मानचित्र और एमकेटाइल ओवरले के उप-वर्ग का उपयोग किया ताकि डाउनलोड टाइल्स को सहेज सकें और पहले से ही कैश किए गए टाइल्स को डाउनलोड किए बिना वापस कर सकें।

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 

बंडल से टाइल प्राप्त करने के लिए बताएं।

तो अब मैं अपना ऐप इंस्टॉल कर सकता हूं, वाई-फाई बंद कर सकता हूं और मैं वैसे भी उन मानचित्रों को प्राप्त करूंगा।

+0

मैंने आपके कोड का उपयोग करने की कोशिश की है लेकिन कई समस्याएं हैं, क्या आप एक साधारण परियोजना डाल सकते हैं –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^