2013-06-19 8 views
7

का उपयोग करें, मैं ऑफ़लाइन मानचित्र का उपयोग करना चाहता हूं और इस मानचित्र के साथ मार्ग बनाने के लिए जीपीएक्स फाइलों का उपयोग करना चाहता हूं। मुझे इसे करने के लिए openstreetmap मिला, लेकिन क्या कुछ बेहतर सेवाएं हैं? (स्तर घटता के साथ सबसे अच्छा समाधान) धन्यवादआईओएस: मेरे ऐप में ऑफलाइन मानचित्र

+0

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

उत्तर

9

ऑफ़लाइन मानचित्रों को आईओएस में थोड़ा सा अनुभव की आवश्यकता है क्योंकि वहां कई परियोजनाएं और उदाहरण नहीं हैं। हालांकि, आपको Route-Me नामक एक प्रोजेक्ट मिला जो आपको प्रारंभिक बिंदु दे सकता है। हमने इसे Metro Valencia Offline विकसित करने के लिए उपयोग किया जो इसे ऐप स्टोर में सफलतापूर्वक बना दिया। मैंने आपकी परियोजना में रूट-मी जोड़ने के तरीके पर small tutorial लिखा था।

असल में आप किसी भी मानचित्र फ़ीड का उपयोग कर सकते हैं जो आप चाहते हैं (movMaps उनमें से एक है और जिसे हमने उपयोग किया है)। आप क्या करना होगा है:

  1. डाउनलोड मानचित्र टाइल (https://metacpan.org/pod/Geo::OSM::Tiles)
  2. उन्हें एक SQLite डेटाबेस में रखो (http://shikii.net/blog/downloads/map2sqlite-bin.zip)
  3. संशोधित मार्ग-Me के लिए टाइल्स डेटाबेस से खिलाया जा करने के लिए OpenStreetMaps वेबसाइट से
+0

क्या आप मुझे यह अपवाद समझा सकते हैं? "सरल मैप [1020: 907] *** असीमित अपवाद के कारण ऐप को समाप्त करना 'एनएसआईएननल इन्फॉन्सिस्टेंसी एक्सेप्शन', कारण: ग्राफिक्स और मेमोरी अत्यधिक कर लगाई जाती है यदि [सामग्री minZoom] [tileSource minZoom] से 1.5 से अधिक छोटी है" – CrazyDev

+3

वास्तव में रूट-मी द्वारा फेंक दिया गया एक एनएसएएसएसर्ट जिसे मैंने पूरी तरह से समझ नहीं लिया। मैंने टिप्पणी की और कभी भी कोई समस्या नहीं थी। एनएसएसएसएसएसर्ट विधि 'सेटटाइलसोर्स:' पीएस के अंदर 'RMMapContents.m' पर पाया जा सकता है। 'SetMinZoom:' पर ​​एक और है, लेकिन मैंने आखिरी बार इसे छोड़ दिया है। –

+0

वाह शानदार, अब यह काम करता है !! धन्यवाद ... अगर मेरे पास अन्य प्रश्न हैं तो क्या मैं यहां लिख सकता हूं? – CrazyDev

2

के बजाय आप यह भी परीक्षण कर सकते हैं: skobbler के/TeleNav: http://developer.skobbler.com/support#download यह OpenStreetMap पर आधारित है और वे पूर्ण ऑफ़लाइन क्षमताओं मिला (GPX पटरियों नेविगेशन, नक्शे प्रतिपादन, मार्ग & आर erouting)

1

वहाँ भी Nutiteq नक्शे SDK है: http://developer.nutiteq.com, iOS और Android के लिए ऑफ़लाइन नक्शे, Xamarin आईडीई (सी #) और देशी भाषाओं (जावा, ObjectiveC, स्विफ्ट) का समर्थन करता है। यह इतना रूटिंग और नेविगेशन नहीं है (जैसे स्कोबबलर), लेकिन इंटरैक्टिव परतों (बिंदुओं, रेखाओं और मानचित्रों के शीर्ष पर बहुभुज) के साथ जटिल मानचित्रों पर ध्यान केंद्रित करने के लिए अधिक। एक फायदा यह है कि आप अपने स्वयं के बेस मैप स्रोतों (इन-हाउस, तृतीय पक्ष) का उपयोग कर सकते हैं, न केवल एसडीके स्वयं ही प्रदान करता है।

अस्वीकरण: मैं इसका डेवलपर हूं।

0

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

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 

प्राप्त करने के लिए बताओ।

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

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