Нарисуйте полилинию между заданными точками на карте

Я реализую приложение для 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;
}

Поэтому мне нужно провести линии между точками на карте. Начало строки - это первая выпавшая булавка, а конец - на последней выпавшей булавке.


person fadd    schedule 16.08.2012    source источник
comment
Что такое routeLineView? Что это за элемент пользовательского интерфейса?   -  person Sam Spencer    schedule 04.02.2013


Ответы (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=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), поскольку именно это и будет содержать массив.

person Community    schedule 16.08.2012
comment
Привет! хотелось бы спросить, а как скрыть полилинии на карте? как внутри кнопки Показать / скрыть полилинии? Благодарность :) - person fadd; 03.09.2012
comment
Получите ссылку на наложение view (т.е. MKPolylineView) и установите для его свойства hidden значение YES / NO. Конечно, вы также можете просто удалить / добавить оверлей (например, MKPolyline). Если требуются дополнительные сведения или это не работает, задайте новый вопрос с помощью кода, который вы пробовали. - person ; 03.09.2012
comment
чувак, мне также нужно удалить полилинии поверх карты, а не только показать / скрыть. Я очень ценю вашу помощь :) - person fadd; 06.09.2012
comment
Пожалуйста, начните новый вопрос с некоторых подробностей о том, что именно вы пытаетесь сделать, что вы пробовали (и почему это не сработало, точные сообщения об ошибках и т. Д.). - person ; 06.09.2012
comment
@AnnaKarenina привет. У меня есть линия между двумя точками, это показывает несколько линий. пожалуйста, помогите мне в критической ситуации. Могу ли я показать свой код? - person kannan; 16.03.2013