#import "ViewController.h"
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
#import "JRAnnotation.h"
@interface ViewController ()<MKMapViewDelegate>
@property(nonatomic,strong) CLGeocoder * coder;
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@property(nonatomic,strong) MKMapItem * fromItem;
@property(nonatomic,strong) MKMapItem * toItem;
@end
@implementation ViewController
-(CLGeocoder *)coder{
if (_coder==nil) {
_coder=[[CLGeocoder alloc] init];
}
return _coder;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.mapView.delegate=self;
}
//要求 为两地设置标注(大头针)
#warning 每次地理编码的时候只能同时进行一个
- (IBAction)addAnotation {
//设置起始位置
NSString *from=@"烟台";
NSString *to=@"新疆";
//设置开始大头针
[self.coder geocodeAddressString:from completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark * fromMark=[placemarks firstObject];
//如果没定位到当前的位置就不添加大头针
if (placemarks.count>0) {
//自定义大头针模型
JRAnnotation * fromLocation=[[JRAnnotation alloc]init];
//设置开始的位置
fromLocation.coordinate=fromMark.location.coordinate;
//设置标题
fromLocation.title=fromMark.name;
fromLocation.subtitle=fromMark.locality;
//添加大头针
[self.mapView addAnnotation:fromLocation];
}
//设置结束大头针
[self.coder geocodeAddressString:to completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark * toMark=[placemarks firstObject];
//如果没定位到当前的位置就不添加大头针
if (placemarks.count>0) {
//自定义大头针模型
JRAnnotation * toLocation=[[JRAnnotation alloc]init];
//设置开始的位置
toLocation.coordinate=toMark.location.coordinate;
//设置标题
toLocation.title=toMark.name;
toLocation.subtitle=toMark.locality;
//添加大头针
[self.mapView addAnnotation:toLocation];
}
//开始划线
[self addLineFrom:fromMark andEnd:toMark];
}];
}];
}
- (void) addLineFrom:(CLPlacemark *) fromCLMark andEnd:(CLPlacemark *) toCLMark{
//1 定义一个方向请求
MKDirectionsRequest * request=[[MKDirectionsRequest alloc] init];
//1>设置请求的起始坐标
MKPlacemark * fromMark=[[MKPlacemark alloc] initWithPlacemark:fromCLMark];
MKMapItem * fromItem=[[MKMapItem alloc] initWithPlacemark:fromMark];
request.source=fromItem;
self.fromItem=fromItem;
//2>设置请求的起始坐标
MKPlacemark * toMark=[[MKPlacemark alloc] initWithPlacemark:toCLMark];
MKMapItem * toItem=[[MKMapItem alloc] initWithPlacemark:toMark];
request.destination=toItem;
self.toItem=toItem;
//2 根据请求获取方向
MKDirections * direct=[[MKDirections alloc] initWithRequest:request];
[direct calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
//遍历所有的路线并在地图的对应路线上面添加遮盖
for (MKRoute * rote in response.routes) {
[self.mapView addOverlay:rote.polyline];
}
}];
}
#pragma mark - mapView
#pragma mark 返回大头针渲染视图
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
static NSString * identy=@"jranno";
MKPinAnnotationView * mk=(MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identy];
if (mk==nil) {
mk=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identy];
//重写代理方法必须调用该方法才显示文本
mk.canShowCallout=YES;
}
mk.pinColor=MKPinAnnotationColorGreen;
mk.animatesDrop=YES;
// mk.image=[UIImage imageNamed:@"annotationImage.png"];
// UIView *view=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
// view.backgroundColor=[UIColor greenColor];
// mk.leftCalloutAccessoryView=view;
// mk.rightCalloutAccessoryView=view;
return mk;
}
#pragma mark - 设置划线属性
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay {
MKPolylineRenderer * render=[[MKPolylineRenderer alloc] initWithOverlay:overlay];
render.lineWidth=5;
render.strokeColor=[UIColor blueColor];
return render;
}
//开始导航
- (IBAction)guidAction {
//设置开始和结束的导航位置
NSArray * itemArray=@[self.fromItem,self.toItem];
//设置步行还是开车以及是否显示交通信息
NSDictionary *dic=@{MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving,MKLaunchOptionsShowsTrafficKey:@(YES)};
[MKMapItem openMapsWithItems:itemArray launchOptions:dic];
}
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
#import "JRAnnotation.h"
@interface ViewController ()<MKMapViewDelegate>
@property(nonatomic,strong) CLGeocoder * coder;
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@property(nonatomic,strong) MKMapItem * fromItem;
@property(nonatomic,strong) MKMapItem * toItem;
@end
@implementation ViewController
-(CLGeocoder *)coder{
if (_coder==nil) {
_coder=[[CLGeocoder alloc] init];
}
return _coder;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.mapView.delegate=self;
}
//要求 为两地设置标注(大头针)
#warning 每次地理编码的时候只能同时进行一个
- (IBAction)addAnotation {
//设置起始位置
NSString *from=@"烟台";
NSString *to=@"新疆";
//设置开始大头针
[self.coder geocodeAddressString:from completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark * fromMark=[placemarks firstObject];
//如果没定位到当前的位置就不添加大头针
if (placemarks.count>0) {
//自定义大头针模型
JRAnnotation * fromLocation=[[JRAnnotation alloc]init];
//设置开始的位置
fromLocation.coordinate=fromMark.location.coordinate;
//设置标题
fromLocation.title=fromMark.name;
fromLocation.subtitle=fromMark.locality;
//添加大头针
[self.mapView addAnnotation:fromLocation];
}
//设置结束大头针
[self.coder geocodeAddressString:to completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark * toMark=[placemarks firstObject];
//如果没定位到当前的位置就不添加大头针
if (placemarks.count>0) {
//自定义大头针模型
JRAnnotation * toLocation=[[JRAnnotation alloc]init];
//设置开始的位置
toLocation.coordinate=toMark.location.coordinate;
//设置标题
toLocation.title=toMark.name;
toLocation.subtitle=toMark.locality;
//添加大头针
[self.mapView addAnnotation:toLocation];
}
//开始划线
[self addLineFrom:fromMark andEnd:toMark];
}];
}];
}
- (void) addLineFrom:(CLPlacemark *) fromCLMark andEnd:(CLPlacemark *) toCLMark{
//1 定义一个方向请求
MKDirectionsRequest * request=[[MKDirectionsRequest alloc] init];
//1>设置请求的起始坐标
MKPlacemark * fromMark=[[MKPlacemark alloc] initWithPlacemark:fromCLMark];
MKMapItem * fromItem=[[MKMapItem alloc] initWithPlacemark:fromMark];
request.source=fromItem;
self.fromItem=fromItem;
//2>设置请求的起始坐标
MKPlacemark * toMark=[[MKPlacemark alloc] initWithPlacemark:toCLMark];
MKMapItem * toItem=[[MKMapItem alloc] initWithPlacemark:toMark];
request.destination=toItem;
self.toItem=toItem;
//2 根据请求获取方向
MKDirections * direct=[[MKDirections alloc] initWithRequest:request];
[direct calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
//遍历所有的路线并在地图的对应路线上面添加遮盖
for (MKRoute * rote in response.routes) {
[self.mapView addOverlay:rote.polyline];
}
}];
}
#pragma mark - mapView
#pragma mark 返回大头针渲染视图
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
static NSString * identy=@"jranno";
MKPinAnnotationView * mk=(MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identy];
if (mk==nil) {
mk=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identy];
//重写代理方法必须调用该方法才显示文本
mk.canShowCallout=YES;
}
mk.pinColor=MKPinAnnotationColorGreen;
mk.animatesDrop=YES;
// mk.image=[UIImage imageNamed:@"annotationImage.png"];
// UIView *view=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
// view.backgroundColor=[UIColor greenColor];
// mk.leftCalloutAccessoryView=view;
// mk.rightCalloutAccessoryView=view;
return mk;
}
#pragma mark - 设置划线属性
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay {
MKPolylineRenderer * render=[[MKPolylineRenderer alloc] initWithOverlay:overlay];
render.lineWidth=5;
render.strokeColor=[UIColor blueColor];
return render;
}
//开始导航
- (IBAction)guidAction {
//设置开始和结束的导航位置
NSArray * itemArray=@[self.fromItem,self.toItem];
//设置步行还是开车以及是否显示交通信息
NSDictionary *dic=@{MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving,MKLaunchOptionsShowsTrafficKey:@(YES)};
[MKMapItem openMapsWithItems:itemArray launchOptions:dic];
}