Cocoa touch MKOverlay由多个点构成时不显示

Cocoa touch MKOverlay由多个点构成时不显示,cocoa-touch,ios4,mkmapview,overlay,Cocoa Touch,Ios4,Mkmapview,Overlay,我有很多点40-100,我用它来构建一个多边形,放置在我的应用程序的地图视图上。然而,当使用这么多点时,覆盖层拒绝显示,没有错误或任何东西。如果我切换回使用较少数量的点4-8,重叠将再次显示。原因是什么?我如何绕过这个问题?提前谢谢 编辑1: 以下是我的地图视图中的所有相关代码: 标题: #import <UIKit/UIKit.h> #import <MapKit/MapKit.h> #import "PermitListViewController.h" @int

我有很多点40-100,我用它来构建一个多边形,放置在我的应用程序的地图视图上。然而,当使用这么多点时,覆盖层拒绝显示,没有错误或任何东西。如果我切换回使用较少数量的点4-8,重叠将再次显示。原因是什么?我如何绕过这个问题?提前谢谢

编辑1:

以下是我的地图视图中的所有相关代码:

标题:

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import "PermitListViewController.h"


@interface ParkingMapViewController : UIViewController <MKMapViewDelegate> {
    MKMapView *mapView;
    permitTypes permitType;
}

@property (nonatomic, retain) IBOutlet MKMapView *mapView;
@property (nonatomic) permitTypes permitType;


-(void)loadAnnotations; //helper function that loads all annotation data from plist
-(void)loadOverlays; //helper function that loads all overlay data from plist
-(void)showCurrentLocationButtonTapped:(id)sender;


@end
实现剥离了一些与注释和标注相关的功能,因为它们与此处无关:

#import "ParkingMapViewController.h"
#import "MKMapView+ZoomLevel.h"
#import "ParkingAnnotation.h"
#import "ParkingAnnotationView.h"
#import "PermitDetailViewController.h"
#import "ParkingRegionOverlay.h"
#import "CoreDataSingleton.h"


//#define UCD_LATITUDE <some lat>
//#define UCD_LONGITUDE <some long>

@implementation ParkingMapViewController

@synthesize mapView;
@synthesize permitType;

#pragma mark Custom Methods


- (void)showCurrentLocationButtonTapped:(id)sender {
    NSLog(@"Showing current location.");

    if ([mapView showsUserLocation] == NO) {
        [mapView setShowsUserLocation:YES];
    }
    [mapView setCenterCoordinate:mapView.centerCoordinate zoomLevel:13 animated:YES];

}

//...


#pragma mark Builtin Methods

/*
 // The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
        // Custom initialization
    }
    return self;
}
*/


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    mapView.delegate = self;

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:100 
                                              target:self action:@selector(showCurrentLocationButtonTapped:)];

    [self loadOverlays];
    [self loadAnnotations];

    CLLocationCoordinate2D centerCoord = { UCD_LATITUDE, UCD_LONGITUDE };
    [mapView setCenterCoordinate:centerCoord zoomLevel:13 animated:NO]; //from "MKMapView+ZoomLevel.h"
}

- (parkingAnnotationType)annotationTypeLookup:(permitTypes)pType
{
    if (pType == permitTypeC) {
        return annotationTypeC;
    } else if (pType == permitTypeL) {
        return annotationTypeL;
    } else if (pType == permitTypeVisitor) {
        return annotationTypeVisitor;
    } else if (pType == permitTypeDisabled) {
        return annotationTypeDisabled;
    } else if (pType == permitTypeVendor) {
        return annotationTypeVendor;
    } else if (pType == permitTypeBikeCommuter) {
        return annotationTypeBikeCommuter;
    }
    return annotationTypeNone;
}

