Oblicz granice długości geograficznej dla pojedynczej płytki wygenerowanej z gdal2tiles

16

Mam wiele źródeł kafelków wygenerowanych za pomocą gdal2tiles, które chciałbym przedstawić na tej samej mapie. Dlatego podczas prezentacji kafelka muszę określić, z którego źródła go podawać, sprawdzając, czy nie ma granic.

Czy ktoś wie, jak obliczyć granice długości geograficznej dla pojedynczego kafelka w oparciu wyłącznie o zoom, x i y (ze struktury pliku wygenerowanej przez gdal2tiles)? BTW: Korzystam z Google Maps API v3 na wypadek potrzeby wywołania niektórych funkcji z API, aby pomóc w obliczeniach.

Powodem, dla którego ograniczam się do czystego powiększania, x i y, jest to, że kafelki są wywoływane nie tylko przez nakładkę na mapę, ale także niektóre niestandardowe funkcje drukowania, które umożliwiają drukowanie poza mapą.

Gavin
źródło

Odpowiedzi:

22

Matematyka jest opisana na:

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

… W tym kod źródłowy narzędzia wiersza poleceń i demonstracja online.

Jest to również dość prosta matematyka:

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

Zwróć uwagę na różnicę między XYZ / Google a TMS na osi y.

Google Maps API V3 daje wymaganych funkcji za pośrednictwem .fromPointToLatLng()o map.getProjection().

Petr Pridal
źródło
Próbuję zrozumieć powyższe rozwiązanie, ponieważ mam ten sam problem. Czy w powyższym rozwiązaniu powinienem 1. Najpierw przekonwertować x, y i powiększyć na lat / long za pomocą tile2long () i tile2lat (). 2. Użyj lat / long utworzonego w kroku, aby utworzyć granice? Jak mam to zrobić?
Vishal
@Petr Czy masz coś dla c ++?
Majid Hojati,
nie bierze pod uwagę rozmiaru płytki?
Muhammad Umer
@ petr-pridal To powoduje, że według mojej najlepszej wiedzy kafelek to obszar lub powierzchnia. Czy możesz podać kod ramki granicznej? Z góry dziękuję.
Herbert
Z tego artykułu gist.github.com/tmcw/4954720 TMS to te same kafelki, ale indeksowane do tyłu. Oto wzór przeliczeniowy: Math.floor (Math.pow (2, z) - y - 1)
Aggeusz
0

To jest mój działający kod:

jsfiddle próbka nakładki typu mapa obrazu google

jsfiddle kolejna próbka obrazu nakładki 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 dostaje bbox od numeru coodinate i powiększa

jak obliczyć powiększenie współrzędnych Google, konwersję, długość itd.

hoogw
źródło