【问题标题】:iPhone: How to draw line between two points on MapKit?iPhone:如何在 MapKit 上的两点之间画线?
【发布时间】:2012-05-22 19:44:10
【问题描述】:

我有两个点的纬度和经度,并且想在 MapKit 上使用 Pin 在这两个点之间画线。

我已经用谷歌搜索了,但找不到合适的解决方案,因为我发现的解决方案是用数据点数组绘制叠加层,但我在这两个点之间没有任何点数组。

只有两点,想在这两点之间画线。

请帮忙。

【问题讨论】:

标签: iphone objective-c ios ipad mapkit


【解决方案1】:

您可以使用 MKPolyline 在地图中绘制线条。

查看此链接

http://spitzkoff.com/craig/?p=136

还有:

https://github.com/kishikawakatsumi/MapKit-Route-Directions

http://cloudmade.com/

这些都是您可以轻松参考的教程和开源库。目前 MapKit支持此功能...

【讨论】:

  • 你能说出任何这样的库/Api吗?
  • 我认为 github 和 cloud made 链接是开源库,但第一个链接是最好的……如果有帮助,请投票并打勾!!!!!!
  • 请不要只链接到页面。您的第一个链接现已失效。
【解决方案2】:

首先让您的视图控制器实现MKMapViewDelegate 协议并声明您需要的属性:

@property (nonatomic, retain) MKMapView *mapView; //this is your map view
@property (nonatomic, retain) MKPolyline *routeLine; //your line
@property (nonatomic, retain) MKPolylineView *routeLineView; //overlay view

然后在viewDidLoad(例如,或者你初始化的任何地方)

//initialize your map view and add it to your view hierarchy - **set its delegate to self***
CLLocationCoordinate2D coordinateArray[2];
coordinateArray[0] = CLLocationCoordinate2DMake(lat1, lon1); 
coordinateArray[1] = CLLocationCoordinate2DMake(lat2, lon2);


self.routeLine = [MKPolyline polylineWithCoordinates:coordinateArray count:2];
[self.mapView setVisibleMapRect:[self.routeLine boundingMapRect]]; //If you want the route to be visible

[self.mapView addOverlay:self.routeLine];

然后实现MKMapViewDelegate的方法-(MKOverlayView *)mapView:viewForOverlay:

-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
{
    if(overlay == self.routeLine)
    {
        if(nil == self.routeLineView)
        {
            self.routeLineView = [[[MKPolylineView alloc] initWithPolyline:self.routeLine] autorelease];
            self.routeLineView.fillColor = [UIColor redColor];
            self.routeLineView.strokeColor = [UIColor redColor];
            self.routeLineView.lineWidth = 5;

        }

        return self.routeLineView;
    }

    return nil;
}

您可以调整代码以满足您的需要,但对于 2 点或更多点来说,这非常简单。

【讨论】:

  • 在哪个文件中实现-(MKOverlayView *)mapView:viewForOverlay:
  • @SaadMasood,在您添加 MKMapViewDelegate 协议的同一个文件中。大多数情况下,这是持有 MapKit 视图的控制器。
  • 我喜欢这个概念 - 但遗憾的是这对我不起作用:我得到的只是我的地图视图跳转到东京和洛杉矶之间的某个地方,无论我实际指定哪个坐标。我从来没有看到折线。
  • 使用 MKPolylineView 显示折线叠加层在 iOS 7 中已弃用。从 Apple Docs 开始:在 iOS 7 及更高版本中,使用 MKPolyline​Renderer 类来显示折线叠加层 i> [MKPolylineView]。
【解决方案3】:

这里你必须计算出路线的经纬度,然后在 MapView 上绘制折线...... 我在我的应用程序中执行此操作....我在地图视图上使用所有信息绘制路线....

如果您使用 MapKit 并且还使用 RagexKitLite,那么它对您来说太简单了,只需获取 RagexKitLite 的演示......

