1

我正在努力研究如何让线条显示在我的地图上。我试图从接触开始到接触结束画一条线。

目前我正在获取触摸位置的坐标,将其添加到数组中,获取触摸结束位置的线,将其添加到数组中,然后画线。这是我下面的代码。

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

我变了

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

在此处输入图像描述

4

1 回答 1

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方法需要一个普通的 CCLLocationCoordinate2D结构数组。

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


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

//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中,创建obh1是不必要的。 startTouch已经是CLLocationCoordinate2D您可以添加到数组中的一个。
  2. touchesEnded中,创建obh是不必要的。 endTouch已经是CLLocationCoordinate2D您可以添加到数组中的一个。
  3. 目前,arrayOfLine任何时候都没有被清除。这意味着每当触摸结束时,用户绘制的所有线条都会重新绘制(并连接在一起)。不确定意图是什么,但如果您只想绘制当前的开始+结束触摸对,那么在touchesBegan, do的顶部[arrayOfLine removeAllObjects];
  4. 确保在地图视图上userInteractionEnabled设置为NO,否则它可能会干扰触摸方法并导致奇怪的行为(例如touchesEnded不被调用)。
于 2014-12-14T13:25:49.733 回答