Рассчитать широту границ для отдельной плитки, сгенерированной из gdal2tiles

16

У меня есть несколько источников плиток, сгенерированных с использованием gdal2tiles, которые я хотел бы представить на одной карте. Поэтому, когда я представляю плитку, мне нужно определить, из какого источника она будет обслуживаться, сверяясь с границами.

Кто-нибудь знает, как рассчитать широтные границы для одной плитки на основе чисто масштабирования, x и y (из структуры файла, сгенерированной gdal2tiles)? Кстати: я использую Google Maps API v3 на случай, если потребуется вызвать некоторые функции из API, чтобы помочь с расчетами.

Причина, по которой я ограничен только масштабированием, x и y, заключается в том, что плитки вызываются не только наложением на карту, но также и некоторыми пользовательскими функциями печати, которые позволяют печатать вне карты.

Gavin
источник

Ответы:

22

Математика описана в:

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

… Включая исходный код для утилиты командной строки и онлайн-демонстрацию.

Это также довольно простая математика:

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

Обратите внимание на разницу между XYZ / Google и TMS по оси Y.

Google Maps API V3 дает вам необходимые функции тоже через .fromPointToLatLng()из map.getProjection().

Петр Придаль
источник
Я просто пытаюсь понять вышеуказанное решение, так как у меня та же проблема. Вы имеете в виду в приведенном выше решении, я должен 1. Сначала преобразовать x, y и увеличить в lat / long, используя tile2long () и tile2lat (). 2. Используйте lat / long, созданный в шаге, чтобы создать границы? Как я должен это делать?
Вишал
@Petr У тебя есть что-нибудь для c ++?
Маджид Ходжати
это не учитывает размер плитки?
Мухаммед Умер
@ petr-pridal Это приводит к тому, что, насколько мне известно, плитка - это область или поверхность. Не могли бы вы предоставить код для ограничительной рамки? Заранее спасибо.
Герберт
Из этой статьи gist.github.com/tmcw/4954720 , TMS - это те же плитки, но проиндексированные в обратном направлении. Это формула конвертации: Math.floor (Math.pow (2, z) - y - 1)
Аггей
0

Это мой рабочий код:

Пример jsfiddle оверлея типа карты изображений Google

jsfiddle другой образец оверлейного изображения 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 получить bbox от числа coodinate и увеличить

Как рассчитать Google координат координаты масштабирования, конвертирования, широты и т. д ....

hoogw
источник