Как установить границы для массива координат с картами Google sdk для iOS? Мне нужно масштабировать карту для 4 видимых маркеров.
Как установить границы для координатного массива с Google Maps sdk для iOS?
Ответ 1
Вот мое решение этой проблемы. Построение объекта GMSCoordinateBounds
по нескольким координатам.
- (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]];
}
Обновленный ответ: поскольку GMSMapView
маркеров GMSMapView
устарело, вы должны сохранить все маркеры в своем собственном массиве.
обновленный ответ swift 3:
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)
}
Ответ 2
Swift 3.0 версия ответа Lirik:
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))
}
}
И вот мой собственный путь:
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))
}
}
И вы можете вызвать мою функцию выше:
self.focusMapToShowMarkers(markers: [self.myLocationMarker, currentPokemonMarker])
Ответ 3
На данный момент Google наконец-то реализовал GMSCoordinateBounds, вы можете использовать его с помощью GMSCameraUpdate.
Подробнее см. официальное reference.
Ответ 4
Swift 5 версия ответа Лирика:
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)
}
}