//helper function that loads all annotation data from plist
- (void)loadAnnotations{
    //retrieve path of plist file and populate relevant types with its information
    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"PermitData" ofType:@"plist"];
    NSDictionary *rootOfPermitDataPlistDict = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
    if ([[self title] isEqualToString:@"All Permits"]) {
        for (id key in rootOfPermitDataPlistDict) {

            NSMutableDictionary *permitDict = [rootOfPermitDataPlistDict objectForKey:key];

            //array containing annotation information: latitude, longitude, title, subtitle(see PermitData.plist)
            NSArray *annotationsArray = [permitDict objectForKey:@"annotations"];

            CLLocationCoordinate2D workingCoordinate;
            //loop through annotations array, creating parking annotations filled with the information found in the plist
            for(NSDictionary *annotationContainerDict in annotationsArray){

                ParkingAnnotation *parkingAnnot = [[ParkingAnnotation alloc] init];
                workingCoordinate.latitude = [[annotationContainerDict objectForKey:@"latitude"] doubleValue];
                workingCoordinate.longitude = [[annotationContainerDict objectForKey:@"longitude"] doubleValue];
                [parkingAnnot setCoordinate:workingCoordinate];
                [parkingAnnot setTitle:[annotationContainerDict objectForKey:@"title"]];
                [parkingAnnot setSubtitle:[annotationContainerDict objectForKey:@"subtitle"]];
                [parkingAnnot setAnnotationType:[self annotationTypeLookup:permitType]];

                if (parkingAnnot.annotationType == permitTypeC) [parkingAnnot setAnnotationType:annotationTypeC];
                else if (parkingAnnot.annotationType == permitTypeL) [parkingAnnot setAnnotationType:annotationTypeL];
                else if (parkingAnnot.annotationType == permitTypeVisitor) [parkingAnnot setAnnotationType:annotationTypeVisitor];
                else if (parkingAnnot.annotationType == permitTypeDisabled) [parkingAnnot setAnnotationType:annotationTypeDisabled];
                else if (parkingAnnot.annotationType == permitTypeVendor) [parkingAnnot setAnnotationType:annotationTypeVendor];
                else if (parkingAnnot.annotationType == permitTypeBikeCommuter) [parkingAnnot setAnnotationType:annotationTypeBikeCommuter];

                [mapView addAnnotation:parkingAnnot];
                [parkingAnnot release];
            }//for
        }//for
    }//if
    else {
        NSDictionary *permitDict = [[NSDictionary alloc] initWithDictionary:[rootOfPermitDataPlistDict objectForKey:[self title]]];
        //array containing annotation information: latitude, longitude, title, subtitle(see PermitData.plist)
        NSArray *annotationsArray = [[NSArray alloc] initWithArray:[permitDict objectForKey:@"annotations"]];
        [permitDict release];
        [rootOfPermitDataPlistDict release];

        CLLocationCoordinate2D workingCoordinate;
        NSDictionary *annotationContainerDict = [[NSDictionary alloc] init];
        //loop through annotations array, creating parking annotations filled with the information found in the plist
        for(annotationContainerDict in annotationsArray){

            ParkingAnnotation *parkingAnnot = [[ParkingAnnotation alloc] init];
            workingCoordinate.latitude = [[annotationContainerDict objectForKey:@"latitude"] doubleValue];
            workingCoordinate.longitude = [[annotationContainerDict objectForKey:@"longitude"] doubleValue];
            [parkingAnnot setCoordinate:workingCoordinate];
            [parkingAnnot setTitle:[annotationContainerDict objectForKey:@"title"]];
            [parkingAnnot setSubtitle:[annotationContainerDict objectForKey:@"subtitle"]];

            if (permitType == permitTypeC) [parkingAnnot setAnnotationType:annotationTypeC];
            else if (permitType == permitTypeL) [parkingAnnot setAnnotationType:annotationTypeL];
            else if (permitType == permitTypeVisitor) [parkingAnnot setAnnotationType:annotationTypeVisitor];
            else if (permitType == permitTypeDisabled) [parkingAnnot setAnnotationType:annotationTypeDisabled];
            else if (permitType == permitTypeVendor) [parkingAnnot setAnnotationType:annotationTypeVendor];
            else if (permitType == permitTypeBikeCommuter) [parkingAnnot setAnnotationType:annotationTypeBikeCommuter];

            [mapView addAnnotation:parkingAnnot];
            [parkingAnnot release];
        }//for

        [annotationContainerDict release];
        [annotationsArray release];
    }//else
}//loadAnnotations


