2014-06-24 13 views
5

Ho chiamato il metodo seguente per disegnare le polilinee punteggiate tra i marcatori. Quando si tratta dell'esecuzione, mostra che vengono disegnate solo le linee continue. Vorresti dirmi come disegnare linee tratteggiate su Google Map?ios Google SDK Map non può creare polilinee punteggiate

enter image description here

- (void) createDashedLine:(CLLocationCoordinate2D)thisPoint:(CLLocationCoordinate2D)nextPoint: 
(UIColor *)colour 
{ 
    NSLog(@"next pt latitude %ff" , nextPoint.latitude); 
    NSLog(@"next pt longitude %ff" , nextPoint.longitude); 
    NSLog(@"this pt laatitude %ff" , thisPoint.latitude); 
    NSLog(@"this pt longitude %ff" , thisPoint.longitude); 

    double difLat = nextPoint.latitude - thisPoint.latitude; 
    double difLng = nextPoint.longitude - thisPoint.longitude; 
    double scale = camera.zoom * 2; 
    double divLat = difLat/scale; 
    double divLng = difLng/scale; 
    CLLocationCoordinate2D tmpOrig= thisPoint; 
    GMSMutablePath *singleLinePath = [GMSMutablePath path]; 

    for(int i = 0 ; i < scale ; i ++){ 
     CLLocationCoordinate2D tmpOri = tmpOrig; 
     if(i > 0){ 
      tmpOri = CLLocationCoordinate2DMake(tmpOrig.latitude + (divLat * 0.25f), tmpOrig.longitude + (divLng * 0.25f)); 
     } 
     [singleLinePath addCoordinate:tmpOri]; 
     [singleLinePath addCoordinate: 
     CLLocationCoordinate2DMake(tmpOrig.latitude + (divLat * 1.0f), 
            tmpOrig.longitude + (divLng * 1.0f))]; 
     tmpOri = CLLocationCoordinate2DMake(tmpOrig.latitude + (divLat * 1.0f), tmpOrig.longitude + (divLng * 1.0f)); 
    } 

    GMSPolyline *polyline ; 
    polyline = [GMSPolyline polylineWithPath:singleLinePath]; 
    polyline.geodesic = NO; 
    polyline.strokeWidth = 5.f; 
    polyline.strokeColor = colour; 
    polyline.map = mapView_; 

    //Setup line style and draw 
    _lengths = @[@([singleLinePath lengthOfKind:kGMSLengthGeodesic]/50)]; 
    _polys = @[polyline]; 
    [self setupStyleWithColour:colour]; 
    [self tick]; 
} 

- (void)tick { 
    //Create steps for polyline(dotted polylines) 
    for (GMSPolyline *poly in _polys) { 
     poly.spans = 
     GMSStyleSpans(poly.path, _styles, _lengths, kGMSLengthGeodesic, _pos); 
    } 
    _pos -= _step; 
} 

-(void)setupStyleWithColour:(UIColor *)color{ 

    GMSStrokeStyle *gradColor = [GMSStrokeStyle gradientFromColor:color toColor:color]; 

    _styles = @[gradColor,[GMSStrokeStyle solidColor:[UIColor colorWithWhite:0 alpha:0]],]; 
    _step = 50000; 
} 

