正如在 Pinsnap iPhone 应用程序中所见的那样。 REMarkerClusterer
受到 iPhone 上的 Apple 相册应用程序的启发,REMarkerClusterer
仿效它的行为,为分组和取消分组集群提供动画。
REMarkerClusterer
将根据标记与集群中心点的距离将标记分组到集群中。当一个标记被添加时,标记集群将在所有集群中找到一个位置,如果找不到,它将创建一个新的集群并包含标记。集群中的标记数量将显示在集群标记上。当地图视口改变时,REMarkerClusterer
将销毁视口中的集群并将它们重新分组到新的集群中。
-fobjc-arc
)在 Xcode 中构建并运行 REMarkerClustererExample
项目以查看 REMarkerClusterer
的实际效果。
REMarkerClusterer
需要 MapKit
和 CoreLocation
框架,所以你需要首先将这些框架包含到你的项目中。
现在框架已经链接,你只需要将 REMarkerClusterer
文件夹中的文件拖放到你的项目中,并在将使用它的类的顶部添加 #include "REMarkerClusterer.h"
。
// Add map view
//
self.mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
self.mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.mapView setRegion:MKCoordinateRegionMake(CLLocationCoordinate2DMake(37.786996, -97.440100), MKCoordinateSpanMake(30.03863, 30.03863)) animated:YES];
[self.view addSubview:self.mapView];
// Create clusterer, assign a map view and delegate (MKMapViewDelegate)
//
self.clusterer = [[REMarkerClusterer alloc] initWithMapView:self.mapView delegate:self];
// Set smaller grid size for an iPad
//
self.clusterer.gridSize = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone ? 25 : 20;
self.clusterer.clusterTitle = @"%i items";
// Populate with sample data
//
NSDictionary *data = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Points" ofType:@"plist"]];
[data[@"Points"] enumerateObjectsUsingBlock:^(NSDictionary *dictionary, NSUInteger idx, BOOL *stop) {
REMarker *marker = [[REMarker alloc] init];
marker.markerId = [dictionary[@"id"] integerValue];
marker.coordinate = CLLocationCoordinate2DMake([dictionary[@"latitude"] floatValue], [dictionary[@"longitude"] floatValue]);
marker.title = [NSString stringWithFormat:@"One item <id: %i>", idx];
marker.userInfo = @{ @"index": @(idx) };
[self.clusterer addMarker:marker];
}];
// Create clusters (without animations on view load)
//
[self.clusterer clusterize:NO];
// Zoom to show all clusters/markers on the map
//
[self.clusterer zoomToAnnotationsBounds:self.clusterer.markers];
Nicolas Yuste (@nicoyuste) Thomas Kollbach (@toto) Markus Emrich (@jaydee3)
Roman Efimov
部分基于 Xiaoxi Wu 的 MarkerClusterer Javascript 库(http://gmaps-utility-library-dev.googlecode.com)
REMarkerClusterer 遵循 MIT 许可证。
版权© 2011-2013 Roman Efimov。
特此授予任何人获取本软件及其相关文档文件(“软件”)副本的自由,并可不受限制地使用软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许向提供软件的人授权其进行上述行为,但前提是遵守以下条件
上述版权声明和此许可声明应包含在软件的任何副本或主要部分中。
软件按“原样”提供,不包括任何明示或暗示的保证,包括但不限于适销性、针对特定目的的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论这些责任源于合同、侵权或其他,无论是与本软件有关还是与使用或操作软件有关。