Display search results within a bounding box on a map
This example uses the Mapbox Maps SDK for iOS. Add the Maps SDK as a dependency using the Maps SDK installation instructions.
import UIKitimport CoreLocationimport MapboxMapsimport MapboxSearch class MapboxBoundingBoxController: MapsViewController {let searchEngine = CategorySearchEngine() let mapboxSFOfficeCoordinate = CLLocationCoordinate2D(latitude: 37.7911551, longitude: -122.3966103) var draggingRefreshTimer: Timer? var mapDraggingSubscription: MapboxMaps.Cancelable? let categoryName = "cafe" var shouldSkipNextCameraChangedUpdate = false override func viewDidAppear(_ animated: Bool) {super.viewDidAppear(animated) updateSearchResults(proximity: mapboxSFOfficeCoordinate) mapDraggingSubscription = mapView.mapboxMap.onEvery(.cameraChanged, handler: reloadResultsOnCameraChange(_:))} func updateSearchResults(proximity: CLLocationCoordinate2D? = nil, boundingBox: MapboxSearch.BoundingBox? = nil) {/// Configure RequestOptions to perform search near the Mapbox Office in San Francisco let requestOptions = SearchOptions(proximity: proximity, boundingBox: boundingBox) searchEngine.search(categoryName: categoryName, options: requestOptions) { response indo {let results = try response.get()self.showAnnotations(results: results)} catch {self.showError(error)}}} func reloadResultsOnCameraChange(_ event: Event) {draggingRefreshTimer?.invalidate()draggingRefreshTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(reloadResultInMapBounds), userInfo: nil, repeats: false)} @objcfunc reloadResultInMapBounds() {guard shouldSkipNextCameraChangedUpdate == false else {shouldSkipNextCameraChangedUpdate = falsereturn}let cameraOptions = CameraOptions(cameraState: mapView.mapboxMap.cameraState, anchor: nil)let cameraBounds = mapView.mapboxMap.coordinateBounds(for: cameraOptions) let boundingBox = MapboxSearch.BoundingBox(cameraBounds.southwest,cameraBounds.northeast)updateSearchResults(boundingBox: boundingBox)shouldSkipNextCameraChangedUpdate = true}}
import UIKitimport MapboxMapsimport MapboxSearchimport MapboxSearchUI class MapsSearchViewController: UIViewController {var searchController = MapboxSearchController()var mapView: MapView?var annotationManager: PointAnnotationManager? override func viewDidLoad() {super.viewDidLoad() // Search setupsearchController.delegate = selflet panelController = MapboxPanelController(rootViewController: searchController)addChild(panelController) // Map setuplet mapView = MapView(frame: view.bounds)mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]self.mapView = mapViewview.addSubview(mapView) annotationManager = mapView.annotations.makePointAnnotationManager()} func showResults(_ results: [SearchResult]) {let annotations = results.map { searchResult -> PointAnnotation invar annotation = PointAnnotation(coordinate: searchResult.coordinate)annotation.textField = searchResult.nameannotation.textOffset = [0, -2]annotation.textColor = ColorRepresentable(color: .red)annotation.image = .defaultreturn annotation} annotationManager?.syncAnnotations(annotations)if case let .point(point) = annotations.first?.feature.geometry {let options = CameraOptions(center: point.coordinates)mapView?.mapboxMap.setCamera(to: options)}}} extension MapsSearchViewController: SearchControllerDelegate {func categorySearchResultsReceived(results: [SearchResult]) {showResults(results)} func searchResultSelected(_ searchResult: SearchResult) {showResults([searchResult])} func userFavoriteSelected(_ userFavorite: FavoriteRecord) {showResults([userFavorite])}}