Dadas estas condições:
- uma escala como
1:50000
- o centro da janela é
100°E, 20°N
- o tamanho da viewport é
400x600
Como posso calcular a caixa delimitadora da janela de exibição?
O sistema de coordenadas geográficas do mapa é EPSG: 4490.
Queremos exibi-los em uma projeção diferente, como Mercator ou latitude_longitude_projection (talvez este seja o chamado não-projetado).
O tamanho da janela de exibição está em pixels.
android
scale
resolution
giser
fonte
fonte
Respostas:
Ok, com alguns problemas iniciais resolvidos, a tarefa é relativamente simples.
Escala, representada como f.ex 1: 50000, significa que uma unidade no mapa corresponde a 50.000 unidades no mundo real.
Para um mapa em papel impresso em uma escala de 1: 50000, isso significa que 1 metro no mapa corresponde a 50.000 metros no mundo real, ou para facilitar: 1 cm no mapa corresponde a 50 metros no mundo real. Por enquanto, tudo bem.
Quando o computador (ou a tela do telefone) entra no programa, é muito mais difícil: a unidade de medida na tela é um pixel, que não é mapeado diretamente em centímetros. Os OpenLayers estão (ou pelo menos onde) usando os "Pontos por polegada" e assumem que uma polegada corresponde a 72 pixels (isso faz algum sentido em telas de 72 dpi, mas está errado em, por exemplo, Retina Displays. Mas, por enquanto, vamos nos ater ao 72 dpi (como é o que a maioria das bibliotecas de mapeamento faz (acho, as correções são bem-vindas)).
OpenLayers tem uma função OpenLayers.Util.getResolutionFromScale (consulte a fonte ):
Com units = "degrees" (que é EPSG: 4490, pelo que eu deduzo), obtemos inches_per unit = 4374754 (OpenLayers.INCHES_PER_UNIT ["degrees"])
uma escala de 1: 50000 (que corresponde a 1/50000 = 0,00002) (é o que penLayers.Util.normalizeScale calcula) fornece normScale = 0,00002
Podemos então calcular a resolução como
Sabendo o ponto central (lon = 100, lat = 30), o tamanho de pixel da viewport (w = 400, h = 600) e a resolução, podemos usar a função calculBounds do OpenLayers.Map (consulte a fonte ):
que podemos reduzir para:
Chamar isso com nossos valores fornece:
Podemos então combinar tudo isso a uma função que funciona em graus com denominador de escala, dado:
fonte
dpi
valor. Não é?