Calcule los límites de lat lon para los mosaicos individuales generados a partir de gdal2tiles

16

Tengo múltiples fuentes de mosaico generadas usando gdal2tiles que me gustaría presentar en el mismo mapa. Entonces, al presentar un mosaico, necesito determinar desde qué fuente servirlo, verificando los límites.

¿Alguien sabe cómo calcular los límites largos para un único mosaico basado únicamente en zoom, x e y (a partir de la estructura de archivos generada por gdal2tiles)? Por cierto: estoy usando Google Maps API v3 en caso de que sea necesario llamar a alguna funcionalidad de la API para ayudar con los cálculos.

La razón por la que estoy restringido a solo hacer zoom, x e y es porque los mosaicos no solo son llamados por una superposición en el mapa, sino también por una funcionalidad de impresión personalizada que permite imprimir fuera del mapa.

Gavin
fuente

Respuestas:

22

Las matemáticas se describen en:

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

... incluido el código fuente de la utilidad de línea de comandos y una demostración en línea.

También es matemática bastante simple:

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))));
}

Tenga en cuenta la diferencia entre XYZ / Google vs TMS en el eje y.

Google Maps API V3 también le brinda las funciones requeridas a través .fromPointToLatLng()de map.getProjection().

Petr Pridal
fuente
Solo estoy tratando de entender la solución anterior ya que tengo el mismo problema. ¿Quiere decir que en la solución anterior debería 1. Primero convertir x, y y hacer zoom a lat / long usando tile2long () y tile2lat (). 2. Utilice lat / long creado en el paso para crear límites? ¿Cómo debería hacerlo?
Vishal
@Petr ¿Tienes algo para c ++?
Majid Hojati
no tiene en cuenta el tamaño del azulejo?
Muhammad Umer
@ petr-pridal Esto resulta en un punto, que yo sepa, un mosaico es un área o superficie. ¿Podría proporcionar código para un cuadro delimitador? Gracias por adelantado.
Herbert
De este artículo gist.github.com/tmcw/4954720 , TMS es el mismo mosaico , pero indexado al revés. Esta es la fórmula de conversión: Math.floor (Math.pow (2, z) - y - 1)
Haggai
0

Este es mi código de trabajo:

jsfiddle muestra de superposición de tipo de mapa de imagen de google

jsfiddle otra muestra de imagen de superposición de 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 obtener bbox desde el número de coordenadas y hacer zoom

cómo calcular el número de coordenadas de Google zoom, convertir, lat largo, etc.

hoogw
fuente