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 [email protected]"您的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;

}

时间: 2024-11-03 22:06:12

IOS原生地图与高德地图的相关文章

ios 一步一步学会自定义地图吹出框(CalloutView)--&gt;(百度地图,高德地图,google地图)

前言 在 ios上边使用地图库的同学肯定遇到过这样的问题:吹出框只能设置title和subtitle和左右的view,不管是百度地图还是高德地图还是自带的 google地图,只提供了这四个属性,如果想添加更多的view,只能自定义.可是,类库只能看到.h文件,.m都看不到,这让新手比较蛋疼,庞大的地 图类库一时半会摸不着头脑,从头再学还需要时间,本文就教大家快速制作一个属于自己的 CalloutView!等你一步一步调通后,再回过头来使用系统自带的方法设置callout,就会领悟这个过程. 正文

Android笔记:百度地图与高德地图坐标转换问题

Android笔记:百度地图与高德地图坐标转换问题 安卓项目使用了百度地图的定位SDK,web端使用的也是百度地图, 后来发现界面显示百度地图不如高德效果好,web改用高德地图,原本的百度地图坐标是可以直接使用的,由于高德和百度地图的坐标系不一致 要如何转换呢. 补充了下坐标系知识后发现高德使用的坐标系是“gcj02”也就是大家所说的“火星坐标”, 百度使用的是“BD09”因为是百度所用大家习惯称之为“百度坐标”  ,如何将bd09转为gcj02呢,突然想到在百度的定位sdk里有这样一段说明(来

arcgis api for js入门开发系列十七在线地图(天地图、百度地图、高德地图)

本篇主要讲述的是利用arcgis api加载互联网在线地图服务资源,简单封装一个底图切换控件js,在线地图包括:天地图.高德地图以及百度地图,效果图如下: 实现思路: 1.简单的底图切换控件map.LayerSwitcherToolbar.js文件,里面自定义加载天地图.高德地图以及百度地图类,其实都是继承TiledMapServiceLayer类: (1)高德地图: //高德地图图层扩展 GAODELayer = DObject({ id:null, esriLayer: null, esri

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

BOOL hasBaiduMap = NO; BOOL hasGaodeMap = NO; if ([[UIApplication sharedApplication]canOpenURL:[NSURL URLWithString:@"baidumap://map/"]]){ hasBaiduMap = YES; } if ([[UIApplication sharedApplication]canOpenURL:[NSURL URLWithString:@"iosamap:

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

高德地图导航sdk的路径规划获取行程信息主要用到AMapNaviManager这个类 然后调下面的方法 /*! @brief 带起点的驾车路径计算 @param startPoints 起点坐标.支持多个起点,起点列表的尾点为实际导航起点,其他坐标点为辅助信息,带有方向性,可有效避免算路到马路的另一侧. @param endPoints 终点坐标.支持多个终点,终点列表的尾点为实际导航终点,其他坐标点为辅助信息,带有方向性,可有效避免算路到马路的另一侧. @param wayPoints 途经点

百度地图,高德地图,HTML5经纬度比较

对于一个地点的经纬度,是确定的?这个问题,我想很多人都会回答,肯定了,可实际上呢?我只能呵呵了. 在使用百度地图的过程中,发现一个很奇怪的现象,有时候调用百度地图js API时,后得到一个错的离谱的地方.然后我自己也就研究了一下jsAPI获取地理位置的相关信息,jsAPI其实都是利用了HTML5中的方法获取地理信息的.但很奇怪,使用HTML5获取到的经纬度和百度获取的竟然相差很大. HTML5获取到的经纬度 function getLocation() { if (navigator.geolo

百度地图、高德地图的数据从哪里得到的?[声明我只是此文章的搬运工,从百度知道复制来的]

要说数据来源,首先得对地图数据做一个分类,因为不同分类的数据,其来源,采集方法都是有大不同的. 要明白地图的数据分类,必须先理解一个概念,就是地图图层的概念: 如上图,电子地图对我们实际空间的表达,事实上是通过不同的图层去描述,然后通过图层叠加显示来进行表达的过程. 对于我们地图应用目标的不同,叠加的图层也是不同的,用以展示我们针对目标所需要信息内容. 其次呢,我引入一下矢量模型和栅格模型的概念,GIS(电子地图)采用两种不同的数学模型来对现实世界进行模拟: 矢量模型:同多X,Y(或者X,Y,Z

百度地图、高德地图的数据从哪里得到的?

要说数据来源,首先得对地图数据做一个分类,因为不同分类的数据,其来源,采集方法都是有大不同的. 要明白地图的数据分类,必须先理解一个概念,就是地图图层的概念:        如上图,电子地图对我们实际空间的表达,事实上是通过不同的图层去描述,然后通过图层叠加显示来进行表达的过程. 对于我们地图应用目标的不同,叠加的图层也是不同的,用以展示我们针对目标所需要信息内容. 其次呢,我引入一下矢量模型和栅格模型的概念,GIS(电子地图)采用两种不同的数学模型来对现实世界进行模拟: 矢量模型:同多X,Y(

系统地图和高德地图

系统地图: #import "ViewController.h"#import <MapKit/MapKit.h>@interface ViewController ()<MKMapViewDelegate,CLLocationManagerDelegate>{    MKMapView *_mapView;    CLLocationManager *_manager;    UIImageView* _imageView;}@end@implementati