ios Google SDK Map不能创build虚线多段线

我已经调用下面的方法来绘制标记之间的虚线折线。 当涉及到执行时,它显示只绘制实线。 您能否告诉我如何在Google Map上绘制虚线?

在这里输入图像说明

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

是的,对于虚线你需要configuration一些东西。

首先定义几个variables

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

在函数中定义,在for..loop之外不要像你在做的那样

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

希望能帮助到你。 干杯。

在谷歌地图中创build一个虚线就像这样简单。 这定义了具有绿色和透明交替图案的多段线。

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

如果你想要一个虚线,那么你可以调整长度

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

每个需要线段长度的人都要独立于地图缩放级别,这里是我的解决scheme。 我创build折线相同的方式,然后在这个答案 ,然后在func mapView(mapView: GMSMapView, didChangeCameraPosition position: GMSCameraPosition)我调用这个方法:

 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.010.0是以分为单位的分段长度。

这里是Swift 3.0的翻译

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