//helper function that loads all overlay data from Core Data and adds it to map view
-(void)loadOverlays{

    NSError *error;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    CoreDataSingleton *coreDataSingleton = [CoreDataSingleton sharedManager];
    NSEntityDescription *entity = [NSEntityDescription 
                                   entityForName:@"ParkingLot" inManagedObjectContext:[coreDataSingleton managedObjectContext]];
    [fetchRequest setEntity:entity];
    NSArray *fetchedObjects = [[coreDataSingleton managedObjectContext] executeFetchRequest:fetchRequest error:&error];
    for (NSManagedObject *info in fetchedObjects) {
        NSArray *pointsArray = [NSArray arrayWithArray:[info valueForKey:@"coordPoints"]];
        ParkingRegionOverlay *regionPolygon = [[ParkingRegionOverlay alloc] initWithPoints:pointsArray andTitle:[info valueForKey:@"lotId"]];
        [mapView addOverlay:regionPolygon];
    }        
    [fetchRequest release];

}//loadOverlays


//...


//customizes overlay view
- (MKOverlayView *)mapView:(MKMapView *)mapView 
            viewForOverlay:(id <MKOverlay>)overlay
{   
    if ([overlay isKindOfClass:[ParkingRegionOverlay class]])
    {
        //get the MKPolygon inside the ParkingRegionOverlay...
        MKPolygon *proPolygon = ((ParkingRegionOverlay*)overlay).polygon;

        MKPolygonView *aView = [[[MKPolygonView alloc] 
                                 initWithPolygon:proPolygon] autorelease];

        aView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.7];
        aView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.7];
        aView.lineWidth = 3;

        return aView;
    }
    return nil;
}




/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    //[mapView setShowsUserLocation:NO];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [mapView release];
    [super dealloc];
}


@end

这可能是loadOverlays功能中的内存问题。。。然而,所有的控制台输出都和它应该的一样,但是打印出了更多的坐标,并且应用程序从来不会因为分配了太多的对象或任何事情而崩溃。谢谢

您的代码一定有问题

在写这个问题之前,我做了一个由5000多个点组成的多边形

你为什么不发布一些代码呢

看看你的代码,我们肯定能找出哪里出了问题

这是一幅由数千个点组成的多个多边形的图像,通过查看多边形的复杂性,您可以看到这一点:

这里有一个具有更多多边形的:
您的代码一定有问题

在写这个问题之前,我做了一个由5000多个点组成的多边形

你为什么不发布一些代码呢

看看你的代码,我们肯定能找出哪里出了问题

这是一幅由数千个点组成的多个多边形的图像,通过查看多边形的复杂性,您可以看到这一点:

这里有一个具有更多多边形的:

请参考本帖中标记为答案的答案:

请参考本帖中标记为答案的答案:

谢谢您的回复!你在iOS设备上制作了一个由5000多个点组成的多边形?它出现在iOS模拟器上了吗?你可以尝试创建另一个5000点多边形,并在地图上的不同位置同时显示它们吗。很可能明天我会很乐意发布我的代码。我认为这是技术的局限性,但如果事实并非如此,我会非常高兴。我有几个多边形定义了墨西哥的一个州及其所有部门。总共必须超过15000分。我会用图片更新我的问题,这样你就可以看到了。谢谢你,看起来很棒!看来它还是管用的。。。不管怎样,我编辑了我的帖子,加入了我的代码。谢谢你的回复!你在iOS设备上制作了一个由5000多个点组成的多边形?它出现在iOS模拟器上了吗?你可以尝试创建另一个5000点多边形,并在地图上的不同位置同时显示它们吗。很可能明天我会很乐意发布我的代码。我认为这是技术的局限性,但如果事实并非如此,我会非常高兴。我有几个多边形定义了墨西哥的一个州及其所有部门。总共必须超过15000分。我会用图片更新我的问题,这样你就可以看到了。谢谢你,看起来很棒!看来它还是管用的。。。不管怎样,我编辑了我的文章,加入了我的代码。