Полилиния не рисуется из местоположения пользователя (синяя точка)

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

Я использую этот код для отображения полилинии между координатами, но я получаю эту прямую линию. Как исправить эту проблему.

2 ответа

Решение

На основании вашего скриншота, который показывает линию, начинающуюся не с местоположения пользователя, а, по-видимому, в каком-то отдаленном месте к востоку (вероятно, 0,0, которое находится в Атлантическом океане у побережья Африки)...

Ваша потенциальная проблема заключается в том, что вы пытаетесь прочитать координаты пользователя в viewDidLoad но карта, возможно, еще не получила местоположение, и в этом случае вы будете строить от 0,0.

Удостовериться showsUserLocation является YES и прочитайте userLocation и создайте полилинию в didUpdateUserLocation метод делегата вместо.

Также помните, что didUpdateUserLocation может вызываться несколько раз, если устройство перемещается или ОС становится лучше. Это может привести к рисованию нескольких линий (после того, как вы переместили создание оверлея туда), если вы не учитываете это. Вы можете удалить существующие наложения перед добавлением нового или просто не добавлять наложение, если оно уже было сделано.


Кроме того, обратите внимание на следующее:

Размещенный код пытается провести линию между двумя точками, но это:

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

выделяет место только для одной точки.

Другая проблема заключается в том, что он использует размер CLLocationCoordinate2D вместо MKMapPoint, который вы помещаете в массив (хотя технически это не создает проблемы, поскольку эти две структуры имеют одинаковый размер).

Попробуйте изменить эту строку на:

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


Обратите внимание, что вы также можете просто использовать polylineWithCoordinates метод, поэтому вам не нужно конвертировать CLLocationCoordinate2Ds в MKMapPoints.

Используйте вместо этого MKDirections. учебник здесь

Другие вопросы по тегам