3

我无法让 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的它说它确实)。boundingMapRectMKMapPointsPerMeterAtLatitude

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


更新:

我现在意识到我正在尝试渲染多边形而不创建它们。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];

但是,现在mapView:rendererForOverlay根本不再被调用。

4

1 回答 1

4

在创建 的更新代码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函数中,第一个参数是latitude,然后是longitude


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

仅当叠加层(将根据给定坐标自动定义)位于地图的当前显示区域时,rendererForOverlay才会调用委托方法。但如果坐标无效或位置错误,则坐标也将无效。boundingMapRectMKPolygonboundingMapRect



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

  1. initWithModel方法不调用[super init](假设它是一个NSObject子类)。
  2. 计算boundingMapRect不正确。该MKMapRectMake函数接受MKMapPoint值,但代码以度为单位传递纬度和经度。AnMKMapPoint与 a 不同CLLocationCoordinate2D。您可以使用该函数将 a 转换CLLocationCoordinate2D为a。有关更多信息,请参阅文档中的MKMapPointForCoordinate 返回无效坐标地图坐标系。MKMapPointMKMapPointForCoordinate
于 2014-04-16T12:39:48.737 回答