OpenStreetMap с помощью MkMapKit

от автора

Привет!
В этой статье я постараюсь описать как мы (разработчики Maptrix) победили Apple карты и заменили их картами от OpenStreetMap.

Проблема:

Ни для кого не секрет, что, начиная с прошивки iOS 6.0 во встроенном компоненте MkMapkit, используются карты от Apple. Наконец, Apple стали самостоятельными и смогли отказаться от Google. На презентации все выглядело обалденно!
Но как всегда одно «но»: все эти 3d чудеса доступны только для пользователей США (ну и некоторых других развитых стран). В частности, по представлениям Apple жители России живут в одной большой пустыне.

Возможные решения:

Первой мыслью было уйти от MKMapView.
К сожалению, из рассмотренных аналогов найти полноценную копию этой библиотеки не удалось. Более менее похожая структура, кстати, у яндекс библиотеки (http://github.com/yandexmobile/yandexmapkit-ios и github.com/yandexmobile/yandexmapkit-ios).
Так, мы пришли к мысли, что работу с картой, пинами и т.п. надо оставлять как есть, а вместо картинок карт от Apple подставлять какие-нибудь более проработанные.

В итоге, мы решили использовать Open Street Map и вот эту библиотеку с некоторыми доработками.

Что не устраивало:

1. При переключении Satelite Map карта не переключалась
2. Если карта не прогружена, вначале показывалась Apple карте, после чего ее перекрывала карта OSM

Итак, сам код:

1. Добавляем необходимые файлы
github.com/nutiteq/ldiw-iphone/tree/master/OSM

2. .h файл ViewController

 #import "TileOverlay.h"    @interface MapView : UIViewController <MKMapViewDelegate> {     IBOutlet MKMapView *mapView;   }   @property (nonatomic, retain) TileOverlay *overlay; 

3. .m файл ViewController

 #import "TileOverlay.h"  #import "TileOverlayView.h"  @synthesize overlay; - (void)viewDidLoad {     [super viewDidLoad];              overlay = [[TileOverlay alloc] initOverlay];                  MKMapRect visibleRect = [mapView mapRectThatFits:overlay.boundingMapRect];         visibleRect.size.width /= 2;         visibleRect.size.height /= 2;         visibleRect.origin.x += visibleRect.size.width / 2;         visibleRect.origin.y += visibleRect.size.height / 2;         mapView.visibleMapRect = visibleRect;      [self SetMapDisplayTypeToSatelite:NO];      } - (void)SetMapDisplayTypeToSatelite:(BOOL)IsSatelite{ mapView.mapType = (IsSatelite == NO) ? MKMapTypeSatellite :  MKMapTypeStandard; 	[self AddRemoveOverlay:IsSatelite]; }  - (void)AddRemoveOverlay:(BOOL)show{     // мои доработки 1: используем OSM только на прошивке свыше 6.0     NSString *reqSysVer = @"6.0";     NSString *currSysVer = [[UIDevice currentDevice] systemVersion];     if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending){         if (show == YES && [Maptrix appmodel].SegmentMapPressed == YES) {             [mapView addOverlay:overlay]; //мои доработки 2: для того, чтобы не показывать слой карт Apple устанавливаем у него прозрачность             if ( [mapView.subviews count] && [((UIView *)[mapView.subviews objectAtIndex:0]).subviews count] )                 ((UIView *)[((UIView *)[mapView.subviews objectAtIndex:0]).subviews objectAtIndex:0]).alpha = 0.0;                      }else if (show == NO && [Maptrix appmodel].SegmentMapPressed == NO){             [mapView removeOverlay:overlay]; //мои доработки 3: для отображения карты в режиме спутник используем снова карты от Apple             if ( [mapView.subviews count] && [((UIView *)[mapView.subviews objectAtIndex:0]).subviews count] )                 ((UIView *)[((UIView *)[mapView.subviews objectAtIndex:0]).subviews objectAtIndex:0]).alpha = 1.0;         }     } }  
Итог

Для прошивки свыше 6.0 используются карты OSM. Причем пока карта не подгрузилась, пользователь не увидит карты Apple. При переключении между карта/спутник карта меняется между OSM и Apple.
Я честно говоря боялся, вдруг Apple нас не заапрувит. Мы перекрыли карты Apple, сделали их карту прозрачной (alpha = 0). И тем не менее нас заапрувили. Вот ссылка .
Теперь планируем подключать OSM на андроиде. Но об этом в следующей статье.

ссылка на оригинал статьи http://habrahabr.ru/post/173837/