• 在使用系统自带的地图遇到的问题


    在地图的定位中遇到 的问题(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];

     

    }

  • 相关阅读:
    spring mvc给参数起别名
    聊聊分布式定时任务中间件架构及其实现--转
    Batch Normalization的算法本质是在网络每一层的输入前增加一层BN层(也即归一化层),对数据进行归一化处理,然后再进入网络下一层,但是BN并不是简单的对数据进行求归一化,而是引入了两个参数λ和β去进行数据重构
    终端安全工具 gartner 排名
    When Cyber Security Meets Machine Learning 机器学习 安全分析 对于安全领域的总结很有用 看未来演进方向
    DNS隧道之DNS2TCP实现——dns2tcpc必须带server IP才可以,此外ssh可以穿过墙的,设置代理上网
    DNS隧道之DNS2TCP使用心得教程——是可以用来穿透qiang的,ubuntu下直接apt install dns2tcp
    DNS隧道工具汇总——补充,还有IP over DNS的工具NSTX、Iodine、DNSCat
    Data Mining and Machine Learning in Cybersecurity PDF
    ES failed to notify ClusterStateListener java.lang.IllegalStateException: environment is not locked
  • 原文地址:https://www.cnblogs.com/meixian/p/5370941.html
Copyright © 2020-2023  润新知