Cocoa touch MKOverlay由多个点构成时不显示
我有很多点40-100,我用它来构建一个多边形,放置在我的应用程序的地图视图上。然而,当使用这么多点时,覆盖层拒绝显示,没有错误或任何东西。如果我切换回使用较少数量的点4-8,重叠将再次显示。原因是什么?我如何绕过这个问题?提前谢谢 编辑1: 以下是我的地图视图中的所有相关代码: 标题: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
#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分。我会用图片更新我的问题,这样你就可以看到了。谢谢你,看起来很棒!看来它还是管用的。。。不管怎样,我编辑了我的文章,加入了我的代码。