在使用系統自帶的地圖遇到的問題

在地圖的定位中遇到 的問題(1.http://blog.csdn.net/m372897500/article/details/50770927數組

2.http://www.jianshu.com/p/217f041eeb24緩存

3.大衆點評是開放API 的,作團購能夠去查閱Api服務器

app

************************************************************************************************************異步

1.沒法地圖定位管理代理方法 post

這兩個新增的方法致使,以前寫的程序在iOS8運行會出現,定位功能沒法正常使用動畫

這樣讓iOS8正常使用定位功能呢?編碼

<1>你須要在info.plist表裏面添加兩條變量spa

 

在Info.plist中加入兩個缺省沒有的字段.net

  • NSLocationAlwaysUsageDescription      YES 
  • NSLocationWhenInUseUsageDescription  YES

這兩個字段沒什麼特別的意思,就是自定義提示用戶受權使用地理定位功能時的提示語。

手動請求:

_instance.locationManager = [[CLLocationManager alloc] init];//建立位置管理器

  _instance.locationManager.delegate=_instance;

  _instance.locationManager.desiredAccuracy=kCLLocationAccuracyBest;//設置爲精準定位

  _instance.locationManager.distanceFilter=100.0f;//定位距離過濾器

  _instance.updating=NO;

  //定位服務是否可用

  BOOL enable=[CLLocationManager locationServicesEnabled];

  //是否具備定位權限

  int status=[CLLocationManager authorizationStatus];

  if(!enable || status<3){

      //請求權限

      [_instance.locationManager requestWhenInUseAuthorization];

  }

在看看authorizationStatus的枚舉吧

typedef NS_ENUM(int, CLAuthorizationStatus) {

  // 用戶從未選擇過權限

  kCLAuthorizationStatusNotDetermined = 0,

  // 沒法使用定位服務,該狀態用戶沒法改變

  kCLAuthorizationStatusRestricted,

  // 用戶拒絕該應用使用定位服務,或是定位服務總開關處於關閉狀態

  kCLAuthorizationStatusDenied,

  // 這個值已棄用

  kCLAuthorizationStatusAuthorized // 大體是用戶容許該程序不管什麼時候均可以使用地理信息

  kCLAuthorizationStatusAuthorizedAlways // 大體是用戶贊成程序在可見時使用地理位置

  kCLAuthorizationStatusAuthorizedWhenInUse 

};

***************************************************************************    /*CLPlacemark :(屬性)

     //NSDictionary *addressDictionary //屬性,遍歷字典數據

      NSString *name; // 地名

      NSString *thoroughfare; //街道

      NSString *subThoroughfare; //街道和相關的信息,例如門診等

      NSString *locality; //城市

      NSString *subLocality; //城市相關信息,好比標誌性建築

      NSString *administrativeArea; //直轄市,省

      NSString *subAdministrativeArea; // 直轄市相關信息

      NSString *postalCode; //郵編

      NSString *ISOcountryCode;//國家郵編

      NSString *country; // 國家

      NSString *inlandWater; //水潭,湖泊

      NSString *ocean; //海洋

      NSArray *areasOfInterest;//關聯或相關性地標

     */

***************************************************************************

設置系統的大頭針樣式 (記得添加大頭針的時候記得遵照代理MKAnnotation)

/**

 *設置大頭針視圖的樣式

 *annotation:大頭針

 *returnnil(設置位系統默認的大頭針樣式,默認annotationView 是不可見的,要想可見換成 MKPinAnnotationView)

 //區別:若是想建立以靜態圖片做爲大頭針圖片的話,能夠經過建立MKAnnotationView是實例。若是想使用apple自帶的大頭針則建立MKPinAnnotationView

 */

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation

{

    //若是是用戶的當前的位置,這返回空,使用系統的大頭針

    if([annotation isKindOfClass:[MKUserLocation class]])return nil;

    //設置標誌符

    static NSString *ID = @"annotation";

    //從緩衝池裏取出大頭針

    MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];

    //若是爲空,設置大頭針

    if (annotationView == nil) {

        annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:ID];

        //設置大頭針的屬性(標題和子標題)能夠顯示

        annotationView.canShowCallout = YES;

        

        //設置MKPinAnnotationView 大頭針的顏色

        annotationView.pinColor = MKPinAnnotationColorPurple;

        

        //設置MKPinAnnotationView 的掉落效果

        annotationView.animatesDrop = YES;

    }

    annotationView.annotation = annotation;

    return annotationView;

}

