在地图上的给定点之间绘制折线
我正在实现一个iOS应用程序,我想在地图上的几个给定坐标之间绘制折线。
我编写了代码并从我的观点得到了折线,达到了无限的一点。 换句话说,该行的起点从我给定的纬度和长点开始,但该行的结尾是无限的,而不是另一个点。
这是我的代码……
我在一个名为routeLatitudes
的NSMutableArray
填充了坐标。 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)
是正确的,因为这是数组将包含的内容。