标签:
—在地图的定位中遇到 的问题(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中加入两个缺省没有的字段
这两个字段没什么特别的意思,就是自定义提示用户授权使用地理定位功能时的提示语。
手动请求:
_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:大头针
*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 = @"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对象数组。注意,这个数组只有一个对象除非我们设置setrequestsAlternateRoutes为YES。
MKRoute 对象,如它的名字,代表用户选择的两点之间的路线。它包含一些关于路线信息的属性:
1、 name:从服务器找到路线时自动生成的。它是基于路线的重要特征。
2、 advisoryNoties:字符串数组,包含一些适合生成路线的警告等诸如此类的详情。
3、 distance:是沿着路线的距离,不是位移。单位是米。
4、 expectedTravelTime:NSTimeInterval,单位秒。
5、 transportType:
6、 polyline:MKPolyline代表地图上路径。可以画在MKMapView上,下一节将会看到。
7、 steps:MKRouteStep 对象的数组,制作路线的。
*
*/
//方向指南响应
-(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];
}
标签:
原文地址:http://www.cnblogs.com/meixian/p/5370941.html