Berechnen Sie die Lat-Lon-Grenzen für einzelne Kacheln, die aus gdal2tiles generiert wurden

16

Ich habe mehrere Kachelquellen mit gdal2tiles generiert, die ich auf derselben Karte präsentieren möchte. Wenn ich also eine Kachel präsentiere, muss ich anhand der Grenzen feststellen, von welcher Quelle sie geliefert werden soll.

Weiß jemand, wie man die Lat-Lon-Grenzen für eine einzelne Kachel berechnet, die nur auf Zoom, X und Y basiert (aus der von gdal2tiles generierten Dateistruktur)? Übrigens: Ich verwende Google Maps API v3, falls Funktionen über die API aufgerufen werden müssen, um Berechnungen durchzuführen.

Der Grund, warum ich mich nur auf Zoom, X und Y beschränke, ist, dass die Kacheln nicht nur durch ein Overlay auf der Karte aufgerufen werden, sondern auch durch einige benutzerdefinierte Druckfunktionen, die das Drucken außerhalb der Karte ermöglichen.

Gavin
quelle

Antworten:

22

Die Mathematik ist beschrieben unter:

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

… Einschließlich des Quellcodes für das Befehlszeilendienstprogramm und einer Online-Demonstration.

Es ist auch ziemlich einfach Mathe:

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

Beachten Sie den Unterschied zwischen XYZ / Google und TMS auf der y-Achse.

Mit Google Maps API V3 erhalten Sie auch die erforderlichen Funktionen über .fromPointToLatLng()von map.getProjection().

Petr Pridal
quelle
Ich versuche nur, die obige Lösung zu verstehen, da ich das gleiche Problem habe. Meinen Sie in der obigen Lösung, dass ich 1. Zuerst x, y konvertieren und mit tile2long () und tile2lat () nach lat / long zoomen sollte. 2. Verwenden Sie lat / long, das in step erstellt wurde, um Grenzen zu erstellen? Wie soll ich das machen
Vishal
@Petr Hast du was für c ++?
Majid Hojati
Berücksichtigt es nicht die Fliesengröße?
Muhammad Umer
@ petr-pridal Daraus ergibt sich nach meiner Kenntnis ein Punkt, bei dem eine Fliese eine Fläche oder Oberfläche ist. Könnten Sie Code für einen Begrenzungsrahmen bereitstellen? Danke im Voraus.
Herbert
Aus diesem Artikel gist.github.com/tmcw/4954720 geht hervor , dass TMS dieselben Kacheln enthält, jedoch rückwärts indiziert ist. Dies ist die Umrechnungsformel: Math.floor (Math.pow (2, z) - y - 1)
Haggai
0

Das ist mein Arbeitscode:

jsfiddle Beispiel für eine Google Image Map-Überlagerung

jsfiddle ein weiteres Beispiel für ein Google-Overlay-Bild

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 holt sich bbox von coodinate number und zoom

wie man Google-Koordinatenzahlzoom berechnet, umwandelt, langes Lat usw.….

hoogw
quelle