【讨论】:

    【解决方案4】:

    请参阅本教程在 mkmapview 中绘制折线或路线

    1>Draw route using mapkit

    2>从ios4.0以上版本可以使用MKOverlayPathView See Apple Docs

    示例代码:-

    创建折线:-

        -(void) loadRoute
        {
        NSString* filePath = [[NSBundle mainBundle] pathForResource:@”route” ofType:@”csv”];
        NSString* fileContents = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
        NSArray* pointStrings = [fileContents componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    
        MKMapPoint northEastPoint;
        MKMapPoint southWestPoint; 
    
       MKMapPoint* pointArr = malloc(sizeof(CLLocationCoordinate2D) * pointStrings.count);
    
        for(int idx = 0; idx < pointStrings.count; idx++)
        {
        NSString* currentPointString = [pointStrings objectAtIndex:idx];
        NSArray* latLonArr = [currentPointString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]];
    
        CLLocationDegrees latitude = [[latLonArr objectAtIndex:0] doubleValue];
        CLLocationDegrees longitude = [[latLonArr objectAtIndex:1] doubleValue];
    
        CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);
    
        MKMapPoint point = MKMapPointForCoordinate(coordinate);
    
            if (idx == 0) {
        northEastPoint = point;
        southWestPoint = point;
        }
        else
        {
        if (point.x > northEastPoint.x)
        northEastPoint.x = point.x;
        if(point.y > northEastPoint.y)
        northEastPoint.y = point.y;
        if (point.x < southWestPoint.x)
        southWestPoint.x = point.x;
        if (point.y < southWestPoint.y)
        southWestPoint.y = point.y;
        }
    
        pointArr[idx] = point;
    
        }
    
            self.routeLine = [MKPolyline polylineWithPoints:pointArr count:pointStrings.count];
    
        _routeRect = MKMapRectMake(southWestPoint.x, southWestPoint.y, northEastPoint.x - southWestPoint.x, northEastPoint.y - southWestPoint.y);
    
            free(pointArr);
    
        } 
    

    显示PoluLine:-

    [self.mapView addOverlay:self.routeLine]; 
    

    单独添加叠加层不会在地图上呈现任何内容。你的 MKMapViewDelegate 实现必须为你刚刚添加的这条路线返回一个覆盖,因为简单地添加不会有帮助。

    - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id )overlay
    {
    MKOverlayView* overlayView = nil;
    
    if(overlay == self.routeLine)
    {
    //if we have not yet created an overlay view for this overlay, create it now.
    if(nil == self.routeLineView)
    {
    self.routeLineView = [[[MKPolylineView alloc] initWithPolyline:self.routeLine] autorelease];
    self.routeLineView.fillColor = [UIColor redColor];
    self.routeLineView.strokeColor = [UIColor redColor];
    self.routeLineView.lineWidth = 3;
    }
    
    overlayView = self.routeLineView;
    
    }
    
    return overlayView;
    
    } 
    

    【讨论】:

      【解决方案5】:

      传递您的地址标识

      -(NSArray*) calculateRoutesFrom:(CLLocationCoordinate2D) f to: (CLLocationCoordinate2D) t {
          NSString* saddr = [NSString stringWithFormat:@"%f,%f", f.latitude, f.longitude];
          NSString* daddr = [NSString stringWithFormat:@"%f,%f", t.latitude, t.longitude];
      
      NSString* apiUrlStr = [NSString stringWithFormat:@"http://maps.google.com/maps?             output=dragdir&saddr=%@&daddr=%@", saddr, daddr];
      //    NSString* apiUrlStr = @"http://maps.google.com/maps?output=dragdir&saddr=40.769264,-73.958995&daddr=47.286522,-122.312932";
      NSURL* apiUrl = [NSURL URLWithString:apiUrlStr];
      NSLog(@"api url: %@", apiUrl);
      NSString *apiResponse = [NSString stringWithContentsOfURL:apiUrl encoding:NSUTF8StringEncoding error:nil];
      NSString* encodedPoints = [apiResponse stringByMatching:@"points:\\\"([^\\\"]*)\\\"" capture:1L];
      return [self decodePolyLine:[encodedPoints mutableCopy]];
      }
      
      
      -(NSMutableArray *)decodePolyLine: (NSMutableString *)encoded {
          [encoded replaceOccurrencesOfString:@"\\\\" withString:@"\\"
                                      options:NSLiteralSearch
                                        range:NSMakeRange(0, [encoded length])];
          NSInteger len = [encoded length];
          NSInteger index = 0;
          NSMutableArray *array = [[NSMutableArray alloc] init];
          NSInteger lat=0;
          NSInteger lng=0;
          while (index < len) {
              NSInteger b;
              NSInteger shift = 0;
              NSInteger result = 0;
              do {
                  b = [encoded characterAtIndex:index++] - 63;
                  result |= (b & 0x1f) << shift;
                  shift += 5;
              } while (b >= 0x20);
              NSInteger dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
              lat += dlat;
              shift = 0;
              result = 0;
              do {
                  b = [encoded characterAtIndex:index++] - 63;
                  result |= (b & 0x1f) << shift;
                  shift += 5;
              } while (b >= 0x20);
              NSInteger dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
              lng += dlng;
              NSNumber *latitude = [[NSNumber alloc] initWithFloat:lat * 1e-5];
              NSNumber *longitude = [[NSNumber alloc] initWithFloat:lng * 1e-5];
              printf("[%f,", [latitude doubleValue]);
              printf("%f]", [longitude doubleValue]);
              CLLocation *loc = [[CLLocation alloc] initWithLatitude:[latitude floatValue] longitude:[longitude floatValue]];
              [array addObject:loc];
          }
      
          return array;
      }
      
      -(void) updateRouteView:(UIColor *)clr {
          CGContextRef context =CGBitmapContextCreate(nil,routeView.frame.size.width,routeView.frame.size.height,8,4 * routeView.frame.size.width,CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast);
      
          CGContextSetStrokeColorWithColor(context, clr.CGColor);
          CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1.0);
          CGContextSetLineWidth(context, 3.0);
      
          for(int i = 0; i < routes.count; i++) {
              CLLocation* location = [routes objectAtIndex:i];
              CGPoint point = [mapView convertCoordinate:location.coordinate toPointToView:routeView];
      
              if(i == 0) {
                  CGContextMoveToPoint(context, point.x, routeView.frame.size.height - point.y);
              } else {
                  CGContextAddLineToPoint(context, point.x, routeView.frame.size.height - point.y);
      
              }
          }
      
          CGContextStrokePath(context);
      
          CGImageRef image = CGBitmapContextCreateImage(context);
          UIImage* img = [UIImage imageWithCGImage:image];
      
          routeView.image = img;
          CGContextRelease(context);
      
      }
      

      【讨论】:

        【解决方案6】:

        #import <MapKit/MapKit.h>   
        
        - (void)viewDidLoad
        {
                [mapview setDelegate:self];
                mapview.showsUserLocation = YES; 
        }
        
        - (CLLocationCoordinate2D)coordinateWithLocation:(NSDictionary*)location
        {
            double latitude = [[location objectForKey:@"lat"] doubleValue];
            double longitude = [[location objectForKey:@"lng"] doubleValue];
        
            return CLLocationCoordinate2DMake(latitude, longitude);
        }
        
        - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation   *)userLocation
        {
        
            MKCoordinateSpan span = MKCoordinateSpanMake(0.005, 0.005);
            MKCoordinateRegion region = MKCoordinateRegionMake(userLocation.location.coordinate, span);
        
            [mapview setRegion:region];
        
            [mapview setCenterCoordinate:userLocation.coordinate animated:YES];
            NSString *baseUrl = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/directions/json?origin=%f,%f&destination=%@&sensor=true", mapview.userLocation.location.coordinate.latitude,  mapview.userLocation.location.coordinate.longitude, @"24.1620661,72.394131"];
        
        
            //http://maps.googleapis.com/maps/api/directions/json?origin=23.030000,72.580000&destination=23.400000,72.750000&sensor=true
        
            NSURL *url = [NSURL URLWithString:[baseUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
        
            NSLog(@"%@",url);
            NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
            [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        
            NSError *error = nil;
            NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
        
            NSArray *routes = [result objectForKey:@"routes"];
                NSLog(@"%@",routes);
        
            NSDictionary *firstRoute = [routes objectAtIndex:0];
        
            NSDictionary *leg =  [[firstRoute objectForKey:@"legs"] objectAtIndex:0];
        
            NSDictionary *end_location = [leg objectForKey:@"end_location"];
        
               NSLog(@"dDDDDDD>>>>>>%@",leg);
            double latitude = [[end_location objectForKey:@"lat"] doubleValue];
            double longitude = [[end_location objectForKey:@"lng"] doubleValue];
        
            CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);
        
            MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
            point.coordinate = coordinate;
            point.title =  [leg objectForKey:@"end_address"];
            point.subtitle = @"I'm here!!!";
        
            [self.mapview addAnnotation:point];
        
            NSArray *steps = [leg objectForKey:@"steps"];
        
            int stepIndex = 0;
        
            CLLocationCoordinate2D stepCoordinates[1  + [steps count] + 1];
        
            stepCoordinates[stepIndex] = userLocation.coordinate;
        
            for (NSDictionary *step in steps) {
        
                NSDictionary *start_location = [step objectForKey:@"start_location"];
                stepCoordinates[++stepIndex] = [self coordinateWithLocation:start_location];
        
                if ([steps count] == stepIndex){
                    NSDictionary *end_location = [step objectForKey:@"end_location"];
                    stepCoordinates[++stepIndex] = [self coordinateWithLocation:end_location];
                }
            }
        
            MKPolyline *polyLine = [MKPolyline polylineWithCoordinates:stepCoordinates count:1 + stepIndex];
            [mapview addOverlay:polyLine];
        
            CLLocationCoordinate2D centerCoordinate = CLLocationCoordinate2DMake((userLocation.location.coordinate.latitude + coordinate.latitude)/2, (userLocation.location.coordinate.longitude + coordinate.longitude)/2);
        
        }];
        }
        

        然后实现MKMapViewDelegate的方法-(MKOverlayView *)mapView:viewForOverlay:

        - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
        {
            MKPolylineView *polylineView = [[MKPolylineView alloc] initWithPolyline:overlay];
            polylineView.strokeColor = [UIColor colorWithRed:204/255. green:45/255. blue:70/255. alpha:1.0];
            polylineView.lineWidth = 1;
        
            return polylineView;
        }
        
        
        - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
        {
            static NSString *annotaionIdentifier=@"annotationIdentifier";
            MKPinAnnotationView *aView=(MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:annotaionIdentifier ];
            if (aView==nil) {
        
                aView=[[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:annotaionIdentifier];
                aView.pinColor = MKPinAnnotationColorRed;
                aView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
                //        aView.image=[UIImage imageNamed:@"arrow"];
                aView.animatesDrop=TRUE;
                aView.canShowCallout = YES;
                aView.calloutOffset = CGPointMake(-5, 5);
            }
        
            return aView;
        }
        

        【讨论】:

        • 我正在使用 xcode 6 并使用您的代码,但我得到了错误 coordinateWithLocation 没有可见界面
        • 我也面临同样的“coordinateWithLocation”缺失
        • 嗨,它对我来说工作正常,但我想删除直线...对我来说,直线也显示..
        【解决方案7】:

        First of all Add frame work
            1 Foundation.framework
            2 CoreGraphics.framework
            3 CoreLocation.framework
            4 MapKit.framework
        

        然后创建 nsobject 文件 Like see.... TrailsMap.h 文件

        #import <Foundation/Foundation.h>
        #import <MapKit/MapKit.h>
        @interface TrailsMap : NSObject<MKAnnotation>
        {
            CLLocationCoordinate2D coordinate;
        
            NSString *title;
            NSString *image;
            NSString *subtitle;
        }
        
        @property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
        @property (nonatomic,copy) NSString *title;
        @property (nonatomic,copy) NSString *image;
        @property (nonatomic,copy) NSString *subtitle;
        
        - (id)initWithLocation:(CLLocationCoordinate2D)coord;
        

        TrailsMap.m

        #import "TrailsMap.h"
        
        @implementation TrailsMap
        @synthesize coordinate,title,image,subtitle;
        
        - (id)initWithLocation:(CLLocationCoordinate2D)coord{
        
            self = [super init];
            if (self) {
                coordinate = coord;
        
            }
            return self;
        }
        

        现在在主视图中创建编码请参阅..

        ViewController.h

        #import <UIKit/UIKit.h>
        #import <MapKit/MapKit.h>
        
        
        @interface ViewController : UIViewController<MKMapViewDelegate>
        
        @property (strong, nonatomic) IBOutlet MKMapView *MapView;
        @property (nonatomic, retain) MKPolyline *routeLine;
        @property (nonatomic, retain) MKPolylineView *routeLineView;
        
        -(void)LoadMapRoute;
        @end
        

        最后在 mainview.m 文件中创建编码

        ViewController.m

        #import "ViewController.h"
        #import "TrailsMap.h"
        
        @interface ViewController ()
        {
            NSData *alldata;
            NSMutableDictionary *data1;
        
           NSMutableArray *RouteLocation;
           NSMutableArray *RouteName;
        }
        @end
        
        @implementation ViewController
        @synthesize MapView,routeLine,routeLineView;
        
        
        - (void)viewDidLoad
        {
           [super viewDidLoad];
        
           RouteName = [[NSMutableArray alloc] initWithObjects:@"Ahmedabad",@"Rajkot", nil];
           RouteLocation = [[NSMutableArray alloc] initWithObjects:@"23.0300,72.5800",@"22.3000,70.7833", nil];
           [self LoadMapRoute];
        }
        
        - (void)didReceiveMemoryWarning
        {
            [super didReceiveMemoryWarning];
        }
        
        
        //-------------------------------------
        // ************* Map ******************
        //-------------------------------------
        
        -(void)LoadMapRoute
        {
            MKCoordinateSpan span = MKCoordinateSpanMake(0.8, 0.8);
            MKCoordinateRegion region;
            region.span = span;
            region.center= CLLocationCoordinate2DMake(23.0300,72.5800);
        
        
            // Distance between two address
           NSArray *coor1=[[RouteLocation objectAtIndex:0] componentsSeparatedByString:@","];
           CLLocation *locA = [[CLLocation alloc] initWithLatitude:[[coor1 objectAtIndex:0] doubleValue] longitude:[[coor1 objectAtIndex:1] doubleValue]];
        
           NSArray *coor2=[[RouteLocation objectAtIndex:1] componentsSeparatedByString:@","];
           CLLocation *locB = [[CLLocation alloc] initWithLatitude:[[coor2 objectAtIndex:0] doubleValue] longitude:[[coor2 objectAtIndex:1] doubleValue]];
            CLLocationDistance distance = [locA distanceFromLocation:locB];
            NSLog(@"Distance :%.0f Meters",distance);
        
        
           NSString *baseUrl = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/directions/json?origin=%@&destination=%@&sensor=true", [RouteLocation objectAtIndex:0],[RouteLocation objectAtIndex:1] ];
        
           NSURL *url = [NSURL URLWithString:[baseUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
           alldata = [[NSData alloc] initWithContentsOfURL:url];
        
            NSError *err;
            data1 =[NSJSONSerialization JSONObjectWithData:alldata options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&err];
        
            if (err)
            {
                NSLog(@" %@",[err localizedDescription]);
            }
        
            NSArray *routes = [data1 objectForKey:@"routes"];
            NSDictionary *firstRoute = [routes objectAtIndex:0];
            NSDictionary *leg =  [[firstRoute objectForKey:@"legs"] objectAtIndex:0];
            NSArray *steps = [leg objectForKey:@"steps"];
        
            int stepIndex = 0;
            CLLocationCoordinate2D stepCoordinates[[steps count]+1 ];
        
            for (NSDictionary *step in steps)
            {
        
                NSDictionary *start_location = [step objectForKey:@"start_location"];
                double latitude = [[start_location objectForKey:@"lat"] doubleValue];
                double longitude = [[start_location objectForKey:@"lng"] doubleValue];
                stepCoordinates[stepIndex] = CLLocationCoordinate2DMake(latitude, longitude);
        
                if (stepIndex==0)
                {
                    TrailsMap *point=[[TrailsMap alloc] initWithLocation:stepCoordinates[stepIndex]];
                    point.title =[RouteName objectAtIndex:0];
                    point.subtitle=[NSString stringWithFormat:@"Distance :%.0f Meters",distance];
                    [self.MapView addAnnotation:point];
                }
                if (stepIndex==[steps count]-1)
                {
                    stepIndex++;
                    NSDictionary *end_location = [step objectForKey:@"end_location"];
                    double latitude = [[end_location objectForKey:@"lat"] doubleValue];
                    double longitude = [[end_location objectForKey:@"lng"] doubleValue];
                    stepCoordinates[stepIndex] = CLLocationCoordinate2DMake(latitude, longitude);
        
                    TrailsMap *point=[[TrailsMap alloc] initWithLocation:stepCoordinates[stepIndex]];
                    point.title = [RouteName objectAtIndex:1];
                    point.subtitle=[NSString stringWithFormat:@"Distance :%.0f Meters",distance];
        
                    [self.MapView addAnnotation:point];
                }
                stepIndex++;
            }
        
            MKPolyline *polyLine = [MKPolyline polylineWithCoordinates:stepCoordinates count: stepIndex];
            [MapView addOverlay:polyLine];
            [MapView setRegion:region animated:YES];
        }
        
        - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
        {
            MKPolylineView *polylineView = [[MKPolylineView alloc] initWithPolyline:overlay];
            polylineView.strokeColor = [UIColor colorWithRed:204/255. green:45/255. blue:70/255. alpha:1.0];
            polylineView.lineWidth = 5;
        
            return polylineView;
        }
        

        如果您想在地图中设置多个引脚,只需添加此代码。 Annotaion 是 Objectfile。

        -(void)LoadMultiplePin
        {
            RouteName = [[NSMutableArray alloc] initWithObjects:@"Ahmedabad",@"Rajkot",@"Limdi", nil];
            RouteLocation = [[NSMutableArray alloc] initWithObjects:@"23.0300,72.5800",@"22.3000,70.7833",@"22.5728,71.8114", nil];
        
            MKCoordinateSpan span = MKCoordinateSpanMake(2.9, 2.9);
            MKCoordinateRegion region;
        
            region.span = span;
            region.center= CLLocationCoordinate2DMake(22.5728,71.8114);
        
            int cnt=RouteLocation.count;
        
            for (int p=0 ; p<cnt ; p++ )
            {
                NSArray *coor=[[RouteLocation objectAtIndex:p] componentsSeparatedByString:@","];
        
                CLLocationCoordinate2D location=CLLocationCoordinate2DMake([[coor objectAtIndex:0] doubleValue],[[coor objectAtIndex:1] doubleValue]);
        
                Annotaion *point=[[Annotaion alloc] initWithLocation:location];
                point.title =[RouteName objectAtIndex:p];
                [Map addAnnotation:point];
            }
            [Map setRegion:region animated:YES];
        
        }
        

        通过使用此代码,您可以轻松放置两个引脚并在这两个引脚之间画线 享受快乐编码...:)

        【讨论】:

        • APP崩溃哥们
        • 您能解释一下您发现的错误或崩溃的原因吗?所以我可以帮忙
        【解决方案8】:

        我从@graver 那里得到了很好的答案,并为 Swift 3 做了这个:

        // Called from viewDidLoad
        func setupMap() {
            mapView.delegate = self
            // BusStop implements the MKAnnotation protocol, I have an array of them
            let routeCoordinates = busStops.map({ $0.coordinate })
            let routeLine = MKPolyline(coordinates: routeCoordinates, count: routeCoordinates.count)
            mapView.setVisibleMapRect(routeLine.boundingMapRect, animated: false)
            mapView.add(routeLine)
        }
        
        // MARK: MKMapViewDelegate
        
        func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
            if let polyline = overlay as? MKPolyline {
                let polylineRenderer = MKPolylineRenderer(overlay: polyline)
                polylineRenderer.strokeColor = .blue
                polylineRenderer.lineWidth = 3
                return polylineRenderer
            }
            return MKOverlayRenderer(overlay: overlay)
        }
        

        【讨论】:

          【解决方案9】:

          获取完整代码:https://github.com/javedmultani16/MapKitWithPolyLine

          像这样画线:

             directionsRequest.transportType = MKDirectionsTransportType.automobile
          
                  //Draw polyline by using MKRoute so it follows the street roads...
                  for (k, item) in arrayarrayPlacemarks.enumerated() {
                      if k < (arrayarrayPlacemarks.count - 1) {
                          directionsRequest.source = item
                          directionsRequest.destination = arrayarrayPlacemarks[k+1]
          
                          let directions = MKDirections(request: directionsRequest)
                    directions.calculate { (response:MKDirections.Response!, error: Error!) -> Void in
                              if error == nil {
                                  self.locRoute = response.routes[0] as? MKRoute
                                  let geodesic:MKPolyline = self.locRoute!.polyline
                                  self.mapView.addOverlay(geodesic)
                              }
                          }
                      }
                  }
          

          委托方法:

            func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
                  if overlay.isKind(of: MKPolyline.self){
                          var polylineRenderer = MKPolylineRenderer(overlay: overlay)
                          polylineRenderer.fillColor = UIColor.blue
                          polylineRenderer.strokeColor = UIColor.blue
                          polylineRenderer.lineWidth = 2
          
                      return polylineRenderer
               }
                  return MKOverlayRenderer(overlay: overlay)
              }
          

          【讨论】:

            【解决方案10】:

            我在 swift 中创建了演示,并使用折线继续更新地图上的位置。

            请按以下步骤操作:

            1) 创建新项目并设置所需的东西。 2)转到项目目标->构建阶段->将二进制文件与库链接并添加 MapKit.frameworkCoreLocation.framework。 3)转到sotryboard并使用您的viewcontroller添加mapview和linkup。 4) 添加我在下面提供代码的属性和委托。

            ViewController.Swift

            导入 UIKit

            导入 MapKit

            导入核心位置

            ViewController 类:UIViewController、CLLocationManagerDelegate、MKMapViewDelegate{

            @IBOutlet weak var mapView:MKMapView!
            var locationManager: CLLocationManager!
            var routeArr:[CLLocationCoordinate2D] = []
            var isStarted:Bool = false
            
            // MARK:- Life cycle
            override func viewDidLoad() {
                super.viewDidLoad()
            
                locationManager = CLLocationManager()
                locationManager.desiredAccuracy = kCLLocationAccuracyBest;
                locationManager.delegate = self;
                locationManager.startMonitoringSignificantLocationChanges()
                locationManager.allowsBackgroundLocationUpdates = true
                locationManager.pausesLocationUpdatesAutomatically = false
            
                // user activated automatic authorization info mode
                let status = CLLocationManager.authorizationStatus()
                if status == .notDetermined || status == .denied || status == .authorizedWhenInUse {
                       // present an alert indicating location authorization required
                       // and offer to take the user to Settings for the app via
                       // UIApplication -openUrl: and UIApplicationOpenSettingsURLString
                       locationManager.requestAlwaysAuthorization()
                       locationManager.requestWhenInUseAuthorization()
                   }
            
                locationManager.startUpdatingLocation()
                locationManager.startUpdatingHeading()
            
                mapView.delegate = self
                mapView.showsUserLocation = true
                mapView.mapType = MKMapType(rawValue: 0)!
                mapView.userTrackingMode = MKUserTrackingMode(rawValue: 2)!
            }
            
            // MARK:- Button Actions
            
            @IBAction func startBtnClick(_ sender: Any) {
                isStarted = true
            }
            
            @IBAction func endBtnClick(_ sender: Any) {
                isStarted = false
                routeArr.removeAll()
            }
            
            // MARK:- LocationManager Delegate
            
            func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
                let location = locations.last
            
                if isStarted == true {
                    if locations.count > 0 {
                        let newLocation:CLLocationCoordinate2D = (location?.coordinate ?? nil)!
                        routeArr.append(newLocation)
                        DispatchQueue.main.async {
                            if self.routeArr.count > 2 {
                                let route:[CLLocationCoordinate2D] = [self.routeArr[self.routeArr.count - 2] ,self.routeArr.last!]
                                print(route)
                                let polyline = MKPolyline(coordinates: route, count: route.count)
                                self.mapView.addOverlay(polyline)
                            }
                        }
                    }
                }
            }
            
            func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
                if (overlay is MKPolyline) {
                    let pr = MKPolylineRenderer(overlay: overlay)
                    pr.strokeColor = UIColor.red
                    pr.fillColor = .green
                    pr.lineWidth = 5
                    return pr
                }else {
                  return MKOverlayRenderer()
                }
            }
            

            }

            运行您的项目并单击开始按钮进行跟踪,您可以在地图上看到折线。如果您单击停止按钮,它将停止绘制折线。

            谢谢

            【讨论】: