在地图上的给定点之间绘制折线

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

我编写了代码并从我的观点得到了折线,达到了无限的一点。 换句话说,该行的起点从我给定的纬度和长点开始,但该行的结尾是无限的,而不是另一个点。

这是我的代码……

我在一个名为routeLatitudesNSMutableArray填充了坐标。 arrays单元被填充一个用于纬度,一个用于经度。

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

所以我需要在地图上的点之间绘制线条。 该行的开头是第一个掉落的引脚,末端是最后一个掉落的引脚。

根据代码, routeLatitudes数组具有如下列出的对象:

index 0:点1的纬度
index 1:第1点的经度
index 2:第2点的纬度
指数3:第2点的经度
index 4:第3点的纬度
指数5:第3点的经度

因此,如果routeLatitudes.count为6,它实际上只有3个点。

这意味着malloc正在分配错误的点数,而polylineWithPoints调用也指定了覆盖的错误点数。

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

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

因此,对于idx=0 ,设置了pointArr[0] ,但是对于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)是正确的,因为这是数组将包含的内容。