问题
I'm trying to display a polyline on my map, but the line doesn't show up. I tried a lot of things, but noting seems to work.
I checked the Core Data functions, and it is returning data, so that is not the problem. It must me somewhere in the mappoint creation or the dwawing on the map (I guess). I'm sure it must be a little mistake somewhere, but I can't find it.
My code:
- (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;
}
回答1:
There are two issues with the code shown:
- The polyline is being created using
MKMapPoint
s which are incorrectly set to latitude/longitude values. AnMKMapPoint
is not degrees of latitude/longitude. It is an x/y transformation of a lat/long on the flat map projection. Either convert the latitude/longitude values toMKMapPoint
s usingMKMapPointForCoordinate
or just useCLLocationCoordinate2D
instead. Just usingCLLocationCoordinate2D
when you have the lat/long is much easier to code and understand. - In
viewForOverlay
, the code is creating an emptyMKOverlayView
which is invisible. Create anMKPolylineView
instead (a subclass ofMKOverlayView
that drawsMKPolyline
s) and set itsstrokeColor
.
For the first issue, use:
CLLocationCoordinate2D
instead ofMKMapPoint
,CLLocationCoordinate2DMake
instead ofMKMapPointMake
,- and
polylineWithCoordinates
instead ofpolylineWithPoints
For the second issue, here's an example:
- (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;
}
A couple of other things:
- Instead of
valueForKey:@"lat"
, I would useobjectForKey:@"lat"
(same for@"lng"
). - Make sure the map view's
delegate
is set otherwise theviewForOverlay
delegate method will not get called even with all the other changes.
来源:https://stackoverflow.com/questions/16838360/ios-sdk-mapkit-mkpolyline-not-showing