MKMapPointForCoordinate returning invalid coordina

2019-07-24 13:04发布

问题:

I am working with MKMapView's, annotations, overlays, etc, but I'm having a pain in the butt issue with MKMapPointForCoordinate() returning an invalid coordinate.

Code:

MKMapPoint* pointArr;
for (Category* route in validRoutes){

    NSString* routeID = [route routeid];
    NSArray* pointData = [routes objectForKey:routeID];

    pointArr = malloc(sizeof(MKMapPoint) * [pointData count]);
    int i = 0;

    for (NSDictionary* routeData in pointData) {

        NSString* latitude = [routeData objectForKey:@"latitude"];
        NSString* longitude = [routeData objectForKey:@"longitude"];
        NSLog(@"L: %@ L: %@",latitude, longitude);

        CLLocationCoordinate2D coord = CLLocationCoordinate2DMake([[f numberFromString:latitude] doubleValue], [[f numberFromString:longitude] doubleValue]);


        NSLog(@"Coord: %f %f",coord.latitude,coord.longitude);

        MKMapPoint point = MKMapPointForCoordinate(coord);
        NSLog(@"Point: %f %f",point.x,point.y);
        pointArr[i] = point;
        i++;

    }

    MKPolyline *polyline = [MKPolyline polylineWithPoints:pointArr count: i];
    polyline.title = [route name];
    [routeOverlays setObject:polyline forKey: [route routeid]];
    [map addOverlay:polyline];
    free(pointArr);
}

Output Example:

L: 41.380840 L: -83.641319

Coord: 41.380840 -83.641319

Point: 71850240.204982 100266073.824832

I don't understand why the conversion to a MKMapPoint is destroying the values of my CLLocationCoordinate2D. The overlay doesn't show up on the map because the values are invalid...

EDIT: I got the point working by using MKMapPointMake instead, BUT, my overlay still isn't showing. This is the mapView: viewForOverlay: code:

-(MKOverlayView*)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay {
MKOverlayView *overlayView = nil;

//Checks if the overlay is of type MKPolyline
if([overlay isKindOfClass:[MKPolyline class]]){
    MKPolylineView *routeLineView = [[MKPolylineView alloc] initWithPolyline:overlay];

    routeLineView.strokeColor = [UIColor orangeColor];
    routeLineView.lineWidth = 10;
    return overlayView;
}

return nil;
}

The method gets called (Used a breakpoint to confirm), and I have annotations working (So the delegate has to be setup correctly, I assume)

Double edit: :facepalm: I was returning nil every time in the delegate code. That's what I get for copying and pasting the previous versions code ;P

回答1:

An MKMapPoint is not a latitude/longitude in degrees (like CLLocationCoordinate2D).

They are not interchangeable and so you should not expect the MKMapPoint x,y values to show any obvious relation to the corresponding latitude and longitude.

An MKMapPoint is the conversion of latitude and longitude onto a flat projection using x,y values which are not in the same scale or range as latitude and longitude. Please see the Map Coordinate Systems section in the Location Awareness Programming Guide for a more detailed explanation.

By the way, if you have CLLocationCoordinate2D values, it's much easier to create a polyline using polylineWithCoordinates instead of polylineWithPoints. That way, you don't need to bother with any conversion.

See iOS SDK: MapKit MKPolyLine not showing for some more details and an example.