Çevrimdışı haritaları kullanmak istiyorum ve bu haritalarda bir rotaya sahip olmak için gpx dosyalarını kullanın. Bunu yapmak için openstreetmap'i buldum, ama bazı daha iyi hizmetler var mı? (seviye eğrileriyle en iyi çözüm) teşekkürlerIOS: Uygulamamda çevrimdışı haritaları kullan
cevap
Çevrimdışı haritalar, birçok proje ve örnek olmadığından iOS'ta biraz deneyim gerektirir. Ancak, bir başlangıç noktası verebilecek Route-Me adlı bir projeniz var. Metro Valencia Offline'u geliştirmek için kullandık, bu uygulama App Store'a başarılı bir şekilde ulaştı. Rota-Me’nı projenize nasıl ekleyeceğiniz konusunda bir small tutorial yazdım.
Temel olarak, istediğiniz herhangi bir harita özet akışını kullanabilirsiniz (OpenStreetMaps bunlardan biri ve aynı zamanda kullandığımız). Ne yapmak gerekir ise:
- İndir harita desenleri (https://metacpan.org/pod/Geo::OSM::Tiles)
- bir SQLite veritabanına koyun (http://shikii.net/blog/downloads/map2sqlite-bin.zip)
- Değiştir Rota-Me fayans veritabanından beslenmesi için skobbler en/TeleNav: yerine openstreetmap web sitesinden
Bu istisnayı bana açıklayabilir misiniz? "SimpleMap [1020: 907] *** Uygulanamayan istisna 'NSInternalInconsistencyException' nedeniyle sona erdirme, nedeni: '[content minZoom], [tileSource minZoom]' dan daha fazla 1.5 ise" Grafik ve bellek aşırı şekilde vergilendirilir. "" – CrazyDev
Aslında tam olarak anlayamadığım Route-Me tarafından atılan bir NSAssert. Bunu açıkladım ve hiç sorunum olmadı. NSAssert 'setTileSource:' PS yönteminin içinde 'RMMapContents.m' bulunabilir. SetMinZoom'da başka bir tane var: Ama o sonuncuyu olduğu gibi bıraktım. –
vay harika, şimdi işe yaradı! Teşekkürler ... başka sorularım varsa buraya yazabilir miyim? – CrazyDev
arasında da test edebilirsiniz bunun OpenStreetMap dayanıyor http://developer.skobbler.com/support#download ve tam çevrimdışı yetenekleri var (GPX & r yönlendirme navigasyon, harita oluşturma, izler erouting)
Ayrıca Nutiteq Maps SDK: http://developer.nutiteq.com, iOS ve Android için çevrimdışı haritalar, Xamarin IDE (C#) ve yerel dilleri (Java, ObjectiveC, Swift) destekler. Çok fazla yönlendirme ve navigasyon (örneğin, Skobbler) değil, daha çok etkileşimli katmanlarla (haritaların üstündeki noktalar, çizgiler ve çokgenler) karmaşık haritalara odaklanmak için daha fazla değildir. Bunun bir avantajı, kendi temel harita kaynaklarınızı (kurum içi, üçüncü taraflar), sadece SDK'nın sunduğu OpenStreetMap'i kullanabilmenizdir.
Yasal Uyarı: Ben geliştiriciyim.
Karşıdan yüklenen karoları kaydedip önbelleğe alınmış önbellekleri indirmeden geri yüklemek için MapKit ve MKTileOverlay alt sınıfının varsayılan haritasını kullandım.
1) Değişim MapKit gelen varsayılan harita için kaynak ve MKTileOverlay bir alt sınıfını kullanmak (burada "açık sokak haritası") 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];
}
Uncomment dan
- (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) alt sınıf "Kullanılmış saveFileWithName "ve simülatörde çalıştırın. İhtiyacınız olan tüm karoları nereden alacağınızı öğrenmek için NSLog (dosyaAdı) da ekleyebilirsiniz. (Simülatörü önbellek Users/SİZE/Library/Geliştirici/CoreSimulator/Cihazlar/... Ve Kütüphane gizli dizindir) size sadece uygulamanızın paket koymak gerek tüm (sadece herhangi gibi önbelleğe
sonra başka bir resim, kutudan önbelleğe alınmış haritadan isterseniz). Ve paket adresinin
- (void)loadTileAtPath:(MKTileOverlayPath)path
result:(void (^)(NSData *data, NSError *error))result
almak için fayans söyle.
Şimdi uygulamamı yükleyebilirim, wi-fi'yi kapatabilirim ve yine de bu haritaları alacağım.
http://www.mapbox.com? – Wain