zoukankan      html  css  js  c++  java
  • 在使用系统自带的地图遇到的问题

    在地图的定位中遇到 的问题(1.http://blog.csdn.net/m372897500/article/details/50770927

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

    3.大众点评是开放API 的,做团购可以去查阅Api

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

    1.无法地图定位管理代理方法 

    这两个新增的方法导致,之前写的程序在iOS8运行会出现,定位功能无法正常使用

    这样让iOS8正常使用定位功能呢?

    <1>你需要在info.plist表里面添加两条变量

     

    在Info.plist中加入两个缺省没有的字段

    • 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];

     

    }

  • 相关阅读:
    排序算法之--堆排序
    排序算法之--插入排序
    排序算法之--直接选择排序
    排序算法之--快速排序(及优化测试亿级100_000_000用时)
    分布式计算--(分布式+多进程+多线程+多协程)
    HDU
    2019牛客多校第四场D-triples I 贪心
    Interview_C++_day8
    Interview_C++_day7
    Interview_C++_day6
  • 原文地址:https://www.cnblogs.com/meixian/p/5370941.html
Copyright © 2011-2022 走看看