原生地图

1、什么是LBS

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

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

2、定位方式

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

3、框架

MapKit:地图框架,显示地图

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

4、如何使用原生地图 和定位

MapKit:

  1. 初始化MapView

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

    [self.view addSubview:_mapView];

  2. 设置代理

_mapView.delegate = self;

  1. 设置地图类型

    _mapView.mapType = MKMapTypeStandard;

  2. 允许显示自己的位置

    _mapView.showsUserLocation = YES;

  3. 设置地图中心坐标点

    CLLocationCoordinate2D centerCoordinate = CLLocationCoordinate2DMake(22.540396,113.951832);

    _mapView.centerCoordinate = centerCoordinate;

  4. 设置地图显示区域

a) 设置缩放

 MKCoordinateSpan span = MKCoordinateSpanMake(0.1, 0.1);

b) 设置区域

MKCoordinateRegion region = MKCoordinateRegionMake(centerCoordinate, span);

c) 显示区域

_mapView.region = region;

CoreLocation:

  1. 初始化定位管理器

_manager = [[CLLocationManager alloc] init];

_manager.delegate = self;

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

  2. 在代码中加入

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

       [_manager requestAlwaysAuthorization];

    }

  1. 开启定位

    [_manager startUpdatingLocation];

  2. 定位成功代理

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

}

  1. 定位失败代理
  • (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

{

  NSLog(@"定位失败”);

}

  1. 屏幕坐标转经纬度坐标

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

  2. 反地理编码

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

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

//获取地标对象

      CLPlacemark *mark = [placemarks firstObject];

 }];

大头针(标注):

  1. 添加大头针

    //创建大头针

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

    //设置坐标

    pointAnn.coordinate = CLLocationCoordinate2DMake(23.181297, 113.346877);

    //设置标题

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

    //设置副标题

    pointAnn.subtitle = @"副标题";

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

    [_mapView addAnnotation:pointAnn];

  2. 大头针的复用及定制

pragma mark - mapView 代理方法

//大头针View

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)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

}

  1. 移除大头针

    [_mapView removeAnnotations:_mapView.annotations];

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

//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)

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:

  1. 配置高德地图API

define APIKEY @"e848d391f9c4b98db0935052777f99d2"

 [MAMapServices sharedServices].apiKey = APIKEY;
  1. 初始化MAMapView

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

 [self.view addSubview:_maMapView];
  1. 设置代理

    _maMapView.delegate = self;

  2. 设置地图类型

    _maMapView.mapType = MAMapTypeStandard;

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

    _maMapView.showsUserLocation = YES;

  4. 设置logo位置

    _maMapView.logoCenter = CGPointMake(100, 100);

  5. 显示罗盘

    _maMapView.showsCompass = YES;

  6. 显示交通

    _maMapView.showTraffic = YES;

  7. 是否支持旋转

    _maMapView.rotateEnabled = YES;

  8. 是否支持拖动

    _maMapView.scrollEnabled = YES;

  9. 是否支持缩放

_maMapView.zoomEnabled = NO;
  1. 设置地图显示区域

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;
  1. 定位

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;

}

  1. 添加标注(大头针)
//添加标注

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

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

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

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

  [_maMapView addAnnotation:annotation]; //将标注添加在地图上
  1. 标注的复用及定制

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

  • (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id)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

}

  1. 添加长按手势

    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. 搜索周边

  2. 创建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];
  1. 搜索周边回调方法

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

    }

}

}

  1. 添加折线

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)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;

}

