我有很多要点(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函数中的内存问题...但是所有控制台输出都应该是这样,但是打印出更多的坐标,并且应用程序永远不会因为分配的对象太多而崩溃。谢谢!
答案 0 :(得分:1)
您的代码一定有问题。
在写这个问题之前,我创建了一个由5,000 points
组成的多边形。
为什么不发布一些代码?
查看您的代码,我们一定能够找出问题所在。
以下是由数千个点组成的几个多边形的图像(您可以通过查看多边形的复杂性来看到这一点):
这是一个有更多多边形的人:
答案 1 :(得分:-1)
请参阅此帖中标记为答案的答案:Loading Annotations to Map View From Plist Not Working