5 Stimmen

Probleme beim Hinzufügen von MKPolygon als Overlay zu einer MKMapView

Ey da, also wie der Titel sagt, ich habe eine schwierige Zeit ein MKPolygon als Overlay zu einem MKMapView hinzufügen. Hier ist der entsprechende Code:
ParkingMapViewContoller.h

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

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

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

-(void)loadAnnotations;
-(void)showCurrentLocationButtonTapped:(id)sender;

@end

ParkingMapViewController.m

//...
#import "ParkingRegionOverlay.h"
//...
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%@",self.title);

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

    /*MKMapPoint points[3] = {{38.53607,-121.765793}, {38.537606,-121.768379}, {38.53487,-121.770578}};
    MKPolygon *polygon = [MKPolygon polygonWithPoints:points count:3];*/

    ParkingRegionOverlay *polygon = [[ParkingRegionOverlay alloc] initialize];
    [mapView addOverlay:polygon];

    [self loadAnnotations];

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

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
    NSLog(@"in viewForOverlay!");

    if ([overlay isKindOfClass:[MKPolygon class]])

    {

        MKPolygonView*    aView = [[[MKPolygonView alloc] initWithPolygon:(MKPolygon*)overlay] autorelease];

        aView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.2];

        aView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.7];

        aView.lineWidth = 3;

        return aView;

    }
    return nil;
}
//...

ParkingRegionOverlay.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface ParkingRegionOverlay : NSObject <MKOverlay> {
    //CLLocationCoordinate2D origin;
    MKPolygon *polygon;

    //MKMapRect rect;
}

//@property (nonatomic) CLLocationCoordinate2D origin;
@property (nonatomic, retain) MKPolygon *polygon;

//@property (nonatomic) MKMapRect rect;

-(ParkingRegionOverlay*)initialize;
-(MKMapRect)boundingMapRect;
-(CLLocationCoordinate2D)coordinate;

@end

ParkingRegionOverlay.m

#import "ParkingRegionOverlay.h"

@implementation ParkingRegionOverlay

//@synthesize origin;
@synthesize polygon;

//@synthesize rect;

-(ParkingRegionOverlay*) initialize {
    MKMapPoint points[3] = {{38.53607,-121.765793}, {38.537606,-121.768379}, {38.53487,-121.770578}};
    polygon = [MKPolygon polygonWithPoints:points count:3];
    polygon.title = @"Some Polygon";
    return self;
}

- (MKMapRect)boundingMapRect{
    MKMapRect bounds = MKMapRectMake(-121.770578,38.537606,-121.770578-(-121.765793),38.537606-38.53487);
    return bounds;
}

- (CLLocationCoordinate2D)coordinate{
    return CLLocationCoordinate2DMake((38.537606-38.53487)/2, (-121.770578-(-121.765793))/2);
}

@end

Sie sehen, dass NSLog ich in der viewForOverlay: Methode stecken? Nun, dass nie zeigt sich in der Konsole, so dass diese Funktion nie aufgerufen wird. Irgendeine Idee, was falsch ist? Vielen Dank!

10voto

Das Hauptproblem besteht darin, dass der Code der Kartenansicht Breiten- und Längengradkoordinaten gibt, wo er MKMapPoints erwartet. Eine Erklärung des Unterschieds finden Sie unter "Understanding Map Geometry" in der Programmierungsleitfaden für die Ortskenntnis . Verwenden Sie die Funktion MKMapPointForCoordinate, um von Breiten-/Längenkoordinaten in einen MKMapPoint zu konvertieren.

Das zweite Problem ist, dass in viewForOverlay überprüft wird, ob das Overlay vom Typ MKPolygon ist. Ihre Overlay-Klasse ParkingRegionOverlay enthält ein MKPolygon-Objekt, ist aber selbst nicht vom Typ MKPolygon.

Um das Hauptproblem zu beheben, müssen Sie die Methoden initialize und boundingMapRect ändern:

-(id)init {
    if (self = [super init]) {
        MKMapPoint points[3];
        CLLocationCoordinate2D c1 = {38.53607,-121.765793};
        points[0] = MKMapPointForCoordinate(c1);
        CLLocationCoordinate2D c2 = {38.537606,-121.768379};
        points[1] = MKMapPointForCoordinate(c2);
        CLLocationCoordinate2D c3 = {38.53487,-121.770578};
        points[2] = MKMapPointForCoordinate(c3);

        polygon = [MKPolygon polygonWithPoints:points count:3];
        polygon.title = @"Some Polygon";
    }
    return self;
}

- (MKMapRect)boundingMapRect{
    CLLocationCoordinate2D corner1 = 
        CLLocationCoordinate2DMake(38.537606, -121.770578);
    MKMapPoint mp1 = MKMapPointForCoordinate(corner1);

    CLLocationCoordinate2D corner2 = 
        CLLocationCoordinate2DMake(38.53487, -121.765793);
    MKMapPoint mp2 = MKMapPointForCoordinate(corner2);

    MKMapRect bounds = 
        MKMapRectMake(mp1.x, mp1.y, (mp2.x-mp1.x), (mp2.y-mp1.y));

    return bounds;
}

Bitte beachten Sie übrigens, dass ich die Methode "initialize" in "init" geändert habe. Obwohl es nicht verhindert, dass das Polygon angezeigt wird, entspricht die Art und Weise, wie Sie die Initialisierung von ParkingRegionOverlay mit einer Methode namens "initialize" überschreiben und nicht [super init] aufrufen, nicht den Konventionen. (Entfernen Sie auch "initialize" aus der .h-Datei.)

Um das zweite Problem zu beheben, sollte die viewForOverlay-Methode wie folgt aussehen:

- (MKOverlayView *)mapView:(MKMapView *)mapView 
    viewForOverlay:(id <MKOverlay>)overlay
{
    NSLog(@"in viewForOverlay!");

    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.2];
        aView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.7];
        aView.lineWidth = 3;

        return aView;
    }
    return nil;
}

Ändern Sie schließlich den Code in viewDidLoad:

ParkingRegionOverlay *polygon = [[ParkingRegionOverlay alloc] init];
[mapView addOverlay:polygon];
[polygon release]; //don't forget this

0voto

justicepenny Punkte 1979

Ich habe den Eindruck, dass Sie vergessen haben, Ihren Delegierten einzustellen so etwas wie das

_mapView.delegate = self;

0voto

Mat Punkte 7528

Haben Sie das eingestellt?

yourMap.delegate=self;

Und was ist Ihr Ziel? 3.x oder 4.x?? Ich glaube, MKPolygon ist ab 4.0 verfügbar. Sie können versuchen, die Importklausel in Ihre Präfixdatei einzufügen:

#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#endif

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X