iOS原生地图与高德地图的使用的更多相关文章

  1. React Native填坑之旅 -- 使用iOS原生视图(高德地图)

    在开发React Native的App的时候,你会遇到很多情况是原生的视图组件已经开发好了的.有的是系统的SDK提供的,有的是第三方试图组件,总之你的APP可以直接使用的原生视图是很多的.React ...

  2. IOS原生地图与高德地图

    原生地图 1.什么是LBS LBS: 基于位置的服务   Location Based Service 实际应用:大众点评,陌陌,微信,美团等需要用到地图或定位的App 2.定位方式 1.GPS定位  ...

  3. iOS之原生地图与高德地图

    原生地图 1.什么是LBS LBS: 基于位置的服务 Location Based Service 实际应用:大众点评,陌陌,微信,美团等需要用到地图或定位的App 2.定位方式 1.GPS定位 2. ...

  4. ios 一步一步学会自定义地图吹出框(CalloutView)-->(百度地图,高德地图,google地图)

    前言 在 ios上边使用地图库的同学肯定遇到过这样的问题:吹出框只能设置title和subtitle和左右的view,不管是百度地图还是高德地图还是自带的 google地图,只提供了这四个属性,如果想 ...

  5. iOS打开百度地图、高德地图导航

    1.判断手机里是否已经安装了百度地图或者高德地图: BOOL hasBaiduMap = NO; BOOL hasGaodeMap = NO; if ([[UIApplication sharedAp ...

  6. arcgis api 3.x for js 入门开发系列十七在线天地图、百度地图、高德地图(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  7. 百度地图和高德地图坐标系的互相转换 四种Sandcastle方法生成c#.net帮助类帮助文档 文档API生成神器SandCastle使用心得 ASP.NET Core

    百度地图和高德地图坐标系的互相转换   GPS.谷歌.百度.高德坐标相互转换 一.在进行地图开发过程中,我们一般能接触到以下三种类型的地图坐标系: 1.WGS-84原始坐标系,一般用国际GPS纪录仪记 ...

  8. 在WPF中使用谷歌地图和高德地图

    原文:在WPF中使用谷歌地图和高德地图 在桌面软件开发中可能会遇到这样的需求:显示地图. 常用的地图API有Google Map和高德地图.二者都提供了各种平台的API. 为了方便集成,本文使用Jav ...

  9. iOS第三方地图-高德地图(导航sdk路径规划)

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

随机推荐

  1. LSTM模型与前向反向传播算法

    在循环神经网络(RNN)模型与前向反向传播算法中,我们总结了对RNN模型做了总结.由于RNN也有梯度消失的问题,因此很难处理长序列的数据,大牛们对RNN做了改进,得到了RNN的特例LSTM(Long ...

  2. JavaScript数据结构——栈的实现

    栈(stack)是一种运算受限的线性表.栈内的元素只允许通过列表的一端访问,这一端被称为栈顶,相对地,把另一端称为栈底.装羽毛球的盒子是现实中常见的栈例子.栈被称为一种后入先出(LIFO,last-i ...

  3. Floating IP in OpenStack Neutron

    前言 Floating IP 是相对于Fixed IP而言的,它一般是在VM创建后分配给VM的,可以达到的目的就是,外界可以访问通过这个Floating Ip访问这个VM,VM也可以通过这个IP访问外 ...

  4. Spring还使用基于 JSR-250 注释,它包括 @PostConstruct, @PreDestroy 和 @Resource 注释

    @PostConstruct 和 @PreDestroy 注释: 你可以使用 @PostConstruct 注释作为初始化回调函数的一个替代,@PreDestroy 注释作为销毁回调函数的一个替代,其 ...

  5. 开源的.NET定时任务组件Hangfire解析

    项目慢慢就要开工了,很多园友都在问这个事情,看来大伙对这事很上心啊,事情需要一步步的来,尽量写出一个我们都满意的项目.以前每次在博客前面都会扯淡一下,不过很多人都抱怨这样做不好,加上我这人扯淡起来就停 ...

  6. windows phone 8.1开发:socket通信聊天

    本例用WPF程序做服务器端,windows phone程序做客户端.我们使用基于UDP协议的Socket通信.更多关于socket信息请查看:http://msdn.microsoft.com/zh- ...

  7. java 反射与常用用法

    java通常是先有类再有对象,有对象我就可以调用方法或者属性. 反射其实是通过Class对象来调用类里面的方法.通过反射可以调用私有方法和私有属性.大部分框架都是运用反射原理. 如何获得Class对象 ...

  8. xgboost-python参数深入理解

    由于在工作中应用到xgboost做特征训练预测,因此需要深入理解xgboost训练过程中的参数的意思和影响. 通过search,https://www.analyticsvidhya.com/blog ...

  9. iOS开发之Run Loop

    1.概述 (1) Run Loop提供了一种异步执行代码的机制,不能并行执行任务. (2) 在主队列中,Main Run Loop直接配合任务的执行,负责处理UI事件.计时器,以及其它内核相关事件. ...

  10. centos6.5 源码安装 gtk 环境

    解决 No package 'gtk+-2.0′ found问题方法:yum install libgnomeui-devel 执行了上面的,下面的就可以放弃了,yum 大法好 首先 yum 安装下面 ...