- (void)addMarkers 
{ 
    // NSMutableArray *polys = [NSMutableArray array]; 
    if([CarArray count] > 0){ 


     GMSMutablePath *path = [GMSMutablePath path]; 
     GMSMutablePath *currentPath = [GMSMutablePath path]; 
     GMSPolyline *polyline ; 
     GMSPolyline *polylineC ; 
     GMSMarker *marker; 
     for (int i = 0; i < [CarArray count]; i++) { 

      CheckPoints *cp = [CarArray objectAtIndex:i]; 
      CLLocationCoordinate2D position = CLLocationCoordinate2DMake(cp.getLatitude , cp.getLongitude); 

      marker = [GMSMarker markerWithPosition:position]; 
      // GMSMarker *marker = [[GMSMarker alloc] init]; 
      marker.position = position; 
      NSLog(@"%d", cp.getState); 
      NSLog(@"%f", cp.getLatitude); 
      NSLog(@"%f", cp.getLongitude); 
      NSLog(@"%@", cp.getDesp); 
      marker.title = cp.getDesp; 

      marker.zIndex = 1; 
      NSString *tmpLat = [[NSString alloc] initWithFormat:@"%f", position.latitude]; 
      NSString *tmpLong = [[NSString alloc] initWithFormat:@"%f", position.longitude]; 
      marker.snippet = [NSString stringWithFormat:@"%@ %@", tmpLat,tmpLong]; 
      UIColor *color; 
      if (cp.getState ==0) { 
       color = [UIColor greenColor]; 
      } else { 
       color = [UIColor redColor]; 
      } 

      if([CarArray count] > 2){ 
       [path addLatitude:cp.getLatitude longitude:cp.getLongitude]; 
       if(i > [CarArray indexOfObject:CarArray.lastObject] -2){ 
        [currentPath addLatitude:cp.getLatitude longitude:cp.getLongitude]; 
       } 
      }else{ 
       [currentPath addLatitude:cp.getLatitude longitude:cp.getLongitude]; 
      } 
      marker.icon = [GMSMarker markerImageWithColor:color]; 

      marker.map = mapView_; 
      // mapView_.selectedMarker = marker; 
     } 

     if([CarArray count] > 2) { 

      polyline = [GMSPolyline polylineWithPath:currentPath]; 
      polyline.geodesic = YES; 
      polyline.strokeWidth = 5.f; 
      polyline.strokeColor = [UIColor greenColor]; 
      polyline.map = mapView_; 



      _lengths = @[@([currentPath lengthOfKind:kGMSLengthGeodesic]/50)]; 
      _polys = @[polyline]; 

      [self setupStyleWithColour:[UIColor greenColor]]; 
      [self tick]; 


      for(int i = 0 ; i < [currentPath count] -1 ; i++){ 
       CLLocationCoordinate2D thisPoint = [currentPath coordinateAtIndex:i]; 
       CLLocationCoordinate2D nextPoint = [currentPath coordinateAtIndex:i+1]; 


       NSLog(@"next pt s latitude %ff" , nextPoint.latitude); 
       NSLog(@"next pt s longitude %ff" , nextPoint.longitude); 
       NSLog(@"this pt s latitude %ff" , thisPoint.latitude); 
       NSLog(@"this pt s longitude %ff" , thisPoint.longitude); 

       [self drawArrowLines:mapView_ :thisPoint :nextPoint :[UIColor greenColor]:i+1: false]; 
       [self createDashedLine: thisPoint :nextPoint :[UIColor greenColor]]; 
      } 

      GMSMutablePath *path2 = [GMSMutablePath path]; 
      GMSMutablePath *path3 = [GMSMutablePath path]; 
      path2 = path.mutableCopy; 

      [path2 removeLastCoordinate]; 
      path3 = path2; 
      polylineC = [GMSPolyline polylineWithPath:path3]; 
      polylineC.geodesic = YES; 
      polylineC.strokeWidth = 5.f; 
      polylineC.map = mapView_; 



      _lengths = @[@([currentPath lengthOfKind:kGMSLengthGeodesic]/50)]; 
      _polys = @[polylineC]; 

      [self setupStyleWithColour:[UIColor greenColor]]; 
      [self tick]; 


     //  polylineC.strokeColor = [UIColor redColor]; 

      for(int i = 0 ; i < [path count] -1 ; i++){ 
       CLLocationCoordinate2D thisPoint = [path coordinateAtIndex:i]; 
       CLLocationCoordinate2D nextPoint = [path coordinateAtIndex:i+1]; 

       NSLog(@"next pt s latitude %ff" , nextPoint.latitude); 
       NSLog(@"next pt s longitude %ff" , nextPoint.longitude); 
       NSLog(@"this pt s latitude %ff" , thisPoint.latitude); 
       NSLog(@"this pt s longitude %ff" , thisPoint.longitude); 

       [self drawArrowLines:mapView_ :thisPoint :nextPoint :[UIColor redColor]: i+1 : true]; 
       [self createDashedLine: thisPoint :nextPoint :[UIColor redColor]]; 
      } 
     }else{ 
      polyline = [GMSPolyline polylineWithPath:currentPath]; 
      polyline.geodesic = NO; 
      polyline.strokeWidth = 5.f; 
      polyline.strokeColor = [UIColor greenColor]; 
      polyline.map = mapView_; 


      _lengths = @[@([currentPath lengthOfKind:kGMSLengthGeodesic]/50)]; 
      _polys = @[polyline]; 

      [self setupStyleWithColour:[UIColor greenColor]]; 
      [self tick]; 

      for(int i = 0 ; i < [currentPath count] -1 ; i++){ 
       CLLocationCoordinate2D thisPoint = [currentPath coordinateAtIndex:i]; 
       CLLocationCoordinate2D nextPoint = [currentPath coordinateAtIndex:i+1]; 


       NSLog(@"next pt s latitude %ff" , nextPoint.latitude); 
       NSLog(@"next pt s longitude %ff" , nextPoint.longitude); 
       NSLog(@"this pt s latitude %ff" , thisPoint.latitude); 
       NSLog(@"this pt s longitude %ff" , thisPoint.longitude); 

       [self drawArrowLines:mapView_ :thisPoint :nextPoint :[UIColor greenColor] : i+1 : false]; 
       [self createDashedLine: thisPoint :nextPoint :[UIColor greenColor]]; 
      } 
     } 
    } 
} 

