Calcular limites de latitude para ladrilhos individuais gerados a partir de gdal2tiles

16

Eu tenho várias fontes de bloco geradas usando gdal2tiles que gostaria de apresentar no mesmo mapa. Portanto, ao apresentar um bloco, preciso determinar de qual fonte servir, verificando os limites.

Alguém sabe como calcular os limites posteriores para um único bloco baseado puramente em zoom, x e y (a partir da estrutura de arquivo gerada pelo gdal2tiles)? BTW: estou usando a API do Google Maps v3, caso seja necessário chamar algumas funcionalidades da API para ajudar nos cálculos.

O motivo pelo qual eu estou restrito ao zoom, xey é que os blocos não são apenas chamados por uma sobreposição no mapa, mas também por uma funcionalidade de impressão personalizada que permite imprimir fora do mapa.

Gavin
fonte

Respostas:

22

A matemática está descrita em:

http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/

… Incluindo o código fonte do utilitário de linha de comando e uma demonstração online.

Também é uma matemática bem simples:

function tile2long(x,z) { return (x/Math.pow(2,z)*360-180); }

function tile2lat(y,z) {
    var n=Math.PI-2*Math.PI*y/Math.pow(2,z);
    return (180/Math.PI*Math.atan(0.5*(Math.exp(n)-Math.exp(-n))));
}

Observe a diferença entre XYZ / Google vs TMS no eixo y.

A API do Google Maps V3 fornece as funções necessárias também por meio .fromPointToLatLng()de map.getProjection().

Petr Pridal
fonte
Estou apenas tentando entender a solução acima, pois tenho o mesmo problema. Você quer dizer na solução acima que devo 1. Primeiro converta x, ye zoom para lat / long usando tile2long () e tile2lat (). 2. Use lat / long criado na etapa para criar limites? Como devo fazer isso?
Vishal
@ Pet Você tem algo para c ++?
Majid Hojati
não leva em consideração o tamanho do bloco?
Muhammad Umer
@ petr-pridal Isso resulta em certo ponto, pelo que eu sei, um ladrilho é uma área ou superfície. Você poderia fornecer código para uma caixa delimitadora? Desde já, obrigado.
Herbert
Neste artigo , gist.github.com/tmcw/4954720 , o TMS é o mesmo bloco , mas indexado ao contrário. Esta é a fórmula de conversão: Math.floor (Math.pow (2, z) - y - 1)
Ageu
0

Este é o meu código de trabalho:

Exemplo jsfiddle de sobreposição de tipo de mapa de imagem do google

jsfiddle outro exemplo de imagem de sobreposição do google

function tile2long(x,z) {

  return (x/Math.pow(2,z)*360-180);

}





function tile2lat(y,z) {

  var n=Math.PI-2*Math.PI*y/Math.pow(2,z);

  return (180/Math.PI*Math.atan(0.5*(Math.exp(n)-Math.exp(-n))));

}





 var x = coord.x;

 var y = coord.y;

 var z = zoom;



 var NW_long = tile2long(x,z);



 var SW_long = tile2long(x,z);

 var SW_lat =  tile2lat(y+1,z);



 var NE_long = tile2long(x+1,z);

  var NE_lat =  tile2lat(y,z);







  var export_bbox = SW_long + ',' + SW_lat + ',' + NE_long + ',' + NE_lat;



     var url_param = '&format=png&size=256,256&transparent=true&f=image&bboxSR=4326&imageSR=4326';





   var url_layers =''





       var root_url = 'https://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer/export?bbox=';



     var tile_url = root_url + export_bbox + url_param + url_layers;

maptiler obter bbox a partir do número coodinate e zoom

como calcular o número de coordenadas do Google zoom, converter, lat long etc ....

hoogw
fonte