BentoMap 0.3.3

BentoMap 0.3.3

LangLanguage SwiftSwift
License MIT
ReleasedLast Release Feb 2017
SwiftSwift Version 3.0
SPMSupports SPM

Maintained by Alex Rouse, Rob Visentin, RZAffirm, Michael Skiba, Raiz Labs, Rightpoint CI.

BentoMap 0.3.3


Map Clustering for Swift

BentoMap is an Swift implementation of quadtrees for map annotation clustering, and storage. It can also allow other 2d coordinate data to conform to a protocol and be added into BentoBox containers.

For more information, check out the Raizlabs Developer Blog. The Android equivalent, known as “Marker Clustering,” is documented here.



  • [x] Store annotation data in QuadTrees
  • [x] Fetch annotations in a region, with a clustering threshold
  • [x] Protocols for storing other data types


  • iOS 9.0+
  • Xcode 8.0



  1. Download all of the .swift files in BentoMap/ and BentoMap/Extensions/ and drop them into your project.
  2. Congratulations!

Usage example

To see a full implementation of loading data into a map view, check out the example project.

Inserting Data

import BentoMap

static var sampleData: QuadTree<Int, MKMapRect, MKMapPoint> {
    var samples = QuadTree<Int, MKMapRect, MKMapPoint>(bentoBox: BentoBox(minPoint: MKMapPointForCoordinate(CLLocationCoordinate2D.minCoord), maxPoint: MKMapPointForCoordinate(CLLocationCoordinate2D.maxCoord)), bucketCapacity: 5)
    let randomData = (1...5000).map { count in
        return QuadTreeNode(originCoordinate: MKMapPointForCoordinate(CLLocationCoordinate2D.randomCoordinate()), content: count)
    for node in randomData {
    return samples

Updating a Map View

func updateAnnotations(inMapView mapView: MKMapView,
                                 forMapRect root: MKMapRect) {
    guard !mapView.frame.isEmpty && !MKMapRectIsEmpty(root) else {
    let zoomScale = Double(mapView.frame.width) / root.size.width
    let clusterResults = mapData.clusteredDataWithinMapRect(root,
                                    zoomScale: zoomScale,
                                    cellSize: Double(MapKitViewController.cellSize))
    let newAnnotations =

    let oldAnnotations = mapView.annotations.flatMap({ $0 as? BaseAnnotation })

    let toRemove = oldAnnotations.filter { annotation in
        return !newAnnotations.contains { newAnnotation in
            return newAnnotation == annotation


    let toAdd = newAnnotations.filter { annotation in
        return !oldAnnotations.contains { oldAnnotation in
            return oldAnnotation == annotation



Issues and pull requests are welcome! Please ensure that you have the latest SwiftLint installed before committing and that there are no style warnings generated when building.

Contributors are expected to abide by the Contributor Covenant Code of Conduct.


BentoMap is available under the MIT license. See the LICENSE file for more info.