risposta

2

Sì lo fa, per la linea tratteggiata è necessario configurare alcune cose.

prima definire alcune variabili

NSArray *_styles; 
NSArray *_lengths; 
NSArray *_polys; 
double _pos, _step; 

La definizione della funzione, al di fuori del for..loop non all'interno come si sta facendo

- (void) createDashedLine:(CLLocationCoordinate2D)thisPoint:(CLLocationCoordinate2D)nextPoint: 
(UIColor *)colour 
{ 

    double difLat = nextPoint.latitude - thisPoint.latitude; 
    double difLng = nextPoint.longitude - thisPoint.longitude; 
    double scale = camera.zoom * 2; 
    double divLat = difLat/scale; 
    double divLng = difLng/scale; 
    CLLocationCoordinate2D tmpOrig= thisPoint; 

    GMSMutablePath *singleLinePath = [GMSMutablePath path]; 

    for(int i = 0 ; i < scale ; i ++){ 
     CLLocationCoordinate2D tmpOri = tmpOrig; 
     if(i > 0){ 
      tmpOri = CLLocationCoordinate2DMake(tmpOrig.latitude + (divLat * 0.25f), 
               tmpOrig.longitude + (divLng * 0.25f)); 
     } 
     [singleLinePath addCoordinate:tmpOri]; 
     [singleLinePath addCoordinate: 
     CLLocationCoordinate2DMake(tmpOrig.latitude + (divLat * 1.0f), 
             tmpOrig.longitude + (divLng * 1.0f))]; 


     tmpOri = CLLocationCoordinate2DMake(tmpOrig.latitude + (divLat * 1.0f), 
              tmpOrig.longitude + (divLng * 1.0f)); 

    } 

    GMSPolyline *polyline ; 
    polyline = [GMSPolyline polylineWithPath:singleLinePath]; 
    polyline.geodesic = NO; 
    polyline.strokeWidth = 5.f; 
    polyline.strokeColor = colour; 
    polyline.map = mapView_; 

    //Setup line style and draw 
    _lengths = @[@([singleLinePath lengthOfKind:kGMSLengthGeodesic]/100)]; 
    _polys = @[polyline]; 
    [self setupStyleWithColour:colour]; 
    [self tick]; 
} 

