iOS 7 - 使用MKOverlayRenderer在MapKit上绘制一组coords

时间:2013-12-09 00:45:38

标签: ios objective-c core-graphics mapkit

我正在尝试使用一组GPS坐标并使用自定义MKOverlay和MKOverlayRenderer将它们绘制到叠加层上。我无法得到要点。我知道可能没有必要这样做,但这是更复杂的叠加的第一步。

这里的overlayrenderer中的代码。 points数组包含保存我的MKMapPoint结构的NSValue对象。我已经确认那些MKMapPoints在for循环中是正确的。

-(instancetype)initWithOverlay:(Heatmap*)overlay {
    self = [super initWithOverlay:overlay];
    if (self){
        self.points = overlay.testCoordinates;
    }
    return self;
}

- (void)drawMapRect:(MKMapRect)mapRect
          zoomScale:(MKZoomScale)zoomScale
          inContext:(CGContextRef)context
{

    CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0);

    for (NSValue *point in self.points){
        MKMapPoint mapPoint;
        [point getValue:&mapPoint];
        CGPoint datpoint = [self pointForMapPoint:mapPoint];
        CGRect rect = CGRectMake(datpoint.x/zoomScale, datpoint.y/zoomScale, 1.0/zoomScale, 1.0/zoomScale);
        CGContextFillRect(context, rect);
    }

在我的MapView委托的视图控制器中:

- (void)viewDidLoad
{
    Heatmap *heatmap = [[Heatmap alloc] init];
    [self.mapView setVisibleMapRect:heatmap.boundingMapRect];
    [self.mapView addOverlay:heatmap];
}

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
    HeatmapOverlayRenderer *renderer = [[HeatmapOverlayRenderer alloc] initWithOverlay:overlay];
    return renderer;
}

正确设置boundingMapRect。所以app应该加载,我应该在屏幕边界内看到100个点。知道我可能有什么错吗?这对我来说都是新的。

1 个答案:

答案 0 :(得分:0)

drawMapRect中,这一行可能是点不显示的原因:

CGRect rect = CGRectMake(datpoint.x/zoomScale, datpoint.y/zoomScale, 
                           1.0/zoomScale, 1.0/zoomScale);

您可能不希望根据zoomScale更改点的rect的位置 基于缩放的rect的明显位置将由地图视图自动完成。

当前代码正在根据缩放更改地图上的绝对位置和大小 结果位置很可能不在地图上。

相反,绘制点的矩形而不进行任何缩放。

但是,要计算在CGPoints中使用的正确宽度(从米),您需要进行一些计算:

for (NSValue *point in self.points)
{
    MKMapPoint mapPoint;
    [point getValue:&mapPoint];

    CGPoint datpoint = [self pointForMapPoint:mapPoint];


    CLLocationDistance rectWidthMeters = 100000.0;
    //above sets rect width to 100 km, adjust as needed

    CLLocationCoordinate2D mpc = MKCoordinateForMapPoint(mapPoint);

    double rectWidthMapPoints = MKMapPointsPerMeterAtLatitude(mpc.latitude);

    MKMapPoint mpRight = 
      MKMapPointMake (mapPoint.x + (rectWidthMapPoints * rectWidthMeters), 
                      mapPoint.y);

    CGPoint datpointRight = [self pointForMapPoint:mpRight];

    CGFloat rectWidth = datpointRight.x - datpoint.x;


    CGRect rect = CGRectMake(datpoint.x, datpoint.y, rectWidth, rectWidth);

    CGContextFillRect(context, rect);
}

确保在适当的位置放大,以便看到正方形。


您可能有兴趣查看Apple's sample app HazardMap,其中展示了基于位置网格显示颜色编码的地震危险等级的相似内容。