关于地图使用

34 篇文章 0 订阅
31 篇文章 0 订阅


转载 http://www.cnblogs.com/fei-sky-001-o/articles/4953075.html

 

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;

 

}

引用自:http://blog.tianya.cn/post-7169156-112617948-1.shtml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值