***************************************************************************

/**

 *設置大頭針視圖的樣式

 *annotation:大頭針

 *return:nil(設置位系統默認的大頭針樣式,默認annotationView 是不可見的,要想可見換成 MKPinAnnotationView)

 //區別:若是想建立以靜態圖片做爲大頭針圖片的話,能夠經過建立MKAnnotationView是實例。若是想使用apple自帶的大頭針則建立MKPinAnnotationView

 */

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation

{

    //若是是用戶的當前的位置,這返回空,使用系統的大頭針

    if([annotation isKindOfClass:[MKUserLocation class]])return nil;

    static NSString *ID = @"annotationView";

    //從緩存池中取

    MyAnnotationView *myAnnotationView = (MyAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];

    //判斷是否爲空

    if (myAnnotationView == nil) {

        myAnnotationView = [[MyAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:ID];

        //顯示出繼承MKAnnotationView 的 大頭針 canShowCallout 顯示(標題和子標題)出內容

         myAnnotationView.canShowCallout = YES;

//       myAnnotationView.image = [UIImage imageNamed:@"gps_13"];

       //設置大頭針的左右兩邊的按鈕

        myAnnotationView.leftCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd];

        myAnnotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

    }

    MyAnnotation *anno = (MyAnnotation *)annotation;

    myAnnotationView.image = [UIImage imageNamed:anno.icon];

    //系統默認已經調用了

//    myAnnotationView.annotation = annotation;

    return myAnnotationView;

}

#pragma mark MKAnnotation 代理

 

//設置annotationView 已經添加,在這裏設置顯示的過程,

 

//views:全部的annotationView ,設置它的動畫

-(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views

{

    for (MKAnnotationView *annoView in views) {

        //判斷是否爲用戶位置的大頭針,是的話不設置動畫

        if ([annoView.annotation isKindOfClass:[MKUserLocation class]])return;

        //保存原來的views的位置

        CGRect endFrame = annoView.frame;

        //改變原來的位置

        annoView.frame = CGRectMake(endFrame.origin.x, 0, endFrame.size.width, endFrame.size.height);

        [UIView animateWithDuration:0.5 animations:^{

            annoView.frame = endFrame;

 

        }];

    }

}

 

在iOS 8 之前的若是使用storyBoard  使用 mapView 就要使用mapKit 

***************************************************************************

//打開手機的官方地圖進行導航

- (IBAction)navigate {

    //獲取目的地

    NSString *destination = self.destinationField.text;

    if (destination.length == 0)  return;    

    //2.進行地理編碼

    CLGeocoder *gecode = [[CLGeocoder alloc] init];

    [gecode geocodeAddressString:destination completionHandler:^(NSArray *placemarks, NSError *error) {

        if (placemarks.count == 0 || error ) return ;

        //2.1獲取目的地地標

        CLPlacemark *clpm = [placemarks firstObject];

        //2.2經過CLPlacemark(地標)獲取MKPlacemark

        MKPlacemark *ckpm = [[MKPlacemark alloc] initWithPlacemark:clpm];

        //2.3經過MKPlacemark獲取目的地的MKMapItem

        MKMapItem *destinationItem = [[MKMapItem  alloc] initWithPlacemark:ckpm];

        //2.3獲取起始地(出發地)的位置

         MKMapItem *sourceItem = [MKMapItem mapItemForCurrentLocation];

        //2.4開始導航

        [self startNavigateWithSourceItem:sourceItem destinationItem:destinationItem];

    }];   

}

 

/**

 *開始導航

 *1.startNavigateWithSourceItem:出發地

 *2.destinationItem:目的地

 */

-(void)startNavigateWithSourceItem:(MKMapItem *)sourceItem destinationItem:(MKMapItem *)destinationItem

{

    //將起點和終點放入數組中

    NSArray *item = @[sourceItem,destinationItem];    

    //設置launchOptions 的選項字典

    NSDictionary *lauchOptions = @{

                    MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving,

                    MKLaunchOptionsMapTypeKey:@(MKMapTypeStandard),

                    MKLaunchOptionsShowsTrafficKey:@YES                   

                    };

    [MKMapItem openMapsWithItems:item launchOptions:lauchOptions];

}

*********************************

導航劃線:http://blog.csdn.net/jianjianyuer/article/details/19568167

 

- (void)viewDidLoad {

    [super viewDidLoad];

    //設置顯示的區域的中心

    

     self.mapview.delegate = self;

    CLLocationCoordinate2D coordinate ={45.748637,126.699891};

    MKCoordinateSpan span = MKCoordinateSpanMake(0.09, 0.09);

    MKCoordinateRegion region = MKCoordinateRegionMake(coordinate, span);

    [self.mapview setRegion:region];

    [self.mapview regionThatFits:region];//設置兼容性

    

    //設置第一個地點

    CLLocationCoordinate2D redCoordinate =  CLLocationCoordinate2DMake(45.748637, 126.699891);

    MKPlacemark *ckpm = [[MKPlacemark alloc]initWithCoordinate:redCoordinate addressDictionary:nil];

    MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:ckpm];

    mapItem.name = @"red rocks";

    

    //設置第一個地點

    CLLocationCoordinate2D coordinate2 = CLLocationCoordinate2DMake(45.747747, 126.658671);

    //MKPlacemark表明地圖上的實際位置,也就是它的經緯度

    MKPlacemark *ckpm2 = [[MKPlacemark alloc] initWithCoordinate:coordinate2 addressDictionary:nil];

    MKMapItem *mapItem2 = [[MKMapItem alloc] initWithPlacemark:ckpm2];

    mapItem2.name =@"sports  authority";

    

    //設置畫線的方向

    [self findDirector:mapItem to:mapItem2];

    

    

}

