如何从Dynamic NSMutableArray向CLLocationCoordinate2D添加坐标?

时间:2015-06-21 23:13:14

标签: ios objective-c annotations nsmutablearray mkmapview

我有一个MapView,我想在其中添加注释和来自定义坐标的路径,我从Textfield添加并存储在NSMutableArray中。

现在我能够从多个坐标显示路线,但只有当我将其插入我的代码中时才会显示如下:

-(void)loadMap{

    int Coordinates;
    //MAP
    CLLocationCoordinate2D coordinateArray[Coordinates];
    coordinateArray[0] = CLLocationCoordinate2DMake(LatA, LongA);
    coordinateArray[1] = CLLocationCoordinate2DMake(LatB, LongB);
    coordinateArray[2] = CLLocationCoordinate2DMake(LatC, LongC);
    coordinateArray[3] = CLLocationCoordinate2DMake(LatD, LongD);


    self.routeLine = [MKPolyline polylineWithCoordinates:coordinateArray count:Coordinates];
    [MapViewHome setVisibleMapRect:[self.routeLine boundingMapRect]]; //If you want the route to be visible
    [MapViewHome addOverlay:self.routeLine];
    MapViewHome.mapType = MKMapTypeHybrid;

    [self zoomToFitMapAnnotations:MapViewHome];
}

添加注释我这样做:

-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
{
    if(overlay == self.routeLine)
    {
        if(nil == self.routeLineView)
        {
            self.routeLineView = [[MKPolylineView alloc] initWithPolyline:self.routeLine];
            self.routeLineView.fillColor = [UIColor purpleColor];
            self.routeLineView.strokeColor = [UIColor purpleColor];
            self.routeLineView.lineWidth = 5;

        }

        return self.routeLineView;
    }

    return nil;
}

-(void)AddAnotations{


    DeparturePoint = [[MKPointAnnotation alloc] init];
    DeparturePoint.coordinate = CLLocationCoordinate2DMake(LatA, LongA);
    DeparturePoint.title = [NSString stringWithFormat:@"A"];
    [MapViewHome addAnnotation:DeparturePoint];

    ArrivalPoint = [[MKPointAnnotation alloc] init];
    ArrivalPoint.coordinate = CLLocationCoordinate2DMake(LatB, LongB);
    ArrivalPoint.title = [NSString stringWithFormat:@"B"];

    [MapViewHome addAnnotation:ArrivalPoint];

    C = [[MKPointAnnotation alloc] init];
    C.coordinate = CLLocationCoordinate2DMake(LatC, LongC);
    C.title = [NSString stringWithFormat:@"C"];

    [MapViewHome addAnnotation:C];

    D = [[MKPointAnnotation alloc] init];
    D.coordinate = CLLocationCoordinate2DMake(LatD, LongD);
    D.title = [NSString stringWithFormat:@"D"];

    [MapViewHome addAnnotation:D];



}

现在我想在LoadMap函数中插入我的动态NSMutableArray,以刷新mapView并获得更长的路径!有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这是我能想到的第一个解决方案......

首先我们将CLLocationCoordinate2D包装到一个对象中。为此,我创建了一个名为KBLocationWrapper的包装类。这是界面:

@interface KBLocationWrapper : NSObject
@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@end

接下来生成NSMutableArray ...

NSMutableArray *locationCoordinatesArray = [NSMutableArray array];

然后通过对象包装器将每个坐标添加到数组中......

KBLocationWrapper *locationWrapper = [[KBLocationWrapper alloc] init];
locationWrapper.coordinate = CLLocationCoordinate2DMake(latitude, longitude);
[locationCoordinatesArray addObject:locationWrapper];

