ios Google SDK Map不能创建虚线多段线 [英] ios Google SDK Map cannot create dotted polylines

查看:105
本文介绍了ios Google SDK Map不能创建虚线多段线的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



$ (CLLocationCoordinate2D)thisPoint:(CLLocationCoordinate2D)nextPoint:
(UIColor *)color
{
$ b $ $ p $ - (void)createDashedLine b $ b 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 = color;
polyline.map = mapView_;

//设置线条样式并绘制
_lengths = @ [@([singleLinePath lengthOfKind:kGMSLengthGeodesic] / 50)];
_polys = @ [polyline];
[self setupStyleWithColour:color];
[self tick];
$(void)tick {
//为多段线创建步骤(点划线)
(GMSPolyline * poly在_polys中){
poly.spans =
GMSStyleSpans(poly.path,_styles,_lengths,kGMSLengthGeodesic,_pos);
}
_pos - = _step;

$ b - (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 *折线;
GMSPolyline * polylineC;
GMSMarker *标记;
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]; ([CarArray count]> 2){
[path addLatitude:cp.getLatitude longitude:cp.getLongitude];
}

if
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; ([CarArray count]> 2){

polyline = [GMSPolyline polylineWithPath:currentPath];
}

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


解决方案

是的,对于虚线,您需要配置几件事情。



首先定义几个变量

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

函数中的定义,在之外for..loop 不在里面,
(UIColor *)color
{

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 = [GMSPolyline polylineWithPath:singleLinePath];
polyline.geodesic = NO;
polyline.strokeWidth = 5.f;
polyline.strokeColor = color;
polyline.map = mapView_;

//设置线条样式并绘制
_lengths = @ [@([singleLinePath lengthOfKind:kGMSLengthGeodesic] / 100)];
_polys = @ [polyline];
[self setupStyleWithColour:color];
[self tick];
$(void)tick {
//为多段线创建步骤(点划线)
(GMSPolyline * poly在_polys中){
poly.spans =
GMSStyleSpans(poly.path,_styles,_lengths,kGMSLengthGeodesic,_pos);
}
_pos - = _step;

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

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

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

希望它有帮助。
干杯。


I have called the below method to draw the dotted polylines between the markers. When it comes to the execution, it shows that only solid lines are drawn. Would you please tell me how to draw dotted lines on to 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]];
            }
        }
    }
}

解决方案

Yes it does, for dashed line you need to configure few things.

First define few variables

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

The define in the function, outside the for..loop not inside as you are doing

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

Hope it helps. Cheers.

这篇关于ios Google SDK Map不能创建虚线多段线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