MKOverlayRenderer无法渲染

时间:2014-04-16 07:49:01

标签: ios mkmapview mkoverlay mkpolygon

我无法让MKPolygonRenderer出现在我的地图上。我有一个包含MapViewController的课程MKMapView,并在CustomMapOverlay上创建MKMapView个实例。

MapViewController.m:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.mapView.delegate = self;
    self.mapView.showsUserLocation = YES;
}

// ...

// Later, I retrieve some models and generate CustomMapOverlay instances from them...
for (Model *model in models) {
    CustomMapOverlay *customMapOverlay = [[CustomMapOverlay alloc] initWithModel:model];
    [self.mapView addOverlay:customMapOverlay];
}

// ...

// Implement MKMapViewDelegate protocol
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {
    MKPolygonRenderer *polygonRenderer = [[MKPolygonRenderer alloc] initWithOverlay:overlay];
    polygonRenderer.lineWidth = 2;
    polygonRenderer.strokeColor = [UIColor colorWithRed:0.0 green:0.5 blue:1.0 alpha:1.0];
    polygonRenderer.fillColor = [UIColor colorWithRed:0.0 green:0.5 blue:1.0 alpha:0.5];
    return polygonRenderer;
}

CustomMapOverlay.m:

@implementation CustomMapOverlay

// Required by MKOverlay protocol
@synthesize coordinate,
    boundingMapRect;

- (instancetype)initWithModel:(Model *)model {
    coordinate = CLLocationCoordinate2DMake(model.latitude, model.longitude);
    double radiusInPoints = MKMapPointsPerMeterAtLatitude(model.latitude) * model.radius;
    boundingMapRect = MKMapRectMake(model.latitude, model.longitude, radiusInPoints, radiusInPoints);
    return self;
}

@end

mapView:rendererForOverlay正在调用,并检查调试器中的overlay我在地图的当前屏幕边界内看到了coordinate,看起来是合理的{{ {1}}(虽然我不确定是什么&#34;映射点&#34;是,我相信boundingMapRect方法可以做它所说的那样。)

但是,地图上没有多边形。


更新

我现在意识到我试图在不创建多边形的情况下渲染多边形。而不是MKMapPointsPerMeterAtLatitude,我现在正在生成CustomMapOverlay这样的叠加层:

MKPolygon

但是,现在CLLocationCoordinate2D centerCoordinate = CLLocationCoordinate2DMake(model.latitude, model.longitude); MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(centerCoordinate, model.radius, model.radius); int numCoords = 4; CLLocationCoordinate2D *coords = malloc(sizeof(CLLocationCoordinate2D) * numCoords); coords[0] = CLLocationCoordinate2DMake((region.center.longitude - 0.5*region.span.longitudeDelta), (region.center.latitude + 0.5*region.span.latitudeDelta)); coords[1] = CLLocationCoordinate2DMake((region.center.longitude + 0.5*region.span.longitudeDelta), (region.center.latitude + 0.5*region.span.latitudeDelta)); coords[2] = CLLocationCoordinate2DMake((region.center.longitude + 0.5*region.span.longitudeDelta), (region.center.latitude - 0.5*region.span.latitudeDelta)); coords[3] = CLLocationCoordinate2DMake((region.center.longitude - 0.5*region.span.longitudeDelta), (region.center.latitude - 0.5*region.span.latitudeDelta)); MKPolygon *polygon = [MKPolygon polygonWithCoordinates:coords count:numCoords]; free(coords); [self.mapView addOverlay:polygon]; 已不再被调用了。

1 个答案:

答案 0 :(得分:3)

在创建MKPolygon的更新代码中,coords数组中的坐标是向后的。例如,这一行:

coords[0] = CLLocationCoordinate2DMake(
              (region.center.longitude - 0.5*region.span.longitudeDelta), 
              (region.center.latitude + 0.5*region.span.latitudeDelta));

应该是:

coords[0] = CLLocationCoordinate2DMake(
              (region.center.latitude + 0.5*region.span.latitudeDelta,
              (region.center.longitude - 0.5*region.span.longitudeDelta));

CLLocationCoordinate2DMake函数中,第一个参数是纬度,然后是经度


因为坐标是向后的,所以它们可能完全无效或位于错误的位置。

如果覆盖的rendererForOverlayboundingMapRect将根据给定的坐标自动定义)位于地图的当前显示区域,则MKPolygon委托方法才会被调用。但如果坐标无效或位置错误,boundingMapRect也将无效。


<小时/> 顺便说一句,在使用CustomMapOverlay的原始代码中,至少存在以下两个问题:

  1. initWithModel方法不会调用[super init](假设它是NSObject子类)。
  2. boundingMapRect未正确计算。 MKMapRectMake函数的值为MKMapPoint,但代码以度为单位传递纬度和经度。 MKMapPointCLLocationCoordinate2D不同。您可以使用CLLocationCoordinate2D功能将MKMapPoint转换为MKMapPointForCoordinate。有关详情,请参阅MKMapPointForCoordinate returning invalid coordinatesMap Coordinate Systems in the documentation