-(void)findDirector:(MKMapItem *)source  to:(MKMapItem *)destination

{

    //請求方向指南,須要兩個地圖上的實際位置

    MKDirectionsRequest *request =[[MKDirectionsRequest alloc] init];

    request.source = source;

    request.destination = destination;

    // RequestsAlternateRoutes。若是路由服務器能夠找出多條合理的路線,設置YES將會返回全部路線。不然,只返回一條路線。

    request.requestsAlternateRoutes = NO;

    

    //請求路線

    MKDirections *direction = [[MKDirections alloc] initWithRequest:request];

    //將使用兩個方法:calculateETAWithCompletionHandler:計算路線的花費的時間,

    //calculateDirectionsWithCompletionHandler計算真實的路線。

    //兩個方法都是異步的

    [direction calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {

        if (error) {

            NSLog(@"show director error %@",error);

        }else

        { //方向指南響應

            [self showDirectorOnMap:response];

        }

        

    }];

    

    

 

}

//渲染MKPoline

-(MKOverlayRenderer*)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay

{

    if ([overlay isKindOfClass:[MKPolyline class]]) {

        MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];

        renderer.lineWidth = 3;

        renderer.strokeColor = [UIColor redColor];

        return renderer;

        

    }else

    {

    

        return nil;

    }

 

}

/**

 *從蘋果服務器回送的對象是MKDirectionsResponse,還有源和目的地,包括MKRoute對象數組。注意,這個數組只有一個對象除非咱們設置setrequestsAlternateRoutesYES

 MKRoute 對象,如它的名字,表明用戶選擇的兩點之間的路線。它包含一些關於路線信息的屬性:

 1        name:從服務器找到路線時自動生成的。它是基於路線的重要特徵。

 2        advisoryNoties:字符串數組,包含一些適合生成路線的警告等諸如此類的詳情。

 3        distance:是沿着路線的距離,不是位移。單位是米。

 4        expectedTravelTimeNSTimeInterval,單位秒。

 5        transportType

 6        polylineMKPolyline表明地圖上路徑。能夠畫在MKMapView上,下一節將會看到。

 7        stepsMKRouteStep 對象的數組,製做路線的。

 *

 */

//方向指南響應

-(void)showDirectorOnMap:(MKDirectionsResponse *)response

{

    self.response = response;

    for (MKRoute *route in self.response.routes) {

        NSArray *routeoverlays = [NSArray arrayWithObject:route.polyline];

        [self.mapview addOverlays:routeoverlays  level:MKOverlayLevelAboveRoads ];

    }

    [self.mapview addAnnotation:self.response.source.placemark];

    [self.mapview addAnnotation:self.response.destination.placemark];

 

}

相關文章
相關標籤/搜索