Ios 如何绘制从当前位置到在mapView中设置的注释接点的路径?
我已经创建了一个mapView(对不起,我将我的插座命名为mapKit而不是mapView)。我获取了我的当前位置,并手动将注释pin设置为某个位置。现在我需要的是,只要我点击注释引脚(请准确点击注释引脚,而不是calloutAccessoryButton),我就需要找到一条路径,可能使用polyPath从我的当前位置到注释引脚。不完全像一个方向,只是一个路径,多边形叠加。请查看我的代码并帮助我Ios 如何绘制从当前位置到在mapView中设置的注释接点的路径?,ios,objective-c,iphone,mkmapview,mkannotation,Ios,Objective C,Iphone,Mkmapview,Mkannotation,我已经创建了一个mapView(对不起,我将我的插座命名为mapKit而不是mapView)。我获取了我的当前位置,并手动将注释pin设置为某个位置。现在我需要的是,只要我点击注释引脚(请准确点击注释引脚,而不是calloutAccessoryButton),我就需要找到一条路径,可能使用polyPath从我的当前位置到注释引脚。不完全像一个方向,只是一个路径,多边形叠加。请查看我的代码并帮助我 - (void)viewDidLoad { [super viewDidLoad];
- (void)viewDidLoad {
[super viewDidLoad];
locationManager = [[CLLocationManager alloc] init];
[locationManager requestWhenInUseAuthorization];
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.delegate = self;
[locationManager startUpdatingLocation];
MKPointAnnotation *myAnnotation = [[MKPointAnnotation alloc]init];
CLLocationCoordinate2D pinCoordinate;
pinCoordinate.latitude = 51.49795;
pinCoordinate.longitude = -0.174056;
myAnnotation.coordinate = pinCoordinate;
myAnnotation.title = @"Matthews Pizza";
myAnnotation.subtitle = @"Best Pizza in Town";
[self.mapKit addAnnotation:myAnnotation];
// myAnnotation.coordinate = CLLocationCoordinate2DMake(51.49795, -0.174056);
// Do any additional setup after loading the view.
}
-(void)checkStatus{
CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
if (status==kCLAuthorizationStatusNotDetermined) {
NSLog(@"Not Determined");
}
if (status==kCLAuthorizationStatusDenied) {
NSLog(@"Denied");
}
if (status==kCLAuthorizationStatusRestricted) {
NSLog(@"Restricted");
}
if (status==kCLAuthorizationStatusAuthorizedAlways) {
NSLog(@"Always Allowed");
}
if (status==kCLAuthorizationStatusAuthorizedWhenInUse) {
NSLog(@"NWhen In Use Allowed");
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)viewWillAppear:(BOOL)animated{
}
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 800, 800);
[self.mapKit setRegion:[self.mapKit regionThatFits:region] animated:YES];
}
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"didFailWithError: %@", error);
UIAlertView *errorAlert = [[UIAlertView alloc]
initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[errorAlert show];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
NSLog(@"didUpdateToLocation: %@", newLocation);
CLLocation *currentLocation = newLocation;
if (currentLocation != nil) {
NSLog(@"%@",[NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude]);
NSLog(@"%@",[NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude]);
}
}
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
// If it's the user location, just return nil.
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
// Handle any custom annotations.
if ([annotation isKindOfClass:[MKPointAnnotation class]])
{
// Try to dequeue an existing pin view first.
MKAnnotationView *pinView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"];
if (!pinView)
{
// If an existing pin view was not available, create one.
pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CustomPinAnnotationView"];
pinView.canShowCallout = YES;
pinView.image = [UIImage imageNamed:@"ic_map"];
pinView.calloutOffset = CGPointMake(0, 32);
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
pinView.rightCalloutAccessoryView = rightButton;
} else {
pinView.annotation = annotation;
}
return pinView;
}
return nil;
}
-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
id <MKAnnotation> annotation = [view annotation];
if ([annotation isKindOfClass:[MKPointAnnotation class]])
{
NSLog(@"Clicked Pizza Shop");
}
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Disclosure Pressed" message:@"Click Cancel to Go Back" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
[alertView show];
}
-(void)viewDidLoad{
[超级视图下载];
locationManager=[[CLLocationManager alloc]init];
[locationManager请求使用授权];
locationManager.desiredAccuracy=KCallocationAccuracyBest;
locationManager.delegate=self;
[locationManager startUpdatingLocation];
MKPointAnnotation*myAnnotation=[[MKPointAnnotation alloc]init];
CLLocationCoordinated2和pinCoordinate;
平坐标纬度=51.49795;
pinCoordinate.经度=-0.174056;
myAnnotation.coordinate=pinCoordinate;
myAnnotation.title=@“马修斯比萨饼”;
myAnnotation.subtitle=@“镇上最好的比萨饼”;
[self.mapKit addAnnotation:myAnnotation];
//myAnnotation.Coordination=CLLocationCoordinate2DMake(51.49795,-0.174056);
//加载视图后执行任何其他设置。
}
-(作废)检查状态{
CLAuthorizationStatus=[CLLocationManager授权状态];
如果(状态==kCLAuthorizationStatusNotDetermined){
NSLog(“未确定”);
}
如果(状态==kCLAuthorizationStatusDenied){
NSLog(@“拒绝”);
}
如果(状态==kCLAuthorizationStatusRestricted){
NSLog(@“受限”);
}
如果(状态==KCLAuthorizationStatusAuthorizationDalways){
NSLog(“始终允许”);
}
如果(状态==kCLAuthorizationStatusAuthorizedWhenInUse){
NSLog(@“允许使用时”);
}
}
-(无效)未收到记忆警告{
[超级记忆警告];
//处置所有可以重新创建的资源。
}
-(无效)视图将显示:(BOOL)动画{
}
-(void)mapView:(MKMapView*)mapView didUpdateUserLocation:(MKUserLocation*)userLocation
{
mkcoordinaereregion=mkcoordinaereregionmakewithdistance(userLocation.coordination,800800);
[self.mapKit setRegion:[self.mapKit regionatfits:region]动画:是];
}
#pragma标记-CLLocationManagerDelegate
-(无效)locationManager:(CLLocationManager*)manager错误:(N错误*)错误
{
NSLog(@“错误:%@”,错误);
UIAlertView*errorAlert=[[UIAlertView alloc]
initWithTitle:@“错误”消息:@“无法获取您的位置”委托:nil cancelButtonTitle:@“确定”其他ButtonTitles:nil];
[错误警报显示];
}
-(void)locationManager:(CLLocationManager*)manager didUpdateToLocation:(CLLocation*)newLocation fromLocation:(CLLocation*)oldLocation
{
NSLog(@“didUpdateLocation:%@”,newLocation);
CLLocation*currentLocation=newLocation;
如果(当前位置!=nil){
NSLog(@“%@,[NSString stringWithFormat:@“%.8f”,currentLocation.coordinate.longitude]);
NSLog(@“%@,[NSString stringWithFormat:@“%.8f”,currentLocation.coordinate.latitude]);
}
}
-(MKAnnotationView*)地图视图:(MKMapView*)地图视图注释:(id)注释
{
//如果是用户位置,只需返回nil。
if([annotation isKindOfClass:[MKUserLocation类]])
返回零;
//处理任何自定义注释。
if([annotation isKindOfClass:[MKPointAnnotation class]])
{
//首先尝试将现有pin视图出列。
MKAnnotationView*pinView=(MKAnnotationView*)[mapView出列可重用AnnotationView,标识符:@“CustomPinAnnotationView”];
如果(!pinView)
{
//如果现有接点视图不可用,请创建一个。
pinView=[[MKAnnotationView alloc]initWithAnnotation:annotation重用标识符:@“CustomPinAnnotationView”];
pinView.canShowCallout=是;
pinView.image=[UIImage ImageName:@“ic_地图”];
pinView.calloutOffset=CGPointMake(0,32);
UIButton*rightButton=[UIButton Button类型:UIButtonTypedTailButton];
pinView.rightCalloutAccessoryView=rightButton;
}否则{
pinView.annotation=注释;
}
返回pinView;
}
返回零;
}
-(无效)地图视图:(MKMapView*)地图视图注释视图:(MKAnnotationView*)视图调用访问控制点击:(UIControl*)控制{
id注释=[视图注释];
if([annotation isKindOfClass:[MKPointAnnotation class]])
{
NSLog(@“点击比萨饼店”);
}
UIAlertView*alertView=[[UIAlertView alloc]initWithTitle:@“已按下披露”消息:@“单击取消返回”委托:自取消按钮:@“取消”其他按钮:@“确定”,无];
[警报视图显示];
}
单击注释时,pin委托方法将调用
-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
NSLog(@"Latitude: %f", view.annotation.coordinate.latitude);
NSLog(@"Longitude: %f", view.annotation.coordinate.longitude);
self.annotationViewCoordinate = view.annotation.coordinate;
[self GetDirections:view.annotation.coordinate];
}
用于绘制路径
- (void)GetDirections:(CLLocationCoordinate2D)locationCoordinate
{
MKPlacemark *aPlcSource = [[MKPlacemark alloc] initWithCoordinate:self.mapView.userLocation.coordinate addressDictionary:[NSDictionary dictionaryWithObjectsAndKeys:@"",@"", nil]];
MKPlacemark *aPlcDest = [[MKPlacemark alloc] initWithCoordinate:locationCoordinate addressDictionary:[NSDictionary dictionaryWithObjectsAndKeys:@"",@"", nil]];
MKMapItem *mpItemSource = [[MKMapItem alloc] initWithPlacemark:aPlcSource];
[mpItemSource setName:@"Source"];
MKMapItem *mpItemDest = [[MKMapItem alloc] initWithPlacemark:aPlcDest];
[mpItemDest setName:@"Dest"];
MKDirectionsRequest *aDirectReq = [[MKDirectionsRequest alloc] init];
[aDirectReq setSource:mpItemSource];
[aDirectReq setDestination:mpItemDest];
[aDirectReq setTransportType:MKDirectionsTransportTypeAutomobile];
MKDirections *aDirections = [[MKDirections alloc] initWithRequest:aDirectReq];
[aDirections calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
if (error) {
NSLog(@"Error :: %@",error);
}
else{
NSArray *aArrRoutes = [response routes];
NSLog(@"Routes :: %@",aArrRoutes);
[self.mapView removeOverlays:self.mapView.overlays];
[aArrRoutes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
MKRoute *aRoute = obj;
[self.mapView addOverlay:aRoute.polyline];
NSLog(@"Route Name : %@",aRoute.name);
NSLog(@"Total Distance (in Meters) :%f",aRoute.distance);
NSArray *aArrSteps = [aRoute steps];
NSLog(@"Total Steps : %lu",(unsigned long)[aArrSteps count]);
[aArrSteps enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"Rout Instruction : %@",[obj instructions]);
NSLog(@"Rout Distance : %f",[obj distance]);
}];
}];
}
}];
}
当用户位置移动时
你可以调用方法
- (void)GetDirections:(CLLocationCoordinate2D)locationCoordinate
从方法
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
[self GetDirections:self.annotationViewCoordinate];
}
试试这个-但问题是它会启动另一个地图,我必须在上面选择目的地来源,然后按“路线”来查找路线。我需要的是,只要我按下我的注释pin,我需要它自动找到路线。我有一个注释点,你可能已经看到了。如何使我在单击注释接点时立即绘制管线。[不使用右侧或左侧详图索引附件按钮]。即。你想在点击注释右键时绘制路径吗?代码更新。检查我有多傻,我从来没有想过注释有一个didSelectAnnotation委托。成功了。非常感谢。欢迎您在当前位置更新时编辑代码