最后,弄清楚如何将locationCoordinatesArray放入-loadMap方法,然后遍历每个对象并将coordinate属性映射到coordinateArray中的相应位置{1}} ...(我会为此功能编写一个单独的方法,但出于演示目的,它将直接进入-loadMap

-(void)loadMap{

    ....

    int Coordinates = (int)[locationCoordinatesArray count];

    CLLocationCoordinate2D coordinateArray[Coordinates];

    // loop through coordinates
    for (int i = 0; i < Coordinates; ++i) {
        // write data from the CLLocationCoordinate2D stored in the wrapper
        // to the primitive data array 'coordinateArray'
        coordinateArray[i] = [locationCoordinatesArray[i] coordinate];
    }


    // then generate the routeLine.
    self.routeLine = [MKPolyline polylineWithCoordinates:coordinateArray count:Coordinates];

    ...

}

答案 1 :(得分:0)

我将一个对象添加到NSMutableArray&#34; NSLat&#34;当我从另一个ViewController中解放时:

- (IBAction)UnwindPoiint:(UIStoryboardSegue *)segue {


    float latitude;
    float longitude;
    NSString*PointName;
    NSString*coordinates;

    AddPointViewController *messageViewController = segue.sourceViewController;
    PointName = messageViewController.PointBack;
    latitude = [messageViewController.PointLatitude floatValue];
    longitude = [messageViewController.PointLongitude floatValue];



    KBLocationWrapper *locationWrapper = [[KBLocationWrapper alloc] init];
    locationWrapper.coordinate = CLLocationCoordinate2DMake(latitude, longitude);
    [NSLat addObject:locationWrapper];

    coordinates = [NSString stringWithFormat:@"%f,%f,%@",latitude,longitude,PointName];

   // [NSLat addObject:coordinates];


    [self AddAnotations];
    [self loadMap];

    [FlightLogTable reloadData];


    NSLog(@"%@",coordinates);
    NSLog(@"%lu",(unsigned long)NSLat.count);


}

我添加了Annotations&amp;加载地图已归档:

 -(void)AddAnotations{


        for(int idx = 0; idx < NSLat.count; idx++)
        {
            // break the string down even further to latitude and longitude fields.
            NSString* currentPointString = [NSLat objectAtIndex:idx];
            NSArray* latLonArr = [currentPointString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]];

            CLLocationDegrees latitude  = [[latLonArr objectAtIndex:0] doubleValue];
            CLLocationDegrees longitude = [[latLonArr objectAtIndex:1] doubleValue];
            NSString*Name = [NSString stringWithFormat:@"%@",[latLonArr objectAtIndex:2]];


            DeparturePoint = [[MKPointAnnotation alloc] init];
            DeparturePoint.coordinate = CLLocationCoordinate2DMake(latitude, longitude);
            DeparturePoint.title = Name;
            [MapViewHome addAnnotation:DeparturePoint];


        }

        [self loadMap];

    }

    -(void)zoomToFitMapAnnotations:(MKMapView*)mapView
    {
        if([mapView.annotations count] == 0)
            return;

        CLLocationCoordinate2D topLeftCoord;
        topLeftCoord.latitude = -90;
        topLeftCoord.longitude = 180;

        CLLocationCoordinate2D bottomRightCoord;
        bottomRightCoord.latitude = 90;
        bottomRightCoord.longitude = -180;



        for(MKPointAnnotation*annotation in MapViewHome.annotations)
        {
            topLeftCoord.longitude = fmin(topLeftCoord.longitude, annotation.coordinate.longitude);
            topLeftCoord.latitude = fmax(topLeftCoord.latitude, annotation.coordinate.latitude);

            bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, annotation.coordinate.longitude);
            bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, annotation.coordinate.latitude);
        }

        MKCoordinateRegion region;
        region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5;
        region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5;
        region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 2; // Add a little extra space on the sides
        region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 2; // Add a little extra space on the sides

        region = [mapView regionThatFits:region];
        [MapViewHome setRegion:region animated:YES];
    }




    -(void)loadMap{

        int Coordinates = (int)[NSLat count];

    CLLocationCoordinate2D coordinateArray[Coordinates];

    // loop through coordinates
    for (int i = 0; i < Coordinates; ++i) {
        // write data from the CLLocationCoordinate2D stored in the wrapper
        // to the primitive data array 'coordinateArray'
        coordinateArray[i] = [NSLat[i] coordinate];
    }


    // then generate the routeLine.
    self.routeLine = [MKPolyline polylineWithCoordinates:coordinateArray count:Coordinates];

        [MapViewHome setVisibleMapRect:[self.routeLine boundingMapRect]]; //If you want the route to be visible
        [MapViewHome addOverlay:self.routeLine];
        MapViewHome.mapType = MKMapTypeHybrid;

        [self zoomToFitMapAnnotations:MapViewHome];

    }