zoukankan      html  css  js  c++  java
  • IOS原生地图与高德地图

    原生地图

    1、什么是LBS

    LBS: 基于位置的服务   Location Based Service

    实际应用:大众点评,陌陌,微信,美团等需要用到地图或定位的App

    2、定位方式

    1.GPS定位      2.基站定位      3.WIFI定位

    3、框架

    MapKit:地图框架,显示地图

    CoreLocation:定位框架,没有地图时也可以使用定位.

    4、如何使用原生地图<MapKit> 和定位<CoreLocation>

    MapKit:

    1) 初始化MapView

         _mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];

        [self.view addSubview:_mapView];

    2) 设置代理

    _mapView.delegate = self;

    3) 设置地图类型

         _mapView.mapType = MKMapTypeStandard;

    4) 允许显示自己的位置

         _mapView.showsUserLocation = YES;

    5) 设置地图中心坐标点

         CLLocationCoordinate2D centerCoordinate = CLLocationCoordinate2DMake(22.540396,113.951832);

         _mapView.centerCoordinate = centerCoordinate;

    6) 设置地图显示区域

    a) 设置缩放

         MKCoordinateSpan span = MKCoordinateSpanMake(0.1, 0.1);

    b) 设置区域

        MKCoordinateRegion region = MKCoordinateRegionMake(centerCoordinate, span);

    c) 显示区域

        _mapView.region = region;

    CoreLocation:

    7) 初始化定位管理器

    _manager = [[CLLocationManager alloc] init];

    _manager.delegate = self;

    8) iOS8定位

    1. 在info.plist中添加 Privacy - Location Usage Description , NSLocationAlwaysUsageDescription

    2. 在代码中加入     

        if ( [UIDevice currentDevice].systemVersion.floatValue >= 8.0 ) {

              [_manager requestAlwaysAuthorization];

        }

    9) 开启定位

        [_manager startUpdatingLocation];

    10) 定位成功代理

    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

    {

          NSLog(@"定位成功");

        

          //获取定位的坐标

          CLLocation *location = [locations firstObject];

        

          //获取坐标

          CLLocationCoordinate2D coordinate = location.coordinate;

          NSLog(@"定位的坐标:%f,%f", coordinate.longitude, coordinate.latitude);

          //停止定位

          //[_manager stopUpdatingLocation];

    }

    11) 定位失败代理

    - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

    {

          NSLog(@"定位失败”);

    }

    12) 屏幕坐标转经纬度坐标

        CLLocationCoordinate2D cl2d = [_mapView convertPoint:point toCoordinateFromView:_mapView];

    13) 反地理编码

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

        [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {

    //获取地标对象

              CLPlacemark *mark = [placemarks firstObject];

         }];

    大头针(标注):

    14) 添加大头针

        //创建大头针

           MKPointAnnotation *pointAnn = [[MKPointAnnotation alloc] init];

        

           //设置坐标

           pointAnn.coordinate = CLLocationCoordinate2DMake(23.181297, 113.346877);

           //设置标题

           pointAnn.title = @"我的第一个大头针";

        

           //设置副标题

           pointAnn.subtitle = @"副标题";

        

           //显示大头针,把大头针加入到地图上

           [_mapView addAnnotation:pointAnn];

    15) 大头针的复用及定制

    #pragma  mark - mapView 代理方法

    //大头针View

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

    {

        

        //如果是自己当前位置的大头针,则不定制

        if ( [annotation isKindOfClass:[MKUserLocation class]]) {

            return  nil;

        }

            

    #if 1

        

        // 1、自带的大头针视图

        MKPinAnnotationView *pinAnnView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"ID"];

        if ( !pinAnnView ) {

            pinAnnView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"ID"];

        }

        

        //设置大头针的颜色

        pinAnnView.pinColor = MKPinAnnotationColorPurple;

        

        //设置掉落动画

        pinAnnView.animatesDrop = YES;

        

        //是否弹出气泡

        pinAnnView.canShowCallout = YES;

        

        //设置左视图

        UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];

        leftView.backgroundColor = [UIColor blueColor];

        pinAnnView.leftCalloutAccessoryView = leftView;

        

        //设置右视图

        UIButton *rightBtn = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

        pinAnnView.rightCalloutAccessoryView = rightBtn;

        

        return  pinAnnView;

        

    #else

        //2、自定义大头针视图

        /*

           * 区别于MKPinAnnotationView

           * 1、可以设置大头针图片

           * 2、不可以设置大头针颜色和掉落动画

           */

        

        MKAnnotationView *customView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"ID2"];

        if ( !customView ) {

            customView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"ID2"];

        }

        //设置点击大头针可以显示气泡

        customView.canShowCallout = YES;

        

        //设置大头针图片

        customView.image = [UIImage imageNamed:@"marker"];

        

        //设置左视图

        UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];

        leftView.backgroundColor = [UIColor blueColor];

        customView.leftCalloutAccessoryView = leftView;

        

        //设置右视图

        UIButton *rightBtn = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

        customView.rightCalloutAccessoryView = rightBtn;

        

        

        return  customView;

    #endif

        

    }

    16) 移除大头针

          [_mapView removeAnnotations:_mapView.annotations];

    17)  添加长按手势,实现在地图的长按点添加一个大头针

      //4、长按地图显示大头针

        UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];

        [_mapView addGestureRecognizer:longPress];

    #pragma  mark - 长按手势

    -(void)longPress:(UILongPressGestureRecognizer *)gesture

    {

        //避免多次调用 只允许开始长按状态才添加大头针

        if (gesture.state != UIGestureRecognizerStateBegan) {

            return;

        }

        

        //获取长按地图上的某个点

        CGPoint point = [gesture locationInView:_mapView];

        

        //把point转换成在地图上的坐标经纬度

        CLLocationCoordinate2D coordinate = [_mapView convertPoint:point toCoordinateFromView:_mapView];

        

        //添加长按的大头针

        MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];

        annotation.coordinate = coordinate;

        annotation.title = @"长按的大头针";

        annotation.subtitle = @"副标题";

        [_mapView addAnnotation:annotation];

        

    }

    高德地图

    1、高德地图申请Appkey流程:

    a) 在浏览器中打开网址:http://lbs.amap.com/api/ios-sdk/guide/verify/

    b) 访问:http://lbs.amap.com/console/key/,使用高德开发者账号登陆

    c) 2.在“KEY管理”页面点击上方的“获取key”按钮,依次输入应用名,选择绑定的服务为“iOS平台SDK”,输入Bundle Identifier(Bundle Identifier获取方式为Xcode->General->Identity)

    <Bundle Identifier : com.qianfeng.gaodedemo >

    <APIKEY : e848d391f9c4b98db0935052777f99d2 >

    2、高德地图配置工程流程:

    a)下载高德地图iOS SDK

    b)添加高德地图的库文件MAMapKit.framework

    c)添加8个关联库QuartzCore, CoreLocation, SystemConfiguration, CoreTelephony, libz, OpenGLES, libstdc++6.09, Security(MAMapView)

    d)添加AMap.bundle(MAMapKit.framework->Resources)

    e) TARGETS-Build Settings-Other Linker Flags 中添加内容: -ObjC;

    f)在代码中添加用户Key: [MAMapServices sharedServices].apiKey =@"您的key"; 

    3、单独使用搜索服务包:

    a)添加搜索库文件AMapSearchKit.framework

    b)添加关联库SystemConfiguration, CoreTelephony, libz, libstdc++6.09

    c)在代码中添加AMapSearchAPI *search = [[AMapSearchAPI alloc] initWithSearchKey: @"您的key" Delegate:self];

     

        

    4、如何使用高德地图<MAMapKit> 和 搜索<AMapSearchKit>

    MAMapKit:

    0)  配置高德地图API

    #define  APIKEY @"e848d391f9c4b98db0935052777f99d2"

         [MAMapServices sharedServices].apiKey = APIKEY;

    1) 初始化MAMapView

    _maMapView = [[MAMapView alloc] initWithFrame:self.view.bounds];

         [self.view addSubview:_maMapView];  

    2) 设置代理

         _maMapView.delegate = self; 

    3) 设置地图类型

         _maMapView.mapType = MAMapTypeStandard; 

    4) 允许显示自己的位置(如使用定位功能,则必须设置为YES)

        _maMapView.showsUserLocation = YES;  

    5) 设置logo位置

        _maMapView.logoCenter = CGPointMake(100, 100);

    6) 显示罗盘

        _maMapView.showsCompass = YES;

    7) 显示交通

        _maMapView.showTraffic = YES;

    8) 是否支持旋转

        _maMapView.rotateEnabled = YES;

    9) 是否支持拖动

        _maMapView.scrollEnabled = YES;

      10) 是否支持缩放

        _maMapView.zoomEnabled = NO;

    11) 设置地图显示区域

    a) 设置坐标

        CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(23.181297, 113.346877);

    b) 设置缩放

        MACoordinateSpan span = MACoordinateSpanMake(0.1, 0.1);

    c) 设置区域

        MACoordinateRegion region = MACoordinateRegionMake(coordinate, span);

    d) 显示区域

        _maMapView.region = region;

    12)  定位

      #pragma  mark - 定位 回调方法

      -(void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation

      {

          NSLog(@"定位成功");

        

          CLLocation *location = userLocation.location;

          CLLocationCoordinate2D coordinate = location.coordinate;

        

          NSLog(@"我的坐标位置:%f, %f", coordinate.longitude, coordinate.latitude);

        

          // 定位后,可设置停止定位

          // _maMapView.showsUserLocation = NO;

      }

      13) 添加标注(大头针)

        //添加标注

          MAPointAnnotation *annotation = [[MAPointAnnotation alloc] init];

          annotation.coordinate = coordinate; //设置标注的坐标

          annotation.title = @"高德地图标题"; //设置标题

          annotation.subtitle = @"副标题"; //设置副标题

          [_maMapView addAnnotation:annotation]; //将标注添加在地图上

    14) 标注的复用及定制

      #pragma  mark - 定制标注视图(和原生地图定制方式类似)

      - (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation

      {

          //不定制自己位置的标注视图

          if ( [annotation isKindOfClass:[MAUserLocation class]]) {

              return nil;

          }

        

      #if 1

        

          // 1、自带的标注视图

          MAPinAnnotationView *pinAnnView = (MAPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"ID"];

          if ( !pinAnnView ) {

              pinAnnView = [[MAPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"ID"];

          }

        

          // 是否可弹出视图

          pinAnnView.canShowCallout = YES;

        

          // 设置掉落动画

          pinAnnView.animatesDrop = YES;

        

          // 设置标注颜色

          pinAnnView.pinColor = MAPinAnnotationColorGreen;

        

          // 设置左视图

          UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];

          leftView.backgroundColor = [UIColor blueColor];

          pinAnnView.leftCalloutAccessoryView = leftView;

        

          //设置右视图

          UIButton *rightBtn = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

          pinAnnView.rightCalloutAccessoryView = rightBtn;

        

          return pinAnnView;

        

      #else 

        

          //2、自定义标注视图

          MAAnnotationView *customView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"ID2"];

          if ( !customView ) {

              customView = [[MAAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"ID2"];

          }

        

          //设置点击大头针可以显示气泡

          customView.canShowCallout = YES;

        

          //设置大头针图片

          customView.image = [UIImage imageNamed:@"marker"];

        

          //设置左视图

          UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];

          leftView.backgroundColor = [UIColor blueColor];

          customView.leftCalloutAccessoryView = leftView;

        

          //设置右视图

          UIButton *rightBtn = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

          customView.rightCalloutAccessoryView = rightBtn;

        

          return  customView;

        

      #endif

      }

    15) 添加长按手势

          UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];

          [_maMapView addGestureRecognizer:longPress];

      #pragma  mark -- 长按手势Action

      -(void)longPress:(UILongPressGestureRecognizer *)longPress

      {

          if (longPress.state != UIGestureRecognizerStateBegan) {

              return;

          }

        

          //获取点位置

          CGPoint point = [longPress locationInView:_maMapView];

        

          //将点位置转换成经纬度坐标

          CLLocationCoordinate2D coordinate = [_maMapView convertPoint:point toCoordinateFromView:_maMapView];

        

          //在该点添加一个大头针(标注)

          MAPointAnnotation *pointAnn = [[MAPointAnnotation alloc] init];

          pointAnn.coordinate = coordinate;

          pointAnn.title = @"长按的大头针";

          pointAnn.subtitle = @"副标题";

          [_maMapView addAnnotation:pointAnn];

        

      }

    AMapSearchKit:

      1) 搜索周边

    0)  创建AMapSearchAPI对象,配置APPKEY,同时设置代理对象为self

        searchAPI = [[AMapSearchAPI alloc] initWithSearchKey:APIKEY Delegate:self];

    a) 创建搜索周边请求类

        AMapPlaceSearchRequest *searchRequest = [[AMapPlaceSearchRequest alloc] init];

    b) 设置搜索类型(按关键字搜索)

        searchRequest.searchType = AMapSearchType_PlaceKeyword;

    c) 设置关键字

        searchRequest.keywords = keywordsTextField.text;

    d) 设置搜索城市

        searchRequest.city = @[@"广州"];

    e) 开始搜索

        [searchAPI AMapPlaceSearch:searchRequest];

      2) 搜索周边回调方法

    a) 搜索失败

    - (void)searchRequest:(id)request didFailWithError:(NSError *)error

    {

        NSLog(@"搜索失败");

    }

    b) 搜索成功

    -(void)onPlaceSearchDone:(AMapPlaceSearchRequest *)request response:(AMapPlaceSearchResponse *)response

    {

        //清空原来的标注(大头针)

        [_maMapView removeAnnotations:_maMapView.annotations];

        //判断是否为空

        if (response) {

            

            //取出搜索到的POI(POI:Point Of Interest)

            for (AMapPOI *poi in response.pois) {

                

                //poi的坐标

                CLLocationCoordinate2D coordinate = 

    CLLocationCoordinate2DMake(poi.location.latitude, poi.location.longitude);

                

                //地名

                NSString *name = poi.name;

                

                //地址

                NSString *address = poi.address;

                

                //用标注显示

                MAPointAnnotation *pointAnn = [[MAPointAnnotation alloc] init];

                pointAnn.coordinate = coordinate;

                pointAnn.title = name;

                pointAnn.subtitle = address;

                [_maMapView addAnnotation:pointAnn];

            }

        }

    }

      3)  添加折线

    #pragma  mark - 画折线

    -(void)drawPolyLine

    {

        //初始化点

        NSArray *latitudePoints =[NSArray arrayWithObjects:

                                  @"23.172223",

                                  @"23.163385",

                                  @"23.155411",

                                  @"23.148765",

                                  @"23.136935", nil];

        NSArray *longitudePoints = [NSArray arrayWithObjects:

                                    @"113.348665",

                                    @"113.366056",

                                    @"113.366128",

                                    @"113.362391",

                                    @"113.356785", nil];

        

        // 创建数组

        CLLocationCoordinate2D polyLineCoords[5];

        

        for (int i=0; i<5; i++) {

            polyLineCoords[i].latitude = [latitudePoints[i] floatValue];

            polyLineCoords[i].longitude = [longitudePoints[i] floatValue];

        }

        

        // 创建折线对象

        MAPolyline *polyLine = [MAPolyline polylineWithCoordinates:polyLineCoords count:5];

        

        // 在地图上显示折线

        [_maMapView addOverlay:polyLine];

        

    }

    #pragma  mark - 定制折线视图

    -(MAOverlayView *)mapView:(MAMapView *)mapView viewForOverlay:(id<MAOverlay>)overlay

    {

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

            

            MAPolylineView *polyLineView = [[MAPolylineView alloc] initWithPolyline:overlay];

            polyLineView.lineWidth = 2; //折线宽度

            polyLineView.strokeColor = [UIColor blueColor]; //折线颜色

            polyLineView.lineJoinType = kMALineJoinRound; //折线连接类型

            

            return polyLineView;

        }

        return nil;

    }

  • 相关阅读:
    Git修改注释
    数组和切片的区别
    SpringBoot启动报:Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
    eclipse中web.xml报:The content of element type "web-app" must match "(icon?,display- name?,
    eclipse错误: 在类xxx中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application
    idea Cannot resolve method ‘setAttribute(java.lang.String, java.lang.String)/不能使用pageContext.setAttribute()
    解决Nginx启动报nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    数据仓库开发规范
    详解会话技术cookie、session和token
    Requests爬虫包及解析工具 xpath、正则、Beautiful Soup
  • 原文地址:https://www.cnblogs.com/lijiehai/p/4432328.html
Copyright © 2011-2022 走看看