в моем приложении Я хочу использовать автономные карты и с помощью этих карт использовать файлы gpx, чтобы иметь маршрут. Я нашел openstreetmap, чтобы сделать это, но есть ли некоторые более качественные услуги? (лучшее решение с кривыми уровня) спасибоIOS: использовать офлайн-карты
ответ
Офлайновые карты требуют немного опыта работы в iOS, так как там не так много проектов и примеров. Однако у вас есть один проект под названием Route-Me, который может дать вам отправную точку. Мы использовали его для разработки Metro Valencia Offline, который успешно добрался до магазина приложений. Я написал small tutorial о том, как добавить Route-Me в ваш проект.
В основном вы можете использовать любой канал, который может понадобиться (OpenStreetMaps - это один из них, а также тот, который мы использовали). Что вы должны сделать, это:
- скачать карту плитки (https://metacpan.org/pod/Geo::OSM::Tiles)
- Поместите их в базу данных SQLite (http://shikii.net/blog/downloads/map2sqlite-bin.zip)
- Изменить Route-Me для плитки должна быть подана из базы данных вместо того, чтобы с сайта OpenStreetMaps
Можете ли вы объяснить мне это исключение? «SimpleMap [1020: 907] *** Завершение приложения из-за неперехваченного исключения« NSInternalInconsistencyException », причина:« Графика и память слишком облагаются налогом, если [содержимое minZoom] больше 1,5 меньше [tileSource minZoom] » – CrazyDev
То есть фактически NSAssert, брошенный Маршрутом-Me, который я никогда не понимал полностью. Я прокомментировал это и никогда не испытывал никаких проблем. NSAssert можно найти в 'RMMapContents.m' внутри метода' setTileSource: 'PS. В 'setMinZoom: есть еще один, но я оставил это последнее, как есть. –
wow фантастический, теперь он работает !! спасибо ... могу ли я написать здесь, если у меня есть другие вопросы? – CrazyDev
Вы можете проверить также: Skobbler в/Telenav: http://developer.skobbler.com/support#download он основан на OpenStreetMap и они получили полные возможности в автономном режиме (GPX треков навигации, карта рендеринга, маршрутизации & г erouting)
Существует также Nutiteq Maps SDK: http://developer.nutiteq.com, автономные карты для iOS и Android, поддерживает Xamarin IDE (C#) и родные языки (Java, ObjectiveC, Swift). Это не так много маршрутизации и навигации (как, например, Skobbler), но больше для сосредоточенных на сложных картах с интерактивными слоями (точки, линии и многоугольники поверх карт). Одно из преимуществ заключается в том, что вы можете использовать собственные источники базовой карты (собственные, третьи стороны), а не только OpenStreetMap, что сам SDK.
Отказ от ответственности: Я разработчик.
Я использовал карту по умолчанию из MapKit и подкласс MKTileOverlay, чтобы иметь возможность сохранять загруженные фрагменты и возвращать уже кэшированные фрагменты без их загрузки.
1) Изменить источник для вашей карты по умолчанию от MapKit и использовать подкласс MKTileOverlay (используется "открытая карта улиц" здесь)
- (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) подкласс от 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];
}
раскомментировать " saveFileWithName "и запустить его на симуляторе. Вы также можете добавить NSLog (имя_файла), чтобы узнать, где получить все необходимые вам плитки. (Simulator кэш в пользователях/YOU/Library/Developer/CoreSimulator/Devices/... и библиотека скрытый каталог)
После кэшировать все, что вам нужно просто положить в корешке вашего приложения (точно так же как любой другое изображение, если вы хотите из коробки кешированной карты). И скажите своим
- (void)loadTileAtPath:(MKTileOverlayPath)path
result:(void (^)(NSData *data, NSError *error))result
, чтобы получить плитки из пучка.
Итак, теперь я могу установить приложение, отключить Wi-Fi, и все равно получаю эти карты.
- 1. Когда использовать SQlite - iOS
- 2. IOS использовать CoreData MR_findByAttribute
- 3. iOS: Как использовать PickerView
- 4. iOS использовать couchbase lite
- 5. Как использовать iOS Reachability
- 6. iOS Использовать обратный вызов
- 7. iOS: Как использовать фотографии Framework (iOS 8.0)?
- 8. ios использовать несколько сторонних рамок
- 9. Невозможно использовать сертификат распространения IOS
- 10. Как использовать QMacNativeWidget в IOS
- 11. iOS Как использовать частный API?
- 12. iOS - Использовать responseObject вне AFNetworking
- 13. Заставить iOS не использовать AGPS
- 14. Невозможно использовать NSLocalizableString - приложение iOS
- 15. ios - Как использовать цепные блоки
- 16. Использовать MPMoviePlayerController, если iOS 7
- 17. В iOS как использовать NS_ENUM?
- 18. iOS 8: Как использовать segues
- 19. Как использовать макросы определения iOS
- 20. Невозможно использовать Facebook iOS SDK
- 21. iOS - Невозможно использовать AVQueuePlayer initwithitems()
- 22. Как использовать MQTT в iOS?
- 23. iOS: разрешено ли использовать libIOKit.dylib
- 24. Как использовать UIViewAnimationCurveEaseIn в iOS?
- 25. Использовать библиотеку python в iOS
- 26. Как использовать SPGooglePlacesAutocomplete в ios
- 27. Когда использовать [Super init] iOS
- 28. Как использовать setKeepAliveTimeout: обработчик - IOS?
- 29. Как использовать автоматическую автоматизацию IOS?
- 30. Как использовать libffi на iOS
http://www.mapbox.com? – Wain