Respostas:
Se você estiver projetando um mapa, planeja sobrepor sobre o Google Maps ou o Virtual Earth e criar um esquema de ladrilhos, então acho que o que você está procurando são as escalas para cada nível 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
Fonte: http://webhelp.esri.com/arcgisserver/9.3/java/index.htm#designing_overlay_gm_mve.htm
Encontrei esta resposta - escrita por um funcionário do Google - provavelmente seria a mais precisa:
Isso não será preciso, porque a resolução de um mapa com a projeção mercator (como o Google maps) depende da latitude.
É possível calcular usando esta fórmula:
metersPerPx = 156543.03392 * Math.cos(latLng.lat() * Math.PI / 180) / Math.pow(2, zoom)
Isso se baseia na suposição de que o raio da Terra é 6378137m. Qual é o valor que usamos :)
retirado de: https://groups.google.com/forum/#!topic/google-maps-js-api-v3/hDRO4oHVSeM
BTW - Estou supondo que:
'latLng.lat()' = map.getCenter.lat()
'zoom' = map.getZoom()
Para ajudar você a entender a matemática (não é um cálculo preciso, é apenas uma ilustração):
digamos que o monitor do seu computador tenha 100 pixels por polegada (PPI). Isso significa que 256 pixels têm aproximadamente 6,5 cm de comprimento. E isso é 0,065 m .
no nível de zoom 0 , os 360 graus de longitude são visíveis em um único bloco . Você não pode observar isso no Google Maps, pois ele se move automaticamente para o nível de zoom 1, mas pode ser visto no mapa do OpenStreetMap (ele usa o mesmo esquema de mosaicos).
360 graus no equador são iguais a circunferência da Terra, 40,075.16 km, que é 40.075.160 m
divida 40075160 m com 0,065 me você obterá 616313361 , que é uma escala de nível de zoom 0 no Equator para um monitor de computador com 100 DPI
Verifique também: http://wiki.openstreetmap.org/wiki/FAQ#What_is_the_map_scale_for_a_particular_zoom_loom_of_the_map.3F
591657550.500000
é o nível 0, de acordo com esta resposta. Mas, de acordo com @CaptDragon, é o nível 1. Devo considerar começar no nível 1 para calcular com o Google Maps?
Não tão fácil. Dada a projeção, o tamanho dos pixels do bloco depende da latitude da área em que você está interessado. Depois, em termos de transformação do tamanho do pixel do bloco no tamanho da tela, depende da tela e da resolução em que os dados são exibidos. dpi que sua tela está usando.
Resposta correta autoritativa direta:
591657550.500000 / 2^(level-1)
fornece a tabela acima, inserindo o nível de zoom.
Experimente ao vivo em jsfiddle.net
Como a pergunta é apenas para o Google MAPS, não para a TERRA, o OP não se importa com a geometria 3D. Os mapas do Google JÁ estão achatados, de modo que 1 pixel está sempre à mesma distância (em GRAUS, que é o que diz respeito a um mapa do Google), aqui e no ecuador como nos pólos.
A propósito, você percebeu que em algum lugar dentro da primeira linha de pixels do mapa de um mundo, a escala é de 1: 1?
Existe uma tabela na documentação do Virtal Earth Tile System da Microsoft . Mas, como disse GuillaumeC, os valores dependem da latitude e da resolução da tela. A tabela fornece os valores medidos no Equador e com uma resolução de tela de 96 dpi.
PS: Não tenho certeza disso, mas os níveis de zoom da Microsoft podem ser alterados em 1 em comparação com os níveis de zoom do Google. Mas eles definitivamente usam a mesma projeção para que os valores permaneçam corretos para o Google.
Raio @ Equador 6.378.137 metros exatos (WGS-84)
Circunferência no Equador = 40.075.017 metros (2πr)
O nível de zoom 24 usa 2 aos 32 pixels de potência (4.294.967.296) na circunferência.
Circunferência Equatorial / 2 32 = 0,009330692 metros por pixel
Unidade na latitude = (cosseno da latitude) X (unidade no equador)
O nível de zoom dobra cada incremento.
1 pé (Internacional) = 0,3048 metros
Editar
Bem, não é realmente uma pergunta legítima para começar. As proporções de escala são relativas aos documentos impressos e não às telas dos computadores. O que você precisa para que essas imagens sejam usadas com precisão é conhecer a dimensão de cada pixel e escalar a imagem de acordo com a sua sobreposição.
Então, de 15 a 20 anos atrás, alguém usava o WGS-84 como dados base. (note em uma postagem anterior, alguém usou o valor 40.075.160. Vi isso na Wikipedia alguns lugares e está incorreto. O valor correto é 40.075.017
Eles então pegaram e dividiram por um número inteiro de 32 bits. Essa é uma escolha lógica, pois fornece precisão global de cerca de um centímetro, o que é suficiente para imagens aéreas. Inteiros de 32 bits também são eficientes para armazenar e processar.
Por que esse nível 24 foi escolhido? Eu não sei, no entanto, como alguém aqui trabalhou 0 leva você a um bloco de 256 pixels para a Terra.
Agora, um exemplo de como usar os dados acima. Digamos que eu tenho uma imagem no nível de zoom 20 (o zoom que eles permitem atualmente) Tire 0,009330692 (Zoom 24 no equador) dobre para o zoom 23, novamente para o zoom 22, novamente para o zoom 22, novamente para o zoom 21 e uma última vez para o zoom 20 Agora você deve ter 0,149231071.
Agora vamos dizer que nossa imagem está na latitude 45. Pegue o cosseno disso (0,707106781) e multiplique-o pelos nossos 0,149231071 e ele fornecerá 0,105564729 metros. Esse é o comprimento e a altura de um pixel de uma imagem na latitude 45 no nível de zoom 20. Se você capturar na tela uma imagem de 1000 x 1000 pixels dessa área, a dimensão é de 105,56 metros quadrados. Se você quer pés dividir esse 0,3048
Quanto às fontes, eu essencialmente fiz engenharia reversa há cerca de 5 anos, a partir de várias informações e documentação que encontrei na web, incluindo sites de suporte a mapas do Google e MS.
Eu usei essa centena de tempo e sobrepondo-a com dados de pesquisa de campo, e isso sempre foi correto. Compare com qualquer uma das tabelas postadas aqui e os números corresponderão.
Apenas fiz alguns cálculos e obtive os seguintes resultados:
O Google Maps mostra uma régua de 1 km (canto inferior esquerdo do mapa) com 90 pixels de comprimento, no nível de zoom 13. O que significa o seguinte:
Supondo que a resolução da tela seja 96 dpi ou 36 dpcm, no nível de zoom 13, temos 0,4 km (de 36/90) em 1 cm, o que gera uma escala de mapa de 1: 40.000 para uma tela de 96 dpi.
Para várias operações na tela, o melhor é tomar 90px como base, pois todos os números serão arredondados em todos os níveis de zoom, ou seja,
e assim por diante.
Observe que essa é uma aproximação que deve funcionar mais ou menos bem em escalas menores, em vez de grandes.
(E o Google gosta de números redondos no final ...)
Com base em todas as informações fornecidas, criei uma função que fornece o melhor z aplicado a um mapa quando você deseja ter uma linha horizontal que representa N% do mapa exibido.
O mapa exibido é caracterizado por sua própria largura de pixel.
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);
}
Ainda não posso adicionar um comentário, mas esta é uma possível fonte da resposta de Pete acima: https://developers.google.com/maps/documentation/javascript/maptypes#MapCoordinates
[...] observe que cada nível de zoom crescente é duas vezes maior nas direções xey. Portanto, cada nível de zoom mais alto contém quatro vezes mais resolução que o nível anterior. Por exemplo, no nível de zoom 1, o mapa consiste em 4 blocos de 256x256 pixels, resultando em um espaço de pixel de 512x512. No nível de zoom 19, cada pixel xey no mapa pode ser referenciado usando um valor entre 0 e 256 * 2 19
Calculei as escalas para quatro níveis de zoom:
Nível de zoom | Escala 20 1: 500 19 1: 1000 18 1: 2000 17 1: 4000
Parece que a escala é dobrada à medida que o nível de zoom aumenta em um passo. Espero que a escala do nível de zoom 16 seja de 1: 8000 e assim por diante.
Olá, acho que calculei que 1 pixel = 11,627 km em linha reta; sem levar em consideração o raio da terra. Aqui está o link do vídeo que explica como: https://www.youtube.com/watch?v=Y3cvTeiMJqE&feature=youtu.be . Espero que isso esclareça sua mente.
Zoom level set meters: ${meters}
); var zoomfactor = 1; if (metros <1128) {zoomfactor = 15; } caso contrário, se ((metros> 1128) && (metros <2256)) {zoomfactor = 14; } caso contrário, se ((metros> 2256) && (metros <4513)) {zoomfactor = 13; } caso contrário, se ((metros> 4513) && (metros <9027)) {zoomfactor = 12; } senão se ((metros> 9027) && (metros <18055)) {zoomfactor = 11; } senão se ((metros> 18055) && (metros <36111)) {zoomfactor = 10; } else if ((metros> 36111) && (metros <72