我在定制MKOverlayView和标准MKPolygonView时,如果有多个叠加层添加到地图中,则会出现问题。
The overlay of Algeria at two double tap zoom level.
The overlay of Algeria at three double tap zoom level. Note the clipping.
一些观察结果:
就代码而言:这会将叠加层添加到NSMutableArray(borderOverlays),然后在其他位置访问以加载特定国家/地区ID的叠加层。 minX / minY / maxX / maxY是纬度/经度值; polygon是从ESRI shapefile构造的路径。
CLLocationCoordinate2D mbrMin = CLLocationCoordinate2DMake(minY, minX);
CLLocationCoordinate2D mbrMax = CLLocationCoordinate2DMake(maxY, maxX);
MKMapPoint minPoint = MKMapPointForCoordinate(mbrMin);
MKMapPoint maxPoint = MKMapPointForCoordinate(mbrMax);
MKMapSize size = MKMapSizeMake(maxPoint.x - minPoint.x, maxPoint.y - minPoint.y);
MKMapRect rect = MKMapRectMake(minPoint.x, minPoint.y, size.width, size.height);
if ( spans180 ) {
rect = MKMapRectMake(minPoint.x, minPoint.y, MKMapSizeWorld.width * 2, size.height);
}
CustomMKOverlay* overlay = [[CustomMKOverlay alloc] initWithPolygon:polygon withBoundingMapRect:rect];
[borderOverlays addObject:overlay];
通过以下方式将叠加层添加到地图中
[mapView addOverlay:overlay];
viewForOverlay:
- (MKOverlayView *)mapView:(MKMapView*)aMapView viewForOverlay:(id<MKOverlay>)overlay
{
if ( [overlay isKindOfClass:[CustomMKOverlay class]] ) {
/* Note: the behaviour if this chunk is not commented is the exact same as below.
CustomMKOverlayView* overlayView = [[[CustomMKOverlayView alloc] initWithOverlay:overlay withMapView:aMapView] autorelease];
[borderViews addObject:overlayView];
return overlayView; */
MKPolygonView* view = [[[MKPolygonView alloc] initWithPolygon:((CustomMKOverlay*)overlay).polygon] autorelease];
view.fillColor = [((CustomMKOverlay*)overlay).colour colorWithAlphaComponent:0.5f];
view.lineWidth = 5.0f;
view.strokeColor = [UIColor blackColor];
[borderViews addObject:view];
return view;
}
}
使用MKPolygonView时,没有绘图代码(显示示例)。但是,为了完成起见,这是我的自定义绘图代码,同样的问题也出现了。轮廓通常是绘制的 - 这实际上是调试绘图,它在覆盖的boundingMapRect周围绘制一个矩形并填充它而不会弄乱轮廓。
- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context
{
CustomMKOverlay* overlay = (CustomMKOverlay*)self.overlay;
CGRect clipRect = [self rectForMapRect:overlay.boundingMapRect];
CGContextAddRect(context, clipRect);
CGContextClip(context);
UIColor* colour = [UIColor redColor];
colour = [colour colorWithAlphaComponent:0.5f];
CGContextSetFillColorWithColor(context, [colour CGColor]);
CGRect fillRect = [self rectForMapRect:overlay.boundingMapRect];
CGContextFillRect(context, fillRect);
}
我只想说,在这一点上我有点难过 - 它几乎就像被加载的缩放平铺覆盖了叠加层一样。我已经倾倒了关于TileMap和HazardMap的各种示例,但由于我没有加载自己的地图图块,因此它们并没有太大帮助。
我可能错过了一些非常明显的东西。任何帮助,将不胜感激。如有必要,我很乐意提供更多代码/背景信息。
答案 0 :(得分:3)
罪魁祸首似乎是:
CLLocationCoordinate2D mbrMin = CLLocationCoordinate2DMake(minY, minX);
CLLocationCoordinate2D mbrMax = CLLocationCoordinate2DMake(maxY, maxX);
MKOverlays的边界矩形显然需要基于边界区域的西北/东南坐标,而不是西南/东北(这是ESRI shapefile存储其边界坐标的格式)。将违规代码更改为:
CLLocationCoordinate2D mbrMin = CLLocationCoordinate2DMake(maxY, minX);
CLLocationCoordinate2D mbrMax = CLLocationCoordinate2DMake(minY, maxX);
似乎可以解决缩放和奇怪轮廓异常的所有问题。我希望这有助于将来遇到这个问题的任何人(如果没有,我想听听它,因为这个解决方案对我有用)。
另外:如果有人可以指出任何说明这一点的文件,我希望看到它。