Réponses:
Si vous concevez une carte que vous envisagez de superposer sur Google Maps ou sur Virtual Earth et créez un schéma de tuilage, je pense que ce que vous recherchez sont les échelles pour chaque niveau de zoom, utilisez ce qui suit:
20 : 1128.497220
19 : 2256.994440
18 : 4513.988880
17 : 9027.977761
16 : 18055.955520
15 : 36111.911040
14 : 72223.822090
13 : 144447.644200
12 : 288895.288400
11 : 577790.576700
10 : 1155581.153000
9 : 2311162.307000
8 : 4622324.614000
7 : 9244649.227000
6 : 18489298.450000
5 : 36978596.910000
4 : 73957193.820000
3 : 147914387.600000
2 : 295828775.300000
1 : 591657550.500000
Source: http://webhelp.esri.com/arcgisserver/9.3/java/index.htm#designing_overlay_gm_mve.htm
J'ai trouvé cette réponse - écrite par un employé de Google - ce serait probablement la plus précise:
Ce ne sera pas précis, car la résolution d'une carte avec la projection de mercator (comme Google maps) dépend de la latitude.
Il est possible de calculer en utilisant cette formule:
metersPerPx = 156543.03392 * Math.cos(latLng.lat() * Math.PI / 180) / Math.pow(2, zoom)
Ceci est basé sur l'hypothèse que le rayon de la Terre est de 6378137m. Quelle est la valeur que nous utilisons :)
extrait de: https://groups.google.com/forum/#!topic/google-maps-js-api-v3/hDRO4oHVSeM
BTW - Je devine que:
'latLng.lat()' = map.getCenter.lat()
'zoom' = map.getZoom()
Pour vous aider à comprendre les maths (pas un calcul précis, c'est juste pour l'illustration):
Disons que l'écran de votre ordinateur a 100 pixels par pouce (PPI). Cela signifie que 256 pixels font environ 6,5 cm de long. Et c'est 0,065 m .
au niveau de zoom 0 , les 360 degrés de longitude sont visibles dans une seule mosaïque . Vous ne pouvez pas l'observer dans Google Maps, car il passe automatiquement au niveau de zoom 1, mais vous pouvez le voir sur la carte d'OpenStreetMap (il utilise le même schéma de tuilage).
360 degrés sur l'équateur sont égaux à la circonférence de la Terre, 40 075,16 km, soit 40075160 m
divisez 40075160 m avec 0,065 m et vous obtiendrez 616313361 , qui correspond à une échelle de niveau de zoom 0 de l'équateur pour un écran d'ordinateur de 100 DPI
Consultez également: http://wiki.openstreetmap.org/wiki/FAQ#What_is_the_map_scale_for_a_particular_zoom_level_of_the_map.3F
591657550.500000
correspond au niveau 0 selon cette réponse. Mais selon @CaptDragon, c'est le niveau 1. Je devrais envisager de partir du niveau 1 pour calculer avec Google Maps?
Pas si simple. Étant donné la projection, la taille des pixels en mosaïque dépend de la latitude de la zone qui vous intéresse. Ensuite, en termes de transformation de la taille des pixels en mosaïque en taille de l'écran, elle dépend de l'écran et de la résolution d'affichage des données, de la dpi votre écran utilise.
Réponse correcte faisant autorité:
591657550.500000 / 2^(level-1)
il vous donne le tableau ci-dessus, en entrant le niveau de zoom.
Essayez-le en direct sur jsfiddle.net
Comme la question ne concerne que Google MAPS, pas la Terre, le PO ne s'intéresse pas à la géométrie 3D. Les cartes Google sont déjà aplaties, donc 1 pixel correspond toujours à la même distance (en degrés, ce qui concerne une carte google), ici et dans l'écuateur comme dans les pôles.
A propos, avez-vous réalisé que quelque part à l'intérieur de la première rangée de pixels d'une carte du monde, l'échelle est de 1: 1?
Il existe un tel tableau dans la documentation du système de tuiles Virtal Earth de Microsoft . Mais comme l'a dit GuillaumeC, les valeurs dépendent de la latitude et de la résolution de l'écran. Le tableau donne les valeurs mesurées à l'équateur et à une résolution d'écran de 96 dpi.
PS: Pas sûr, mais les niveaux de zoom de Microsoft pourraient être décalés de 1 par rapport aux niveaux de zoom de Google. Mais ils utilisent définitivement la même projection pour que les valeurs restent correctes pour Google.
Rayon @ Equateur 6.378.137 mètres exacts (WGS-84)
Circonférence à l'équateur = 40 075 017 mètres (2πr)
Le niveau de zoom 24 utilise 2 pixels de la puissance (32 294 967 296) par circonférence.
Circonférence équatoriale / 2 32 = 0,009330692 mètres par pixel
Unité à la latitude = (cosinus de latitude) X (unité à l'équateur)
Le niveau de zoom double chaque incrément.
1 pied (International) = 0,3048 mètre
Modifier
Eh bien, ce n’est pas vraiment une question légitime pour commencer. Les ratios d'échelle sont relatifs aux documents imprimés et non aux écrans d'ordinateur. Pour pouvoir utiliser ces images avec précision, vous devez connaître la dimension de chaque pixel, puis redimensionner l’image en fonction de la superposition.
Il y a 15 à 20 ans, quelqu'un a pris le WGS-84 comme base de données. (note dans un post précédent, quelqu'un a utilisé une valeur de 40 075 160 que j'ai déjà vue dans Wikipedia à quelques endroits et c'est incorrect. La valeur correcte est 40 075 017
Ils ont ensuite pris cela et divisé par un entier 32 bits. C'est un choix logique car il offre une précision globale d'environ un centimètre, ce qui est suffisant pour l'imagerie aérienne. Les entiers 32 bits sont également efficaces pour stocker et traiter.
Pourquoi ce niveau 24 a-t-il été choisi? Je ne sais pas, cependant, comme quelqu'un d'autre l'a expliqué, 0 vous ramène à une tuile de 256 pixels pour la Terre.
Maintenant, pour un exemple d'utilisation des données ci-dessus. Disons que j'ai une image au niveau de zoom 20 (zoomée comme ils vous le permettent actuellement). Prenez 0.009330692 (zoom 24 à l'équateur) doublez-le pour le zoom 23, encore pour le zoom 22, encore pour le zoom 21 et une dernière fois pour le zoom 20 Vous devriez maintenant avoir 0.149231071.
Supposons maintenant que notre image se trouve à la latitude 45. Prenez le cosinus de celui-ci (0,707106781) et multipliez-le par notre 0,149231071 pour obtenir 0,105564729 mètres. C'est la longueur et la hauteur d'un pixel d'une image à une latitude de 45 au niveau de zoom 20. Si vous capturez une image de 1 000 x 1 000 pixels de cette zone, la dimension est de 105,56 mètres carrés. Si vous voulez que les pieds divisent que 0.3048
En ce qui concerne les sources, je suis devenu ingénieur inversé il y a environ 5 ans à partir de diverses informations et de la documentation trouvées sur le Web, y compris les sites d’aide à la cartographie de Google et de MS.
J'ai utilisé cette centaine de fois et je l'ai superposé à des données d'enquête sur le terrain et cela a toujours été correct. Comparez-le aux tables affichées ici et les chiffres vont correspondre.
Je viens de faire quelques calculs et d’obtenir les résultats suivants:
Google Maps affiche une règle de 1 km (en bas à gauche de la carte) d'une longueur de 90 pixels, au niveau de zoom 13. Cela signifie que:
En supposant que la résolution de l'écran soit de 96 dpi ou 36 dpcm, au niveau de zoom 13, nous avons 0,4 km (sur 36/90) en 1cm, ce qui donne une échelle de carte de 1/40 000 pour un écran de 96 dpi.
Pour différentes opérations à l'écran, le mieux est de prendre 90px comme base, car tous les chiffres seront arrondis à tous les niveaux de zoom, c'est-à-dire
etc.
Notez qu’il s’agit d’une approximation qui devrait fonctionner plus ou moins bien sur de plus petites échelles que sur de grandes.
(Et Google aime les chiffres ronds à la fin ...)
Sur la base de toutes les informations fournies, j'ai construit une fonction qui donne le meilleur z appliqué à une carte lorsque vous souhaitez avoir une ligne horizontale qui représente N% de la carte affichée.
La carte affichée est caractérisée par sa propre largeur en pixels.
function calculateZoom(WidthPixel,Ratio,Lat,Length){
// from a segment Length (km),
// with size ratio of the segment expected on a map (70%),
// with a map WidthPixel width in pixels (100px),
// and a latitude (45°) we can get the best Zoom
// assume earth is a perfect ball with radius : 6,378,137m and
// circumference at the equator = 40,075,016.7 m
// The full world on google map is available in tiles of 256 px;
// it has a ratio of 156543.03392 (px/m).
// For Z = 0;
// pixel scale at the Lat_level is ( 156543,03392 * cos ( PI * (Lat/180) ))
// The map scale increases at the rate of square root of Z.
//
Length = Length *1000; //Length is in Km
var k = WidthPixel * 156543.03392 * Math.cos(Lat * Math.PI / 180); //k = circumference of the world at the Lat_level, for Z=0
var myZoom = Math.round( Math.log( (Ratio * k)/(Length*100) )/Math.LN2 );
myZoom = myZoom -1; // Z starts from 0 instead of 1
//console.log("calculateZoom: width "+WidthPixel+" Ratio "+Ratio+" Lat "+Lat+" length "+Length+" (m) calculated zoom "+ myZoom);
// not used but it could be useful for some: Part of the world size at the Lat
MapDim = k /Math.pow(2,myZoom);
//console.log("calculateZoom: size of the map at the Lat: "+MapDim + " meters.");
//console.log("calculateZoom: world circumference at the Lat: " +k+ " meters.");
return(myZoom);
}
Je ne peux pas encore ajouter de commentaire, mais voici une source possible de la réponse de Pete ci-dessus: https://developers.google.com/maps/documentation/javascript/maptypes#MapCoordinates
[...] notez que chaque niveau de zoom croissant est deux fois plus grand dans les directions x et y. Par conséquent, chaque niveau de zoom supérieur contient quatre fois plus de résolution que le niveau précédent. Par exemple, au niveau de zoom 1, la carte se compose de 4 mosaïques de 256 x 256 pixels, générant un espace de pixels de 512 x 512. Au niveau de zoom 19, chaque pixel x et y de la carte peut être référencé à l'aide d'une valeur comprise entre 0 et 256 * 2 19
J'ai calculé les échelles pour quatre niveaux de zoom:
Niveau de zoom | Échelle 20 1: 500 19 1: 1000 18 1: 2000 17 1: 4000
Il semble que l’échelle soit doublée lorsque le niveau de zoom augmente d’un cran. J'espère donc que l'échelle du niveau de zoom 16 sera de 1: 8000, etc.
Bonjour, je pense avoir calculé que 1 pixel = 11,627 km en ligne droite; en ne tenant pas compte du rayon de la terre. Voici le lien de la vidéo qui explique comment: https://www.youtube.com/watch?v=Y3cvTeiMJqE&feature=youtu.be . J'espère que cela efface votre esprit.
Zoom level set meters: ${meters}
); var zoomfactor = 1; si (mètres <1128) {zoomfactor = 15; } else if ((mètres> 1128) && (mètres <2256)) {zoomfactor = 14; } else if ((mètres> 2256) && (mètres <4513)) {zoomfactor = 13; } else if ((mètres> 4513) && (mètres <9027)) {zoomfactor = 12; } else if ((mètres> 9027) && (mètres <18055)) {zoomfactor = 11; } else if ((mètres> 18055) && (mètres <36111)) {zoomfactor = 10; } else if ((mètres> 36111) && (mètres <72