ios Google SDK Map无法创建虚线折线

Raj*_*epe 7 google-maps ios google-polyline google-maps-sdk-ios

我已经调用了下面的方法来绘制标记之间的虚线折线.在执行时,它表明只绘制实线.你能告诉我如何在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]];
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 33

在谷歌地图中创建虚线就像这样简单.这定义了具有绿色和透明交替图案的折线.

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);
Run Code Online (Sandbox Code Playgroud)

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

NSArray *lengths = @[@10, @10];
Run Code Online (Sandbox Code Playgroud)

  • 这很完美!如果对某人来说这似乎不起作用(就像发生在我身上一样),只需要让长度更大,比如10000.在我的情况下,我使用的最大变焦是如此之低,以至于我看不到线条之间的分离,看起来像它不起作用. (3认同)

小智 17

每个需要线段长度独立于地图缩放级别的人,这是我在swift中的解决方案.我创建折线的方式与此答案相同,然后就在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)
}
Run Code Online (Sandbox Code Playgroud)

15.0并且10.0是段的长度.


Kam*_*ran 5

雨燕4.0及以上版本米哈伊尔·瓦西里耶夫的答案。

func updateLine() {
    let styles: [GMSStrokeStyle] = [.solidColor(.red), .solidColor(.clear)]
    let scale = 1.0 / mapView.projection.points(forMeters: 1, at: mapView.camera.target)
    let solidLine = NSNumber(value: 15.0 * Float(scale))
    let gap = NSNumber(value: 10.0 * Float(scale))
    line.spans = GMSStyleSpans(line.path!, styles, [solidLine, gap], GMSLengthKind.rhumb)
}
Run Code Online (Sandbox Code Playgroud)


iph*_*nic 2

是的,对于虚线,您需要配置一些东西。

首先定义几个变量

NSArray *_styles;
NSArray *_lengths;
NSArray *_polys;
double _pos, _step;
Run Code Online (Sandbox Code Playgroud)

函数中的定义,在函数之外,而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;
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。干杯。