在地图上绘制给定的点之间的折线(Draw polyline between given points

2019-09-21 06:25发布

我实现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;
}

所以,我需要在地图上的点之间绘制的线条。 该行的开头是第一个放落针,以及到底是在最后放落针。

Answer 1:

据的代码中, 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

因此,对于idx=0pointArr[0]被设置但然后idx=2pointArr[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)因为这正是数组是要遏制。



文章来源: Draw polyline between given points on the map