L'original de la réponse ci-dessous est obsolète depuis la version 1.2 du SDK, vous pouvez maintenant utiliser le fitBounds: méthode de la GMSCameraUpdate classe:
La MKMapPoint type dans MapKit définit une projection 2D d'une carte. Bien que les valeurs réelles de la projection sont destinés à être opaques, elles sont équivalentes à des pixels au niveau de zoom de 20. Ceci peut être utilisé pour convertir des coordonnées lat/lon valeurs de pixels, et donc une échelle, et donc un niveau de zoom.
Commencer par définir les deux endroits qui précisent les limites de la région que vous souhaitez afficher. Ceux-ci pourraient être à l'opposé des coins de la boîte englobante, ou simplement à deux endroits, par exemple:
Si vous avez plus de deux points que vous souhaitez inclure, vous pouvez calculer les limites d'eux-même. Cela peut aussi être fait en utilisant GMSCoordinateBounds, par exemple:
Mais qui ne fonctionne que si vous avez déjà créé la vue de la carte. Aussi, si vous utilisez l'exemple de code dans la guide de mise en route, l'image est réglée sur CGRectZero, comme la taille réelle sera fixée plus tard pour remplir l'écran. Dans ces cas, si vous êtes à la création d'un plein écran de la carte, alors vous pourriez vouloir quelque chose comme ceci:
Vous pouvez ensuite initialiser l'affichage de la carte avec l'appareil photo, ou de l'ensemble de la carte pour cet appareil photo.
Pour que ce code compile, vous aurez besoin d'ajouter les MapKit cadre de votre projet, et puis aussi l'importer:
#import <MapKit/MapKit.h>
Noter que ce code ne gère pas les wrap-around si vos coordonnées s'étendent à travers la ligne de changement de date. Par exemple, si vous avez essayé d'utiliser ce code avec Tokyo et à Hawaii, au lieu d'afficher une zone du Pacifique, il va essayer d'afficher presque tout le monde. En mode portrait, il n'est pas possible de faire un zoom assez loin pour voir Hawaii sur la gauche et de Tokyo sur le droit, et donc la carte se termine centré sur l'Afrique avec aucun emplacement visible. Vous pourriez modifier le code ci-dessus pour gérer le wrap-around à la ligne de changement de date, si vous vouliez.
Salut Saxon. Viens de lire cette réponse. Se peut-il que le bon zoomLevel est "double zoomLevel = 21.0 f + log2(mapScale);". Je viens examiné le maximum possible le niveau de zoom dans le GoogleMaps SDK et il me semble que c'est à 21,0 f; Par la manière dont le minimum le niveau de zoom est 2.0 f; Salut @xen100, le 20 est parce MKMapPoint est l'équivalent de pixels au niveau de zoom de 20. Si tes limites, était très petite, alors mapScale finirait supérieur à 1,0, et donc la zoomLevel finirait plus de 20. Si le niveau de zoom est plus grand que le SDK est limite, alors il serait de fixer le niveau de zoom est ce qu'il peut supporter. Merci. Cela m'a beaucoup aidé. Je voudrais vous suggérer de réduire l'affichage de la largeur et de la hauteur un peu si vous êtes de délimitation par les coordonnées de l'emplacement avec des marqueurs, ainsi que les marqueurs de ne pas être à la droite de votre point de vue. Bonne idée!
Tous les problèmes ont été corrigés dans la dernière version de Google maps (1.5). Méthode Standard [mapView_ animateWithCameraUpdate:[GMSCameraUpdate fitBounds:bounds]]; peut noow être utilisé à la place du code ci-dessous
RÉPONSE ORIGINALE À CETTE QUESTION
[GMSCameraUpdate fitBounds] ne pas donner des résultats précis dans ma version du SDK (1.2.0). Je suis à l'aide du code ci-dessous au lieu de cela. Les formules sont prises à partir de la Projection De Mercator. Le monde est latitudonally délimitée à 85 degrés comme par Google Documents.
J'ai un problème. comment puis-je obtenir "nord" , "ouest" , "sud" , "est" et "padding" ? Cela dépend de la région que vous souhaitez afficher En fait non, les questions n'ont pas été résolus. Je suis en utilisant Google Maps v1.7.2 et lorsque j'essaie d'utiliser le GMSCameraUpdate fitBounds méthode ne fonctionne pas. J'ai vu la carte zoomée tout le chemin pour voir l'ensemble de l'Amérique du Nord. La seule façon que je pouvais le faire fonctionner correctement est d'utiliser les animateWithBoundsNorth: la méthode ci-dessus.
Saxun Druce réponse est vraiment bon. Mais en plus, si vous voulez calculer un rayon à partir de n'importe quel emplacement, vous pouvez le faire avec le code suivant:
Si vous avez la latitude et la longitude de la "extrême-gauche" et "droite" coins de la carte google ,vous pouvez afficher les données de swift à l'aide de code ci-dessous
var region:GMSVisibleRegion = GMSVisibleRegion()
region.nearLeft = CLLocationCoordinate2DMake(nearleflat, nearleftlong)
region.farRight = CLLocationCoordinate2DMake(fareastlat,fareastlong)
let bounds = GMSCoordinateBounds(coordinate: region.nearLeft,coordinate: region.farRight)
let camera = googleMapView.cameraForBounds(bounds, insets:UIEdgeInsetsZero)
googleMapView.camera = camera;
Cette lien peut également être utile pour les choses liées.
Ceci m'aider sur swift. Mais je reçois les deux points près de l'écran, comment puis-je obtenir plus de centre deux points: nearLeft et farRight?. Merci pour votre aide! J'ai essayé beaucoup de choses en utilisant d'autres techniques
auto.marqueurs est un dictionnaire avec des marqueurs stockées par un code d'emplacement, de soi.currentLocation est un CLLocation2D, et l'auto.mapView est un GMSMapView.
Les maths ici est de vérifier si pour correspondre à la taille de la largeur ou de la hauteur, puis un calcul de la zoom basée sur le fait que x1 /pow(2, zoom1) = x2 /pow(2, zoom2)", conduisant à zoom2 = log2(x2 * pow(2, auto.mapView.de la caméra.zoom) /x1).
- (void)fitMarkers
{
if (2 > self.markers.count)
{
[self.mapView animateToCameraPosition:[GMSCameraPosition cameraWithTarget:self.currentLocation.coordinate zoom:kZoom]];
return;
}
NSArray* markers = self.markers.allValues;
GMSCoordinateBounds* markerBounds = [[GMSCoordinateBounds alloc] initWithCoordinate:((id<GMSMarker>)markers[0]).position andCoordinate:((id<GMSMarker>)markers[1]).position];
for (id<GMSMarker> marker in markers)
{
markerBounds = [markerBounds including:marker.position];
}
//get marker bounds in points
CGPoint markerBoundsTopLeft = [self.mapView.projection pointForCoordinate:CLLocationCoordinate2DMake(markerBounds.northEast.latitude, markerBounds.southWest.longitude)];
CGPoint markerBoundsBottomRight = [self.mapView.projection pointForCoordinate:CLLocationCoordinate2DMake(markerBounds.southWest.latitude, markerBounds.northEast.longitude)];
//get user location in points
CGPoint currentLocation = [self.mapView.projection pointForCoordinate:self.currentLocation.coordinate];
CGPoint markerBoundsCurrentLocationMaxDelta = CGPointMake(MAX(fabs(currentLocation.x - markerBoundsTopLeft.x), fabs(currentLocation.x - markerBoundsBottomRight.x)), MAX(fabs(currentLocation.y - markerBoundsTopLeft.y), fabs(currentLocation.y - markerBoundsBottomRight.y)));
//the marker bounds centered on self.currentLocation
CGSize centeredMarkerBoundsSize = CGSizeMake(2.0 * markerBoundsCurrentLocationMaxDelta.x, 2.0 * markerBoundsCurrentLocationMaxDelta.y);
//inset the view bounds to fit markers
CGSize insetViewBoundsSize = CGSizeMake(self.mapView.bounds.size.width - kMarkerSize /2.0 - kMarkerMargin, self.mapView.bounds.size.height - kMarkerSize /2.0 - kMarkerSize);
CGFloat x1;
CGFloat x2;
//decide which axis to calculate the zoom level with by comparing the width/height ratios
if (centeredMarkerBoundsSize.width /centeredMarkerBoundsSize.height > insetViewBoundsSize.width /insetViewBoundsSize.height)
{
x1 = centeredMarkerBoundsSize.width;
x2 = insetViewBoundsSize.width;
}
else
{
x1 = centeredMarkerBoundsSize.height;
x2 = insetViewBoundsSize.height;
}
CGFloat zoom = log2(x2 * pow(2, self.mapView.camera.zoom) /x1);
GMSCameraPosition* camera = [GMSCameraPosition cameraWithTarget:self.currentLocation.coordinate zoom:zoom];
[self.mapView animateToCameraPosition:camera];
}
Conformément à la nouvelle version de GoogleMaps sdk iOS 1.9.2,
Nous pouvons mettre en place à l'aide de position de la Caméra, le niveau de zoom, viewingAngle.
J'ai recherché dans les fichiers d'en-tête du cadre et ne se trouve que l'interface qui pourrait être utilisé pour le code suivant qui pourrait être un début. Le problème ici est que je ne peux pas trouver toutes les importations de GMSCoordinateBounds dans l'une des autres en-têtes donc je ne peux pas trouver un moyen d'afficher cette région dans GMSMapView.
En juin 2014, cette réponse est le moyen le plus simple pour effectuer une itération sur un tableau de marqueurs et ensuite fixer des limites en conséquence.
Mise à JOUR:
L'original de la réponse ci-dessous est obsolète depuis la version 1.2 du SDK, vous pouvez maintenant utiliser le
fitBounds:
méthode de laGMSCameraUpdate
classe:https://developers.google.com/maps/documentation/ios/reference/interface_g_m_s_camera_update
Réponse originale à cette question:
La
MKMapPoint
type dans MapKit définit une projection 2D d'une carte. Bien que les valeurs réelles de la projection sont destinés à être opaques, elles sont équivalentes à des pixels au niveau de zoom de 20. Ceci peut être utilisé pour convertir des coordonnées lat/lon valeurs de pixels, et donc une échelle, et donc un niveau de zoom.Commencer par définir les deux endroits qui précisent les limites de la région que vous souhaitez afficher. Ceux-ci pourraient être à l'opposé des coins de la boîte englobante, ou simplement à deux endroits, par exemple:
Si vous avez plus de deux points que vous souhaitez inclure, vous pouvez calculer les limites d'eux-même. Cela peut aussi être fait en utilisant
GMSCoordinateBounds
, par exemple:Ensuite, vous avez besoin pour obtenir la taille de l'affichage de la carte dans les points. Vous pouvez utiliser ceci:
Mais qui ne fonctionne que si vous avez déjà créé la vue de la carte. Aussi, si vous utilisez l'exemple de code dans la guide de mise en route, l'image est réglée sur
CGRectZero
, comme la taille réelle sera fixée plus tard pour remplir l'écran. Dans ces cas, si vous êtes à la création d'un plein écran de la carte, alors vous pourriez vouloir quelque chose comme ceci:Sinon, utilisez la taille qui vous êtes en train de créer votre plan avec vue.
Maintenant, vous avez l'info nécessaire pour calculer la position de la caméra:
Vous pouvez ensuite initialiser l'affichage de la carte avec l'appareil photo, ou de l'ensemble de la carte pour cet appareil photo.
Pour que ce code compile, vous aurez besoin d'ajouter les MapKit cadre de votre projet, et puis aussi l'importer:
Noter que ce code ne gère pas les wrap-around si vos coordonnées s'étendent à travers la ligne de changement de date. Par exemple, si vous avez essayé d'utiliser ce code avec Tokyo et à Hawaii, au lieu d'afficher une zone du Pacifique, il va essayer d'afficher presque tout le monde. En mode portrait, il n'est pas possible de faire un zoom assez loin pour voir Hawaii sur la gauche et de Tokyo sur le droit, et donc la carte se termine centré sur l'Afrique avec aucun emplacement visible. Vous pourriez modifier le code ci-dessus pour gérer le wrap-around à la ligne de changement de date, si vous vouliez.
Salut @xen100, le 20 est parce
MKMapPoint
est l'équivalent de pixels au niveau de zoom de 20. Si tes limites, était très petite, alorsmapScale
finirait supérieur à 1,0, et donc lazoomLevel
finirait plus de 20. Si le niveau de zoom est plus grand que le SDK est limite, alors il serait de fixer le niveau de zoom est ce qu'il peut supporter.Merci. Cela m'a beaucoup aidé. Je voudrais vous suggérer de réduire l'affichage de la largeur et de la hauteur un peu si vous êtes de délimitation par les coordonnées de l'emplacement avec des marqueurs, ainsi que les marqueurs de ne pas être à la droite de votre point de vue.
Bonne idée!
OriginalL'auteur Saxon Druce
Mise à JOUR
Tous les problèmes ont été corrigés dans la dernière version de Google maps (1.5). Méthode Standard
[mapView_ animateWithCameraUpdate:[GMSCameraUpdate fitBounds:bounds]];
peut noow être utilisé à la place du code ci-dessousRÉPONSE ORIGINALE À CETTE QUESTION
[GMSCameraUpdate fitBounds]
ne pas donner des résultats précis dans ma version du SDK (1.2.0). Je suis à l'aide du code ci-dessous au lieu de cela. Les formules sont prises à partir de la Projection De Mercator. Le monde est latitudonally délimitée à 85 degrés comme par Google Documents.Cela dépend de la région que vous souhaitez afficher
En fait non, les questions n'ont pas été résolus. Je suis en utilisant Google Maps v1.7.2 et lorsque j'essaie d'utiliser le GMSCameraUpdate fitBounds méthode ne fonctionne pas. J'ai vu la carte zoomée tout le chemin pour voir l'ensemble de l'Amérique du Nord. La seule façon que je pouvais le faire fonctionner correctement est d'utiliser les animateWithBoundsNorth: la méthode ci-dessus.
OriginalL'auteur Evgeny Tanhilevich
Saxun Druce réponse est vraiment bon. Mais en plus, si vous voulez calculer un rayon à partir de n'importe quel emplacement, vous pouvez le faire avec le code suivant:
Votre réponse est ce que je veux, mais pouvez-vous ajouter un peu plus d'explications à votre réponse?
OriginalL'auteur fellowworldcitizen
Si vous avez la latitude et la longitude de la "extrême-gauche" et "droite" coins de la carte google ,vous pouvez afficher les données de swift à l'aide de code ci-dessous
Cette lien peut également être utile pour les choses liées.
J'ai essayé beaucoup de choses en utilisant d'autres techniques
OriginalL'auteur Suraj K Thomas
Je suis actuellement à l'aide de cette méthode.
auto.marqueurs est un dictionnaire avec des marqueurs stockées par un code d'emplacement, de soi.currentLocation est un CLLocation2D, et l'auto.mapView est un GMSMapView.
Les maths ici est de vérifier si pour correspondre à la taille de la largeur ou de la hauteur, puis un calcul de la zoom basée sur le fait que x1 /pow(2, zoom1) = x2 /pow(2, zoom2)", conduisant à zoom2 = log2(x2 * pow(2, auto.mapView.de la caméra.zoom) /x1).
OriginalL'auteur Stefan Fisk
Conformément à la nouvelle version de GoogleMaps sdk iOS 1.9.2,
Nous pouvons mettre en place à l'aide de position de la Caméra, le niveau de zoom, viewingAngle.
Pour de Plus amples référence voir ce document PDF.
vous pouvez également définir minimum et maximum niveau de Zoom selon votre besoin:
Espère que cela résout le problème.
OriginalL'auteur adijazz91
J'ai recherché dans les fichiers d'en-tête du cadre et ne se trouve que l'interface qui pourrait être utilisé pour le code suivant qui pourrait être un début. Le problème ici est que je ne peux pas trouver toutes les importations de GMSCoordinateBounds dans l'une des autres en-têtes donc je ne peux pas trouver un moyen d'afficher cette région dans GMSMapView.
OriginalL'auteur Bohrnsen
En juin 2014, cette réponse est le moyen le plus simple pour effectuer une itération sur un tableau de marqueurs et ensuite fixer des limites en conséquence.
OriginalL'auteur friedbunny
//J'ai trouvé cette méthode qui a fonctionné pour moi
OriginalL'auteur iOS Developer