Основная проблема заключается в том, что код дает координаты широты / долготы вида карты, где он ожидает MKMapPoints. Объяснение различий см. В разделе «Понимание геометрии карты» в Руководстве по программированию для определения местоположения . Используйте функцию MKMapPointForCoordinate для преобразования координат широты / долготы в MKMapPoint.
Вторая проблема заключается в том, что в viewForOverlay он проверяет, имеет ли оверлей тип MKPolygon. Ваш оверлейный класс ParkingRegionOverlay содержит внутри себя объект MKPolygon, но не относится к типу MKPolygon.
Чтобы исправить основную проблему, вам нужно изменить методы initialize и boundingMapRect:
-(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;
}
Пожалуйста, обратите внимание, что я изменил метод "initialize" на "init". Хотя это не мешало отображению полигона, то, как вы переопределяете инициализацию ParkingRegionOverlay, используя метод с именем «initialize» и не вызываете [super init], не следует соглашению. (Также удалите «initialize» из файла .h.)
Чтобы устранить вторую проблему, метод viewForOverlay должен выглядеть следующим образом:
- (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;
}
Наконец, измените код в viewDidLoad:
ParkingRegionOverlay *polygon = [[ParkingRegionOverlay alloc] init];
[mapView addOverlay:polygon];
[polygon release]; //don't forget this