2014-06-24 16 views
5

Zadzwoniłem do poniższej metody, aby narysować kropkowane polilinie między znacznikami. Jeśli chodzi o wykonanie, pokazuje, że rysowane są tylko linie ciągłe. Czy możesz mi powiedzieć, jak narysować przerywane linie na Mapie Google?ios Google SDK Map nie może tworzyć kropkowanych polilinii

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]]; 
      } 
     } 
    } 
} 

Odpowiedz

2

Tak to jest, za linią przerywaną trzeba skonfigurować kilka rzeczy.

pierwsze zdefiniować kilka zmiennych

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

Definiuj w funkcji poza for..loop nie wewnątrz jak robisz

- (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; 
} 

Nadzieję, że to pomaga. Pozdrawiam.

+0

co jeśli mam łamaną ciągniętą wcześniej? Czy najpierw musimy wyczyścić mapę? –

+0

Przed tym jak w? Nie dostałem, narysujesz linie tylko raz, a jeśli chcesz narysować ponownie tak, musisz wyczyścić mapę używając '[map clear];' – iphonic

+0

Odkryłem, że rysowana jest tylko mała część linii a odstępy nie są wystarczająco szerokie. Czy powinieneś mi powiedzieć, jak zmodyfikować tak, że wszystkie linie są przerywanymi liniami? –

26

Tworzenie linii przerywanej w mapach google jest tak proste jak to. To definiuje polilinię z zielonym i przezroczystym układem naprzemiennym.

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); 

Jeśli chcesz linia przerywana to można dostosować długość do

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

To działa idealnie! Jeśli dla kogoś to nie zadziałało (tak jak mi się zdarzyło), po prostu wydłuż je, na przykład 10000. W moim przypadku maksymalny zoom, którego używałem, był tak niski, że nie widziałem podziału między liniami i wyglądało to jak to nie działało. –

8

każdego, kto potrzebuje segmentów liniowych odcinków być niezależny od poziomu powiększenia map, oto moje rozwiązanie w SWIFT. Tworzę wielolinię sam sposób jak w this answer, potem w prawo i potem w func mapView(mapView: GMSMapView, didChangeCameraPosition position: GMSCameraPosition) nazywam tę metodę:

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 i 10.0 są odcinki o długości w punktach.

+0

Dla mnie najlepsza i najprostsza odpowiedź. –

1

Oto Swift 3.0 tłumaczenie

//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) 
Powiązane problemy