Nous voulons afficher plusieurs marqueurs sur une carte statique et calculer le niveau de zoom optimal comme le fait Google Maps. Nous avons déjà calculé le rectangle de délimitation et le point central de la carte, mais nous avons maintenant du mal à calculer le niveau de zoom correct pour afficher tout le rectangle de délimitation. Quelqu'un peut-il nous indiquer la bonne direction?
google-maps
openstreetmap
tiles
extents
Tobias Schwarz
la source
la source
Réponses:
Pour obtenir le niveau de zoom, vous devez connaître les dimensions en pixels de votre carte. Vous devrez également faire vos calculs en coordonnées sphériques de mercator.
la source
Voici le code C # que j'utilise dans Maperitive :
mapArea
: cadre de délimitation en coordonnées long / lat (x = long, y = lat)paddingFactor
: ceci peut être utilisé pour obtenir l'effet "120%" auquel ThomM fait référence. Une valeur de 1,2 vous permettrait d'obtenir les 120%.Notez que dans mon cas, il
zoom
peut s'agir d'un nombre réel. Dans le cas des cartes Web, vous avez besoin d'une valeur de zoom entière, vous devez donc utiliser quelque chose comme(int)Math.Floor(zoom)
pour l'obtenir.Bien sûr, ce code ne s'applique qu'à la projection Web Mercator.
la source
GeometryUtils
est juste utilisé ici pour convertir des degrés en radians et inversement , c'est une formule mathématique simple.Bounds2
est fondamentalement juste une structure rectangulaire. Ce code a été fourni plus comme un pseudocode que comme quelque chose directement copiable-collable.Si vous utilisez OpenLayers, alors
Map.getZoomForExtent
calculera le niveau de zoom le plus élevé qui peut s'adapter à toute l'étendue sur la carte. Leextent
doit être dans la projection de la carte. Vous pouvez également utiliser unfill_factor
pour éviter d'afficher des points sur le bord de la carte etmax_zoom
pour limiter le zoom possible:la source