我正在尝试在地图上显示一条折线,但该线未显示。我尝试了很多事情,但注意到似乎可行。

我检查了核心数据功能,它正在返回数据,所以这不是问题。它一定是我在创建地图点或在地图上拖动时的某个位置(我想)。
我敢肯定这一定是一个小错误,但是我找不到。

我的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    mapView.delegate = self;
}

- (void)createLine
{
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = [appDelegate managedObjectContext];

    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Logs" inManagedObjectContext:context];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDescription];

    NSError *error;
    NSArray *logs = [context executeFetchRequest:request error:&error];

    int logsCount = [logs count];
    MKMapPoint points[logsCount];

    // loop logs
    for (int i = 0; i < logsCount; i++)
    {
        MKMapPoint point;
        point = MKMapPointMake([[[logs objectAtIndex:i] valueForKey:@"lat"] doubleValue], [[[logs objectAtIndex:i] valueForKey:@"lng"] doubleValue]);

        points[i] = point;
    }

    MKPolyline *routeLine = [MKPolyline polylineWithPoints:points count:logsCount];
    [mapView addOverlay:routeLine];
}

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
    MKOverlayView *mapOverlayView = [[MKOverlayView alloc] initWithOverlay:overlay];
    return mapOverlayView;
}

最佳答案

显示的代码有两个问题:

  • 多义线是使用MKMapPoint创建的,但未正确设置为纬度/经度值。 MKMapPoint不是纬度/经度。它是平面地图投影上经/纬度的x / y转换。可以使用MKMapPoint将纬度/经度值转换为MKMapPointForCoordinate,也可以仅使用CLLocationCoordinate2D。只要有纬度/经度,只需使用CLLocationCoordinate2D即可轻松编写代码和理解。
  • viewForOverlay中,代码创建了一个不可见的空MKOverlayView。而是创建一个MKPolylineView(绘制MKOverlayViewMKPolyline的子类)并设置其strokeColor

  • 对于第一个问题,请使用:
  • CLLocationCoordinate2D代替MKMapPoint
  • CLLocationCoordinate2DMake代替MKMapPointMake
  • polylineWithCoordinates代替polylineWithPoints

  • 对于第二个问题,这是一个示例:
    - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
    {
        if ([overlay isKindOfClass:[MKPolyline class]])
        {
            MKPolylineView *mapOverlayView = [[MKPolylineView alloc] initWithPolyline:overlay];
            //add autorelease if not using ARC
            mapOverlayView.strokeColor = [UIColor redColor];
            mapOverlayView.lineWidth = 2;
            return mapOverlayView;
        }
    
        return nil;
    }
    

    其他几件事:
  • 我将使用valueForKey:@"lat"(与objectForKey:@"lat"相同)来代替@"lng"
  • 确保已设置地图视图的delegate,否则即使进行了所有其他更改,viewForOverlay委托方法也不会被调用。
  • 关于ios - iOS SDK:未显示MapKit MKPolyLine,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16838360/

    10-12 03:20