2
- (void)viewDidLoad
{
    [super viewDidLoad];

    CLLocationCoordinate2D currentLocation;
    currentLocation.latitude = self.mapView.userLocation.location.coordinate.latitude;
    currentLocation.longitude = self.mapView.userLocation.location.coordinate.longitude;

    CLLocationCoordinate2D otherLocation;
    otherLocation.latitude = [lati doubleValue];
    otherLocation.longitude = [longi doubleValue];

    MKPointAnnotation *mka = [[MKPointAnnotation alloc]init];
    mka.Coordinate = otherLocation;
    mka.title = @"!";
    [self.mapView addAnnotation:mka];

    self.mapView.delegate = self;

    MKMapPoint *pointsArray = malloc(sizeof(CLLocationCoordinate2D));
    pointsArray[0]= MKMapPointForCoordinate(currentLocation);
    pointsArray[1]= MKMapPointForCoordinate(otherLocation);
    routeLine = [MKPolyline polylineWithPoints:pointsArray count:2];
    free(pointsArray);

    [self.mapView addOverlay:routeLine];
}

我正在使用此代码显示坐标之间的折线,但我得到了这条直线。如何解决这个问题。

在此处输入图像描述

4

2 回答 2

2

根据您的屏幕截图,该屏幕显示该线不是从用户位置开始,而是显然在东部的某个偏远位置(可能是非洲海岸附近的大西洋中的 0,0)...

您的潜在问题是您正在尝试读取 userLocation 坐标,viewDidLoad但地图可能尚未获得该位置,在这种情况下您将从 0,0 开始绘制。

确保showsUserLocationYES并阅读 userLocation 并在didUpdateUserLocation委托方法中创建折线。

还请记住,didUpdateUserLocation如果设备正在移动或操作系统获得更好的位置,则可以多次调用它。如果您不考虑它,这可能会导致绘制多条线(在您将覆盖创建移动到那里之后)。您可以在添加新的覆盖之前删除现有的覆盖,或者如果已经完成,则不添加覆盖。


此外,请注意以下事项:

发布的代码试图在两点之间画一条线,但是

MKMapPoint *pointsArray = malloc(sizeof(CLLocationCoordinate2D));

只为一个点 分配空间。

另一个问题是它使用 CLLocationCoordinate2D 的大小而不是 MKMapPoint ,这是您放入数组的内容(尽管这在技术上不会造成问题,因为这两个结构恰好是相同的大小)。

尝试将该行更改为:

MKMapPoint *pointsArray = malloc(sizeof(MKMapPoint) * 2);


请注意,您也可以只使用该polylineWithCoordinates方法,因此您不必将 CLLocationCoordinate2Ds 转换为 MKMapPoints。

于 2013-12-03T12:28:04.737 回答
0

改用 MKDirections。教程在这里

于 2013-12-03T12:29:28.993 回答