2012-05-30 2 views
2

Это сводит меня с ума. Я прошел через все сообщения в stackoveflow, но ничего не подходит для счета. Я пытаюсь добавить простую полилинию (то есть не пользовательскую накладку) в качестве наложения на мой MKMapView. Метод viewForOverlay на делегате никогда не вызывается. Делегат карты правильно вызывается для любой другой функции делегата. Вот код из viewForOverlay метода:viewforoverlay никогда не набирается

//maanges the overlay 
- (MKOverlayView *)mapView:(MKMapView *)map viewForOverlay:(id <MKOverlay>)overlay{ 

    NSLog(@"does it ask for the overlay view?"); 

    MKOverlayView *overlayView = nil; 

    return overlayView; 
} 

Вот код, где я построить ломаную линию и добавить его к карте:

MKPolyline *thePolyline = [MKPolyline polylineWithPoints:pts count:[arrOfPoints count]]; 

    [thePolyline setTitle:@"line"]; 

    [mapView addOverlay:thePolyline]; 

Ломаных фактически имеет свой набор точек (около 1000), поэтому я не думаю, что проблема там. Не хватает ли какого-либо требуемого свойства или какой-либо другой реализации на карте?

РЕДАКТИРОВАТЬ Показывает код для полилинии MKMapPoint генерации:

я использую файл XML с приблизительно 1100 точек для создания ломаной линии в качестве части процесса AppConfig. Я читаю и разбираю файл с NSXMLParser и NSXMLParserDelegate соответственно. Вот код, который генерирует точки (от метода foundCharacters в протоколе NSXMLParserDelegate):

//NSXMLParserDelegate methods... 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 

    if(POINT){ 
     NSArray *arr = [string componentsSeparatedByString:@","]; 

     MKMapPoint pt = MKMapPointMake([[arr objectAtIndex:1]doubleValue], [[arr objectAtIndex:0]doubleValue]); 

     MapPointObject *thePoint = [[MapPointObject alloc] init]; 
     thePoint.mapPoint = pt; 

     //gives the mkmappoint to the array of points. 
     [arrOfPoints addObject:thePoint]; 

     [thePoint release]; 
    } 
} 

и вот где точки на самом деле порождают MKPolyline и передает его MAPview (от didEndElement метода на NSXMLParserDelegate протокола):

if([elementName isEqualToString:@"appConfig"]){ 
     MKMapPoint *pts = malloc([arrOfPoints count] * sizeof(MKMapPoint)); 

     for(int i = 0; i <= [arrOfPoints count] - 1; i++){ 
      MapPointObject *pointObject = [arrOfPoints objectAtIndex:i]; 
      pts[i] = pointObject.mapPoint; 
     } 

     MKPolyline *thePolyline = [MKPolyline polylineWithPoints:pts count:[arrOfPoints count]]; 
     [thePolyline setTitle:@"line"]; 

     //adding the polyline to the model's mapview 
     Model *theModel = [Model sharedModel]; 

     [theModel.mapView setVisibleMapRect:thePolyline.boundingMapRect animated:YES]; 
     [theModel.mapView addOverlay:thePolyline]; 

     free(pts); 
    } 

точка подсчет собственность на MKPolyline это на самом деле говорит, что есть 1100 пунктов в нем. Значения XML образца::

EDIT

<appConfig> 
<point>-94.847587,38.977967</point> 
<point>-94.844111,38.977978</point> 
<point>-94.844108,38.977369</point> 
<point>-94.844003,38.977369</point> 
<point>-94.843955,38.974886</point> 
+0

Можете ли вы показать, как 'pts' их получает? Поскольку вы используете polylineWithPoints, убедитесь, что 'pts' заполнен значениями MKMapPoint вместо значений CLLocationCoordinate2D (или вместо них используется polylineWithCoordinates). Удостоверьтесь, что 'arrOfPoints count' является именно тем, насколько велики' pts'. – Anna

+0

@ АннаКаренина - Я думаю, что делаю это правильно, нет? Я просто разместил свой код, возможно, быстро на него набросился? Благодаря! – jdb1a1

+0

Сохраняет ли координаты файла xml (lat, long) или MKMapPoint (они не одно и то же)? – Anna

ответ

2

XML-файл содержит координаты (широту и долготу) значение. Эти значения координат - это не то же самое, что и значения MKMapPoint (которые представляют собой проекцию x, y проекции карты на длину) на плоскую карту.

Вы должны хранить координаты, а не MKMapPoint значения (которые вы есть).

Таким образом, вместо использования MKMapPoint и polylineWithPoints используйте CLLocationCoordinate2D и polylineWithCoordinates.

В методе парсера xml создайте и сохраните CLLocationCoordinate2D, используя CLLocationCoordinate2DMake.

pts массив должен быть типа CLLocationCoordinate2D * и при выполнении malloc, используйте sizeof(CLLocationCoordinate2D).

Затем позвоните по телефону polylineWithCoordinates вместо polylineWithPoints.


Кстати, вы также должны фактически вернуть вид наложения не-ноль в viewForOverlay после внесения вышеуказанных изменений в противном случае вы все равно не увидите строку:

MKPolylineView *polylineView = [[[MKPolylineView alloc] initWithPolyline:overlay] autorelease]; 
polylineView.strokeColor = [UIColor redColor]; 
polylineView.lineWidth = 2.0; 
return polylineView; 
+0

Прошу прощения за длительную паузу, я получил некоторые другие вещи. Спасибо за информацию, я не понял разницы между MKMapPoint и CLLocationCoordinate2D. Однако изменение этого вопроса еще не решило мою проблему. – jdb1a1

+0

Пока вы отлаживаете это, можете ли вы разместить всего 2 точки в файле XML вместо 1100? Затем, перед вызовом polylineWithCoordinates, NSLog значения CLLocationCoordinare2D в pts [0] и pts [1] (например, 'NSLog (@" pts [0] =% f,% f ", pts [0] .latitude, pts [0 ].) и аналогично для pts [1]). Какие значения он показывает? – Anna

+1

Вы добавили создание MKPolylineView в viewForOverlay и вызвали ли этот метод? Кроме того, что такое «Модель»? Кажется странным, что у вас есть вид карты в одноэлементном режиме? Что это такое? – Anna

1

я получил проблема решена, но, учитывая, что оригинальное решение Анны Карениной решило проблему, я обозначил ее как ответ. Я просто размещаю это, чтобы сделать дополнительную информацию доступной для кого-либо еще, кто на нее нападает.

Когда я изначально написал код, MKMapPointMake принимает такие параметры: MKMapPointMake(x,y). Когда я включил его, CLLocationCoordinate2DMake принимает такие параметры: CLLocationCoordinate2DMake(lat,lng), или в децибелах, CLLocationCoordinate2DMake(y,x). Для моего определенного набора пар координат это не существует, поэтому он никогда не вызывал метод делегата viewForOverlay. Я изменил порядок параметров для конструктора CLLocationCoordinate2DMake, и теперь все работает отлично.

+0

У меня такая же проблема, я попробовал ваше решение, но все равно имею такую ​​же проблему –

1
[self.mapView addOverlay:polyline]; 
[self.mapView setNeedsDisplay]; 

сила обновления MAPview по телефону setNeedsDisplay :)