Respuestas:
Si está diseñando un mapa que planea superponer sobre google maps o virtual earth y está creando un esquema de mosaico, entonces creo que lo que está buscando son las escalas para cada nivel de zoom, use estas:
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
Fuente: http://webhelp.esri.com/arcgisserver/9.3/java/index.htm#designing_overlay_gm_mve.htm
Encontré esta respuesta, escrita por un empleado de Google, esta probablemente sería la más precisa:
Esto no será exacto, porque la resolución de un mapa con la proyección de mercator (como los mapas de Google) depende de la latitud.
Es posible calcular usando esta fórmula:
metersPerPx = 156543.03392 * Math.cos(latLng.lat() * Math.PI / 180) / Math.pow(2, zoom)
Esto se basa en la suposición de que el radio de la Tierra es de 6378137 m. ¿Cuál es el valor que usamos :)
tomado de: https://groups.google.com/forum/#!topic/google-maps-js-api-v3/hDRO4oHVSeM
Por cierto, supongo que:
'latLng.lat()' = map.getCenter.lat()
'zoom' = map.getZoom()
Para ayudarlo a comprender las matemáticas (no es un cálculo preciso, es solo para ilustración):
Digamos que el monitor de su computadora tiene 100 píxeles por pulgada (PPI). Eso significa que 256 píxeles tienen aproximadamente 6.5 cm de longitud. Y eso es 0.065 m .
en el nivel de zoom 0 , los 360 grados completos de longitud son visibles en un solo mosaico . No puede observar esto en Google Maps, ya que se mueve automáticamente al nivel de zoom 1, pero puede verlo en el mapa de OpenStreetMap (usa el mismo esquema de mosaico).
360 grados en el ecuador son iguales a la circunferencia de la Tierra, 40,075.16 km, que es 40075160 m
dividir 40075160 m con 0,065 m y obtendrá 616 313 361 , que es una escala de nivel de zoom 0 en el ecuador de un monitor de ordenador con 100 DPI
Consulte también: http://wiki.openstreetmap.org/wiki/FAQ#What_is_the_map_scale_for_a_particular_zoom_level_of_the_map.3F
591657550.500000
es el Nivel 0 de acuerdo con esta respuesta. Pero según @CaptDragon es el Nivel 1. ¿Debería considerar comenzar desde el nivel 1 para calcular con Google Maps?
No tan fácil. Dada la proyección, el tamaño de los píxeles del mosaico depende de la latitud del área que le interesa. Luego, en términos de transformación del tamaño del píxel del mosaico en el tamaño del píxel de la pantalla, depende de la pantalla y de la resolución que se muestren los datos, dpi que está usando su pantalla.
Respuesta correcta autoritaria directa:
591657550.500000 / 2^(level-1)
le da la tabla de arriba, ingresando el nivel de zoom.
Pruébalo en vivo en jsfiddle.net
Debido a que la pregunta es solo para Google MAPS, no para EARTH, al OP no le importa la geometría 3D. Los mapas de Google ya están aplanados, por lo que 1 píxel es siempre la misma distancia (en GRADOS, que es lo que concierne a un mapa de Google), aquí y en el ecuador como en los polos.
Por cierto, ¿Te diste cuenta de que en algún lugar dentro de la primera fila de píxeles del mapa de un mundo, la escala es 1: 1?
Existe una tabla de este tipo en la documentación del Sistema Virtal Earth Tile de Microsoft . Pero como dijo GuillaumeC, los valores dependen de la latitud y de la resolución de la pantalla. La tabla proporciona valores medidos en el ecuador y con una resolución de pantalla de 96 ppp.
PD: No estoy seguro de eso, pero los niveles de zoom de Microsoft podrían cambiar en 1 en comparación con los niveles de zoom de Google. Pero definitivamente usan la misma proyección para que los valores sigan siendo correctos para Google.
Radio @ ecuador 6.378.137 metros exactos (WGS-84)
Circunferencia en el ecuador = 40,075,017 metros (2πr)
El nivel de zoom 24 usa de 2 a 32 píxeles de potencia (4,294,967,296) en la circunferencia.
Circunferencia ecuatorial / 2 32 = .009330692 metros por píxel
Unidad en latitud = (Coseno de latitud) X (Unidad en el ecuador)
El nivel de zoom duplica cada incremento.
1 pie (internacional) = 0.3048 metros
Editar
Bueno, no es realmente una pregunta legítima para empezar. Las proporciones de escala son relativas a documentos impresos, no a pantallas de computadora. Lo que necesita para que estas imágenes se utilicen con precisión es conocer la dimensión de cada píxel y luego escalar la imagen de acuerdo con la superposición.
Entonces, hace 15-20 años, alguien tomó WGS-84 como datos base. (tenga en cuenta que en una publicación anterior alguien usó un valor de 40,075,160. He visto esto en Wikipedia en algunos lugares y es incorrecto. El valor correcto es 40,075,017
Luego tomaron eso y lo dividieron por un entero de 32 bits. Esta es una opción lógica, ya que proporciona una precisión global de aproximadamente un centímetro, lo que es suficiente para las imágenes aéreas. Los enteros de 32 bits también son eficientes para almacenar y procesar.
No sé por qué se eligió este nivel 24, sin embargo, ya que alguien más aquí resolvió 0, lo lleva a un mosaico de 256 píxeles para la tierra.
Ahora para un ejemplo de cómo usar los datos anteriores. Digamos que tengo una imagen en el nivel de zoom 20 (con el zoom que actualmente le permiten obtener) Tome 0.009330692 (Zoom 24 en el ecuador) duplíquelo para el zoom 23, nuevamente para el zoom 22, nuevamente para el zoom 21 y una última vez para el zoom 20 Ahora debería tener 0.149231071.
Ahora digamos que nuestra imagen está en la latitud 45. Tome el coseno de eso (0.707106781) y multiplíquelo por nuestro 0.149231071 y le dará 0.105564729 metros. Esa es la longitud y la altura de un píxel de una imagen en la latitud 45 en el nivel de zoom 20. Si captura en pantalla una imagen de 1000 x 1000 píxeles de esa área, la dimensión es de 105.56 metros cuadrados. Si quieres pies divide eso 0.3048
En cuanto a las fuentes, hace aproximadamente 5 años, hice un ingeniero inverso esencial a partir de varios datos y documentación que encontré en la web, incluidos los sitios de soporte de mapeo de Google y MS.
He utilizado este tiempo cientos de veces y superponiéndolo con datos de encuestas de campo y siempre ha sido correcto. Compárelo con cualquiera de las tablas publicadas aquí y los números coincidirán.
Solo hice algunos cálculos y obtuve los siguientes resultados:
Google Maps muestra una regla de 1 km (parte inferior izquierda del mapa) que tiene una longitud de 90 píxeles, con un nivel de zoom 13. Lo que significa lo siguiente:
Suponiendo que la resolución de la pantalla es de 96 ppp o 36 dpcm, en el nivel de zoom 13 tenemos 0,4 km (de 36/90) en 1 cm, lo que produce una escala de mapa de 1: 40,000 para una pantalla de 96 ppp.
Para varias operaciones en la pantalla, lo mejor es tomar 90px como base, ya que todos los números serán redondos en todos los niveles de zoom, es decir
y así.
Tenga en cuenta que esta es una aproximación que debería funcionar más o menos bien en escalas más pequeñas en lugar de grandes.
(Y a Google le gustan los números redondos al final ...)
En función de toda la información proporcionada, he creado una función que ofrece la mejor z aplicada a un mapa cuando desea tener una línea horizontal que represente el N% del mapa mostrado.
El mapa mostrado se caracteriza por su propio ancho de píxel.
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);
}
Todavía no puedo agregar un comentario, pero esta es una posible fuente de la respuesta de Pete anterior: https://developers.google.com/maps/documentation/javascript/maptypes#MapCoordinates
[...] tenga en cuenta que cada nivel de zoom creciente es dos veces mayor en las direcciones x e y. Por lo tanto, cada nivel de zoom más alto contiene cuatro veces más resolución que el nivel anterior. Por ejemplo, en el nivel de zoom 1, el mapa consta de 4 mosaicos de 256x256 píxeles, lo que da como resultado un espacio de píxeles de 512x512. En el nivel de zoom 19, se puede hacer referencia a cada píxel x e y del mapa utilizando un valor entre 0 y 256 * 2 19
Calculé las escalas para cuatro niveles de zoom:
Nivel de zoom | Escala 20 1: 500 19 1: 1000 18 1: 2000 17 1: 4000
Parece que la escala se duplica a medida que el nivel de zoom aumenta en un paso. Entonces, espero que la escala para el nivel de zoom 16 sea 1: 8000 y así sucesivamente.
Hola, creo que he calculado que 1 píxel = 11.627 km en línea recta; sin tener en cuenta el radio de la tierra. Aquí el enlace del video que explica cómo: https://www.youtube.com/watch?v=Y3cvTeiMJqE&feature=youtu.be . Espero que te aclare la mente.
Zoom level set meters: ${meters}
); var zoomfactor = 1; if (metros <1128) {zoomfactor = 15; } else if ((metros> 1128) && (metros <2256)) {zoomfactor = 14; } else if ((metros> 2256) && (metros <4513)) {zoomfactor = 13; } else if ((metros> 4513) && (metros <9027)) {zoomfactor = 12; } else if ((metros> 9027) && (metros <18055)) {zoomfactor = 11; } else if ((metros> 18055) && (metros <36111)) {zoomfactor = 10; } else if ((metros> 36111) && (metros <72