iPhone MKMapView中的注释聚类

时间:2015-03-10 06:29:15

标签: ios objective-c iphone mkmapview

我想在MKMap中使用群集,但不使用第三方框架。 为此,我从https://developer.apple.com/library/ios/samplecode/PhotoMap/Introduction/Intro.html下载代码 但我发现,当我随机旋转和缩放地图时,它会卡住。如果您有任何其他演示,请帮助我。

2 个答案:

答案 0 :(得分:2)

我刚刚遇到了该示例代码中的问题。现有代码不适用于可以旋转的地图。

有两种情况会导致非常长或无限的循环。

  1. 如果将地图旋转180度,最终会出现mapView左侧的经度大于mapView右侧经度的情况。如果leftCoordinate大于rightCoordinate,则gridSize变为否定。在while循环中,我们将地图rect的原点增加gridSize,直到它大于endX / endY。但如果gridSize为负数,则原点实际上会变小,并且不会达到endX条件(没有算术下溢)。

  2. 如果你将地图旋转90度或270度,你将得到两个非常相似的经度,因此gridSize将非常小甚至为0,并且循环需要很长时间(或者如果是0永远)完成。

  3. 可以使用abs()上的gridSize修复第一个问题。第二个问题需要更改rightCoordinate的计算,因此它使用点bucketSize, bucketSize而不是bucketSize, 0。完成后,我们将当前的gridSize变量更改为gridSizeX,并引入使用MapPoints的.y部分的gridSizeY

    这是原始代码:

    // PhotoMapViewController.m, line 199+
    
    // determine how wide each bucket will be, as a MKMapRect square
    CLLocationCoordinate2D leftCoordinate = [self.mapView convertPoint:CGPointZero toCoordinateFromView:self.view];
    CLLocationCoordinate2D rightCoordinate = [self.mapView convertPoint:CGPointMake(bucketSize, 0) toCoordinateFromView:self.view];
    double gridSize = MKMapPointForCoordinate(rightCoordinate).x - MKMapPointForCoordinate(leftCoordinate).x;
    

    将替换为:

    // determine how wide each bucket will be, as a MKMapRect square
    CLLocationCoordinate2D leftCoordinate = [self.mapView convertPoint:CGPointZero toCoordinateFromView:self.view];
    CLLocationCoordinate2D rightCoordinate = [self.mapView convertPoint:CGPointMake(bucketSize, bucketSize) toCoordinateFromView:self.view];
    
    double gridSizeX = fabs(MKMapPointForCoordinate(rightCoordinate).x - MKMapPointForCoordinate(leftCoordinate).x);
    double gridSizeY = fabs(MKMapPointForCoordinate(rightCoordinate).y - MKMapPointForCoordinate(leftCoordinate).y);
    double gridSize = MAX(gridSizeX, gridSizeY);
    

答案 1 :(得分:0)

iOS MKMapView

上的

CCHMapClusterController

这可能会对你有所帮助:)。