How to fit bounds for coordinate array with google maps sdk for iOS?

后端 未结 5 1408
我在风中等你
我在风中等你 2021-01-31 17:23

How to fit bounds for coordinate array with google maps sdk for iOS? I need to zoom map for 4 visible markers.

相关标签:
5条回答
  • 2021-01-31 17:34

    Swift 3.0 version of Lirik's answer:

    func focusMapToShowAllMarkers() {
        let myLocation: CLLocationCoordinate2D = self.markers.first!.position
        var bounds: GMSCoordinateBounds = GMSCoordinateBounds(coordinate: myLocation, coordinate: myLocation)
    
        for marker in self.markers {
            bounds = bounds.includingCoordinate(marker.position)
            self.mapView.animate(with: GMSCameraUpdate.fit(bounds, withPadding: 15.0))
        }
    }
    

    And here's my own way:

    func focusMapToShowMarkers(markers: [GMSMarker]) {
    
        guard let currentUserLocation = self.locationManager.location?.coordinate else {
            return
        }
    
        var bounds: GMSCoordinateBounds = GMSCoordinateBounds(coordinate: currentUserLocation,
                                                              coordinate: currentUserLocation)
    
        _ = markers.map {
            bounds = bounds.includingCoordinate($0.position)
            self.mapView.animate(with: GMSCameraUpdate.fit(bounds, withPadding: 15.0))
        }
    }
    

    And you can call my function above like so:

    self.focusMapToShowMarkers(markers: [self.myLocationMarker, currentPokemonMarker])

    0 讨论(0)
  • 2021-01-31 17:37

    For time being, Google has finally implemented the GMSCoordinateBounds, you can make use of it with GMSCameraUpdate.

    For details, please check the official reference.

    0 讨论(0)
  • 2021-01-31 17:45

    We can simplify this quite a bit, with code such as the following:

    extension Array where Element: GMSMarker {
      func encompassingCoordinateBounds() -> GMSCoordinateBounds {
        reduce(GMSCoordinateBounds(), { $0.includingCoordinate($1.position) })
      }
    }
    

    The call site would like:

    let markers = [GMSMarker]()
    let encompassingCoordinateBounds = markers.encompassingCoordinateBounds()
    
    0 讨论(0)
  • 2021-01-31 17:54

    Swift 5 version of Lirik's answer:

        func focusMapToShowAllMarkers() {
    
            if arrMarkers.count > 0 {
                let firstLocation = (arrMarkers.first!).position
                var bounds = GMSCoordinateBounds(coordinate: firstLocation, coordinate: firstLocation)
    
                for marker in arrMarkers {
                  bounds = bounds.includingCoordinate(marker.position)
                }
    
               let update = GMSCameraUpdate.fit(bounds, withPadding: CGFloat(15))
               self.mapView.animate(with: update)
            }
        }
    
    0 讨论(0)
  • 2021-01-31 17:55

    Here's my solution for this problem. Building a GMSCoordinateBounds object by multiple coordinates.

    - (void)focusMapToShowAllMarkers
    {       
        CLLocationCoordinate2D myLocation = ((GMSMarker *)_markers.firstObject).position;
        GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithCoordinate:myLocation coordinate:myLocation];
    
        for (GMSMarker *marker in _markers)
            bounds = [bounds includingCoordinate:marker.position];
    
        [_mapView animateWithCameraUpdate:[GMSCameraUpdate fitBounds:bounds withPadding:15.0f]];
    }
    

    Updated answer: Since GMSMapView markers property is deprecated, you should save all markers in your own array.

    updated swift 3 answer:

        func focusMapToShowAllMarkers() {
            let firstLocation = (markers.first as GMSMarker).position
            var bounds = GMSCoordinateBoundsWithCoordinate(firstLocation, coordinate: firstLocation)
    
            for marker in markers {
                bounds = bounds.includingCoordinate(marker.position)
            }
            let update = GMSCameraUpdate.fitBounds(bounds, withPadding: CGFloat(15))
            self.mapView.animate(cameraUpdate: update)
      }
    
    0 讨论(0)
提交回复
热议问题