MkMapKitを使用したOpenStreetMap

こんにちは

この記事では、私たち(Maptrix開発者)がどのようにしてAppleカードを無効にし、それらをOpenStreetMapのカードに置き換えたかを説明しようとします。







問題:


MkMapkitの組み込みコンポーネントのiOS 6.0ファームウェアから、Appleのカードが使用されることは秘密ではありません。 最後に、Appleは独立し、Googleを放棄することができました。 プレゼンテーションでは、すべてがすばらしかった!

しかし、いつものように、1つの「しかし」:これらの3Dの奇跡はすべて、米国(他の先進国)のユーザーのみが利用できます。 特に、Appleによると、ロシアの住民は1つの大きな砂漠に住んでいます。



画像



可能な解決策:


最初の考えは、MKMapViewから逃げることでした。

残念ながら、考慮された類似体から、このライブラリの完全なコピーを見つけることはできませんでした。 ちなみに、Yandexライブラリの構造はおおよそ似ています(http://github.com/yandexmobile/yandexmapkit-iosおよびgithub.com/yandexmobile/yandexmapkit-ios )。

それで、カードやピンなどを扱うという考えに至りました。 そのままにして、Appleのカード画像の代わりに、より精巧なものに置き換える必要があります。



その結果、Open Street Mapとこのライブラリをいくつかの改良を加えて使用することにしました。



画像



合わなかったもの:


1. Sateliteマップを切り替えると、マップが切り替わりませんでした

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カードをブロックし、カードを透明にしました(アルファ= 0)。 それにもかかわらず、私たちは台無しにされました。 こちらがリンクです。

次に、OSMをAndroidに接続する予定です。 しかし、それについては次の記事で詳しく説明します。



All Articles