gpt4 book ai didi

objective-c - 在 map 上的给定点之间绘制折线

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:49:09 25 4
gpt4 key购买 nike

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

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

这是我的代码...

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

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

和覆盖委托(delegate)

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

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

最佳答案

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

index 0: latitude for point 1
index 1: longitude for point 1
index 2: latitude for point 2
index 3: longitude for point 2
index 4: latitude for point 3
index 5: longitude for point 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) 是正确的,因为这是数组将要包含的内容。

关于objective-c - 在 map 上的给定点之间绘制折线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11984554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com