Calcola i limiti lat lon per le singole tessere generate da gdal2tiles


16

Ho più fonti di tile generate usando gdal2tiles che vorrei presentare sulla stessa mappa. Quindi, quando presenti una tessera, devo determinare da quale fonte servirla, verificando i limiti.

Qualcuno sa come calcolare i limiti lat lon per una singola tessera basata esclusivamente su zoom, xey (dalla struttura del file generata da gdal2tiles)? A proposito: sto usando l'API di Google Maps v3 nel caso in cui sia necessario chiamare alcune funzionalità dall'API per aiutare con i calcoli.

Il motivo per cui sono limitato allo zoom, x e y è semplicemente perché i riquadri non vengono semplicemente richiamati da un overlay sulla mappa, ma anche alcune funzionalità di stampa personalizzate che consentono la stampa all'esterno della mappa.

Risposte:


22

La matematica è descritta a:

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

... incluso il codice sorgente per l'utilità della riga di comando e una dimostrazione online.

È anche una matematica piuttosto semplice:

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

Nota la differenza tra XYZ / Google vs TMS nell'asse y.

Google Maps API V3 ti dà le funzioni richieste anche via .fromPointToLatLng()di map.getProjection().


Sto solo cercando di capire la soluzione sopra perché ho lo stesso problema. Intendi nella soluzione sopra che dovrei 1. Innanzitutto converti x, y e ingrandisci in lat / long usando tile2long () e tile2lat (). 2. Utilizzare lat / long creato al passaggio per creare limiti? Come dovrei farlo?
Vishal,

@Petr Hai qualcosa per c ++?
Majid Hojati,

non tiene conto della dimensione delle piastrelle?
Muhammad Umer,

@ petr-pridal Ciò si traduce in un punto, per quanto ne so, una piastrella è un'area o una superficie. Potresti fornire il codice per un rettangolo di selezione? Grazie in anticipo.
Herbert,

Da questo articolo gist.github.com/tmcw/4954720 , TMS è lo stesso riquadro , ma indicizzato all'indietro. Questa è la formula di conversione: Math.floor (Math.pow (2, z) - y - 1)
Haggai


0

Questo è il mio codice di lavoro:

esempio jsfiddle della sovrapposizione del tipo di mappa immagine google

jsfiddle un altro esempio di immagine overlay di 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 ottiene bbox dal numero di coodinate e zoom

come calcolare lo zoom del numero di coordinate di google, convertire, lat lungo ecc ....

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.