Клуб API Карт

как узнать номер тайла по геоточке?

Пост в архиве.
sairi-na-tenshi
27 января 2009, 18:11

сабж

13 комментариев
у тайла 2 номера, по Х и по У. и оба этих номера зависят от зума(масштаба). алгоритм вычисления должен быть не сложным...
я понимаю, что он не сложный, но хотелось бы апишную функцию.
еслия я не ошибаюсь, то нужно смотреть в сторону YMaps.Converter.coordinatesToMapPixels(geoPoint), где geoPoint точка в тайле.
к номеру тайла это совершенно не приближает...
В настоящее время никак. А зачем Вам нужны координаты тайла?
чтобы подгружать объекты из текущей области видимости
Про адресацию тайлов Вы можете почитать в разделе Координатные системы. Реализовывать механизм поиска номера тайла Вам придется самостоятельно.
можно, хотябы, конкретную фолмулу, по которой вы делаете преобразование меркатора?
По проекции Меркаторе написано в википедии.
которая формула из приведённых там используется у вас и какие значения констант вы туда подставляете?
короче, нашёл
function _geoToMercator(n) {
    var l = n.getLng() * Math.PI / 180, u = O(n.getLat(), -90, 90) * Math.PI / 180, t = 6378137, s = 0.0818191908426, m = s * Math.sin(u);
    var o = Math.tan(Math.PI / 4 + u / 2) || 1e-13, r = Math.pow(Math.tan(Math.PI / 4 + Math.asin(m) / 2), s), q = o / r;
    return new YMaps.Point(Math.round(t * l), Math.round(t * Math.log(q)));
}

function _mercatorToTiles(e) {
    return new YMaps.Point(Math.round((20037508.342789 + e.x) * 53.5865938), Math.round((20037508.342789 - e.y) * 53.5865938));
}
правильно ли я понял, что у полученных чисел мне нужно обрезать лишние биты с соответствии с зумом и получатся те самые координаты тайла?
сам долго искал, может кому пригодится, код на С/С++
у тайла 3 номера, Z, X, Y

int lat2tileY_Yandex(double lat, int z)//lat=широта в градусах, z=масштаб
{

lat = lat * M_PI / 180.0; //радианы = градусы * ПИ / 180
double a = 6378137;
double k = 0.0818191908426;
double z1 = tan(M_PI / 4 + lat / 2) / pow(tan(M_PI / 4 + asin(k * sin(lat)) / 2) , k);
int pix_Y = round((20037508.342789 - a * log(z1)) * 53.5865938 / pow(2, 23 - z));
return (pix_Y / 256);
}


int long2tileX_Yandex(double lon, int z)//lon=долгота в градусах, z=масштаб
{
lon = lon * M_PI / 180.0; //радианы = градусы * ПИ / 180
double a = 6378137;
double k = 0.0818191908426;
int pix_X = round((20037508.342789 + a * lon) * 53.5865938 / pow(2.0 , 23 - z));
return (pix_X / 256);
}
Обновлено 24 февраля, 11:09