2

我正在实现一个 iOS 应用程序,我想在地图上的几个给定坐标之间绘制一条折线。

我编写了代码并得到了从我的点绘制的多段线到达一个无限点。换句话说,线的起点从我给定的纬度和经度点开始,但线的终点是无限的,而不是另一点。

这是我的代码...

NSMutableArray我在一个被调用的坐标中填充了坐标routeLatitudes。数组单元格被填充一个用于纬度,一个用于填充经度。

MKMapPoint* pointArr = malloc(sizeof(CLLocationCoordinate2D) * [routeLatitudes count]); 

for(int idx = 0; idx < [routeLatitudes count]; idx=idx+2)
{
    CLLocationCoordinate2D workingCoordinate;       
    workingCoordinate.latitude=[[routeLatitudes objectAtIndex:idx] doubleValue];
    workingCoordinate.longitude=[[routeLatitudes objectAtIndex:idx+1] doubleValue];  
    MKMapPoint point = MKMapPointForCoordinate(workingCoordinate);
    pointArr[idx] = point;      
}   

// create the polyline based on the array of points. 
routeLine = [MKPolyline polylineWithPoints:pointArr count:[routeLatitudes count]];
[mapView addOverlay:self.routeLine];
free(pointArr);

和覆盖委托

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
   MKOverlayView* overlayView = nil;

  if(overlay == routeLine)
  {
    self.routeLineView = [[[MKPolylineView alloc] initWithPolyline:self.routeLine]        autorelease];
    self.routeLineView.fillColor = [UIColor colorWithRed:51 green:51 blue:255  alpha:1];
    self.routeLineView.strokeColor = [UIColor colorWithRed:204 green:0 blue:0 alpha:1];
    self.routeLineView.lineWidth = 3;

    overlayView = routeLineView;
  }
return overlayView;
}

所以我需要在地图上的点之间画线。行的开头是第一个掉线的引脚,结尾是最后一个掉线的引脚。

4

1 回答 1

4

根据代码,routeLatitudes数组中的对象如下所示:

索引 0:点 1 的纬度
索引 1:点 1 的经度
索引 2:点 2 的纬度
索引 3:点 2 的经度
索引 4:点 3 的纬度
索引 5:点 3 的经度
...

所以如果routeLatitudes.count是 6,它实际上只有 3 个点。

这意味着malloc分配了错误的点数,并且polylineWithPoints调用还为覆盖指定了错误的点数。

另一个问题是,由于pointArr将只包含一半的对象,routeLatitudes因此您不能对两个数组使用相同的索引值。

for循环索引计数器在idx每次迭代时递增 2,因为这就是routeLatitudes点的布局方式,但随后使用相同的idx值来设置pointArr.

所以 for idx=0,pointArr[0]被设置,然后 for idx=2,pointArr[2]被设置(而不是pointArr[1]),等等。这意味着所有其他位置pointArr都未初始化,导致行“走向无穷大”。

因此更正后的代码可能如下所示:

int pointCount = [routeLatitudes count] / 2;
MKMapPoint* pointArr = malloc(sizeof(MKMapPoint) * pointCount);

int pointArrIndex = 0;  //it's simpler to keep a separate index for pointArr
for (int idx = 0; idx < [routeLatitudes count]; idx=idx+2)
{
    CLLocationCoordinate2D workingCoordinate;       
    workingCoordinate.latitude=[[routeLatitudes objectAtIndex:idx] doubleValue];
    workingCoordinate.longitude=[[routeLatitudes objectAtIndex:idx+1] doubleValue];  
    MKMapPoint point = MKMapPointForCoordinate(workingCoordinate);
    pointArr[pointArrIndex] = point;
    pointArrIndex++;
}   

// create the polyline based on the array of points. 
routeLine = [MKPolyline polylineWithPoints:pointArr count:pointCount];
[mapView addOverlay:routeLine];
free(pointArr); 

另请注意malloc,我更正sizeof(CLLocationCoordinate2D)sizeof(MKMapPoint). 这在技术上并没有引起问题,因为这两个结构恰好是相同的长度,但使用它是正确的,sizeof(MKMapPoint)因为这就是数组将包含的内容。

于 2012-08-16T11:29:30.557 回答