在我的地图中,我必须通过URL显示来自kml文件的注释。我还需要仅显示多边形或圆形区域内的注释(如果用户同时绘制了两个叠加层,则都需要显示这两个注释)。仅在叠加层内显示注释
我已经看到了问题How to determine if an annotation is inside of MKPolygonView (iOS),但我有两个困惑:
- 关于注释坐标,我应该用注释的坐标从
addAnnotation
方法? - 在上述问题中创建了一个新的叠加层,但我在其他地方创建了两个不同的叠加层。所以我的问题是:什么是最适合放这个代码(或类似的东西)的地方?
编辑:我已经创建了一些代码:
-(IBAction)showKmlData:(id)sender
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"KMLGenerator" ofType:@"kml"];
kml = [[KMLParser parseKMLAtPath:path] retain];
NSArray *annotationsImmut = [kml points];
//[mapview addAnnotations:annotations]; not anymore
NSMutableArray *annotations = [annotationsImmut mutableCopy];
[self filterAnnotations:annotations];
MKMapRect flyTo = MKMapRectNull;
for (id <MKAnnotation> annotation in annotations) {
MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0);
if (MKMapRectIsNull(flyTo)) {
flyTo = pointRect;
} else {
flyTo = MKMapRectUnion(flyTo, pointRect);
}
}
mapview.visibleMapRect = flyTo;
}
-(void)filterAnnotations:(NSMutableArray *)annotationsToFilter {
for (int i=0; i<[annotationsToFilter count]; i++) {
CLLocationCoordinate2D mapCoordinate = [[annotationsToFilter objectAtIndex:i] coordinate];
MKMapPoint mapPoint = MKMapPointForCoordinate(mapCoordinate);
MKPolygonView *polygonView =
(MKPolygonView *)[mapView viewForOverlay:polygonOverlay];
MKCircleView *circleView =
(MKCircleView *)[mapView viewForOverlay:circleOverlay];
CGPoint polygonViewPoint = [polygonView pointForMapPoint:mapPoint];
CGPoint circleViewPoint = [circleView pointForMapPoint:mapPoint];
BOOL mapCoordinateIsInPolygon =
CGPathContainsPoint(polygonView.path, NULL, polygonViewPoint, NO);
BOOL mapCoordinateIsInCircle =
CGPathContainsPoint(circleView.path, NULL, circleViewPoint, NO);
if(mapCoordinateIsInPolygon || mapCoordinateIsInCircle)
[annotationsToFilter removeObjectAtIndex:i];
}
[mapView addAnnotations:annotationsToFilter];
}
编辑NR 2这是我实现viewForOverlay委托method.I看到我创建的叠加层,圆形和多边形。我看到他们的所有annotations.ALL,这些内部和外部的覆盖...
-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id)overlay
{
MKCircleView* circleView = [[[MKCircleView alloc] initWithOverlay:overlay] autorelease];
circleOverlay = circleView;
circleView.fillColor = [UIColor blueColor];
circleView.strokeColor = [UIColor blueColor];
circleView.lineWidth = 5.0;
circleView.alpha = 0.20;
MKPolygonView *polygonView = [[[MKPolygonView alloc] initWithOverlay:overlay] autorelease];
polygonOverlay = polygonView;
polygonView.fillColor = [UIColor blueColor];
polygonView.strokeColor = [UIColor blueColor];
polygonView.lineWidth = 5.0;
polygonView.alpha = 0.20;
if ([overlay isKindOfClass:[MKCircle class]])
{
return circleView;
}
else
return polygonView;
}
因此,您添加了两个叠加层,并且您想要检查列表中的哪个坐标位于叠加层内?在链接的问题中,它不会创建新的叠加层 - 只需获取对现有叠加层视图的引用即可。 – Anna
哦,现在我明白了。但是注释怎么样? kml文件只返回注释,如何检查它们是否在覆盖内? – Hari
创建覆盖图,然后遍历kml中的坐标并为每个坐标执行该逻辑。尝试一下,如果有任何问题,请发布代码。 – Anna