- (void)tick { 
    //Create steps for polyline(dotted polylines) 
    for (GMSPolyline *poly in _polys) { 
     poly.spans = 
     GMSStyleSpans(poly.path, _styles, _lengths, kGMSLengthGeodesic, _pos); 
    } 
    _pos -= _step; 
} 

-(void)setupStyleWithColour:(UIColor *)color{ 

    GMSStrokeStyle *gradColor = [GMSStrokeStyle gradientFromColor:color toColor:color]; 

    _styles = @[ 
       gradColor, 
       [GMSStrokeStyle solidColor:[UIColor colorWithWhite:0 alpha:0]], 
       ]; 
    _step = 50000; 
} 

Speranza che aiuta. Saluti.

+0

cosa succede se ho la polilinea in corso di elaborazione prima? Dobbiamo prima cancellare la mappa? –

+0

Prima di quello come? Non ho capito, disegnerai le linee solo una volta e se vuoi disegnare di nuovo si devi cancellare la mappa usando '[map clear];' – iphonic

+0

Ho scoperto che viene disegnata solo una piccola parte della linea e la spaziatura non è abbastanza ampia. Per favore, potresti dirmi come modificare in modo tale che tutte le linee siano linee tratteggiate? –

26

Creare una linea tratteggiata in google maps è semplice come questo. Definisce una polilinea con un motivo alternato verde e trasparente.

GMSMutablePath *path = [GMSMutablePath path]; 

for (...) { 
    // add coordinate to your path 
    [path addCoordinate:CLLocationCoordinate2DMake(latitude, longitude)]; 
} 

GMSPolyline *polyline = [GMSPolyline polylineWithPath:path]; 
polyline.map = self.mapView; 
polyline.strokeWidth = 3.0; 

NSArray *styles = @[[GMSStrokeStyle solidColor:[UIColor greenColor]], 
        [GMSStrokeStyle solidColor:[UIColor clearColor]]]; 

NSArray *lengths = @[@25, @20]; 

polyline.spans = GMSStyleSpans(polyline.path, styles, lengths, kGMSLengthRhumb); 

Se si vuole una linea tratteggiata allora si può regolare la lunghezza di

NSArray *lengths = @[@10, @10]; 
+1

Funziona perfettamente! Se per qualcuno questo sembra non funzionare (come succede a me) basta aumentare le dimensioni, come 10000. Nel mio caso il massimo zoom che stavo usando era così basso che non riuscivo a vedere la separazione tra le linee e sembrava non funzionava –

8

Tutti coloro che hanno bisogno di segmenti di linea lunghezze per essere indipendente dal livello di zoom della mappa, Ecco la mia soluzione in rapida. Creo stesso modo poligonale come in this answer, poi subito dopo in func mapView(mapView: GMSMapView, didChangeCameraPosition position: GMSCameraPosition) chiamo questo metodo:

func updateLine() { 
    let styles = [ 
     GMSStrokeStyle.solidColor(UIColor.blackColor()), 
     GMSStrokeStyle.solidColor(UIColor.clearColor()) 
    ] 
    let scale = 1.0/mapView.projection.pointsForMeters(1, atCoordinate: mapView.camera.target) 
    line.spans = GMSStyleSpans(line.path!, styles, [15.0 * scale, 10.0 * scale], kGMSLengthRhumb) 
} 

15.0 e 10.0 sono segmenti lunghezze in punti.

+0

Per me la risposta migliore e più semplice. –

1

Ecco la Swift 3.0 traduzione

//Returns a GMSPath parsed from gpx file 
     path = GpxProcessor(fileNames: "test.gpx").getPolygons() 
     redPolyline = GMSPolyline(path: path) 
     redPolyline.geodesic = true 

     redPolyline.map = mapView 

     let styles = [GMSStrokeStyle.solidColor(.clear), 
         GMSStrokeStyle.solidColor(.red)] 
     let lengths: [NSNumber] = [10, 10] 

     redPolyline.spans = GMSStyleSpans(redPolyline.path!, styles, lengths,GMSLengthKind.rhumb) 
Problemi correlati