折线随机绘制并在地图上随机放置

时间:2014-12-13 22:08:18

标签: ios objective-c mkmapview mkoverlay mkpolyline

我正在努力研究如何在地图上显示线条。我试图从触摸中划出一条线,开始触及结束。

此刻我正在接触触摸的地方的坐标,将其添加到阵列中,取出触摸结束的绳索,将其添加到阵列然后绘制线条。这是我的代码。

当我遗憾地运行代码时,我的线条没有显示。然而,当坐在想知道我错过了什么(因为我的coords被保存到阵列)时,我一直在沮丧地刷屏幕,突然出现了一条线!我关闭了程序并再次做同样的事情,据我所知,线条是随机绘制的,并且坐标错误。

我改变了

CLLocationCoordinate2D obh1=CLLocationCoordinate2DMake
    (startTouch.latitude, startTouch.longitude);

CLLocationCoordinate2D obh1=CLLocationCoordinate2DMake
    (startTouch.longitude, startTouch.latitude);

看看我是否以某种方式混合我的坐标,但同样的事情正在发生。线条是在随机位置绘制的。

如果有人可以帮我解决这个问题,我将不胜感激。

我做了一些工作,这就是我想出的。当我点击地图时,您会看到4个线条点。他们是接触结束,接触开始。我不知道他们来自哪里,但不知道我的代码。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches began");

    UITouch *touch = [touches anyObject];

    // Get the specific point that was touched
    CGPoint point = [touch locationInView:self.view];
     //convert toc
    CLLocationCoordinate2D startTouch
    =[self.map convertPoint:point toCoordinateFromView:_map];
    CLLocationCoordinate2D obh1=CLLocationCoordinate2DMake(startTouch.latitude, startTouch.longitude);
    [arrayOfLine addObject: [NSValue valueWithMKCoordinate:obh1]];
    NSLog(@"array: %@", arrayOfLine);
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches END");


    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self.view];
    CLLocationCoordinate2D endTouch
    =[self.map convertPoint:point toCoordinateFromView:_map];
    CLLocationCoordinate2D obh=CLLocationCoordinate2DMake(endTouch.latitude, endTouch.longitude);
        [arrayOfLine addObject: [NSValue valueWithMKCoordinate:obh]];
        NSLog(@"array: %@", arrayOfLine);

            MKPolyline *polygon = [MKPolyline polylineWithCoordinates:&obh count:[arrayOfLine count]];

    [_map addOverlay:polygon];
}

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
    if ([overlay isKindOfClass:[MKPolyline class]])
    {
        MKPolylineView *overlayView = [[MKPolylineView alloc] initWithPolyline:overlay];

        overlayView.strokeColor     = [[UIColor blueColor] colorWithAlphaComponent:0.7];
        overlayView.lineWidth       = 3;

        return overlayView;
    }

    return nil;
}

enter image description here

1 个答案:

答案 0 :(得分:0)

随机行 来自相关代码。

主要问题在于本节touchesEnded

CLLocationCoordinate2D obh=CLLocationCoordinate2DMake(endTouch.latitude, endTouch.longitude);
[arrayOfLine addObject: [NSValue valueWithMKCoordinate:obh]];
NSLog(@"array: %@", arrayOfLine);

MKPolyline *polygon = [MKPolyline polylineWithCoordinates:&obh count:[arrayOfLine count]];


在致电polylineWithCoordinates时,代码会提供obh的地址,这是 CLLocationCoordinate2D结构,但count设置为arrayOfLine中的对象很可能是两个(触摸开始+触摸结束)。

polylineWithCoordinates方法期待CLLocationCoordinate2D个结构的普通C数组。

目前,代码仅为方法提供单个结构,但计数告诉方法还使用 single 结构后面的内存中的字节作为数组中的坐标。 obh之后的内存中的字节很可能是随机值,转换为无意义的坐标,因此您可以得到随机行或根本没有行。


要解决此问题,您需要从arrayOfLine构建一个纯C数组(Objective-C NSArray)。
这是一种方法:

//REPLACE this existing line with the code below:
//MKPolyline *polygon = [MKPolyline polylineWithCoordinates:&obh count:[arrayOfLine count]];

CLLocationCoordinate2D coords[arrayOfLine.count];

for (int c = 0; c < arrayOfLine.count; c++)
{
    NSValue *v = [arrayOfLine objectAtIndex:c];
    coords[c] = v.MKCoordinateValue;
}

MKPolyline *polygon = [MKPolyline polylineWithCoordinates:coords count:[arrayOfLine count]];

<小时/> 其他几点不直接导致问题:

  1. touchesBegan中,无需创建obh1startTouch已经是CLLocationCoordinate2D,您可以将其添加到数组中。
  2. touchesEnded中,无需创建obhendTouch已经是CLLocationCoordinate2D,您可以将其添加到数组中。
  3. 目前,arrayOfLine在任何时候都没有被清除。这意味着每当触摸结束时,用户绘制的所有行都被重新绘制(并连接在一起)。不确定目的是什么,但如果您只想绘制当前的开始和结束触摸对,那么在touchesBegan的顶部,执行[arrayOfLine removeAllObjects];
  4. 确保地图视图上的userInteractionEnabled设置为NO,否则可能会干扰触摸方式并导致奇怪的行为(例如touchesEnded未被调用)。