Как я могу получить детали Tile Count, Tile X, Tile Y без указания уровня масштабирования (или LevelOfDetails)?

Это относится к Google Tile Map или Bing Maps. Можно ли получить детали Tile Count, Tile X, Tile Y без указания уровня масштабирования (или LevelOfDetails) с помощью каких-либо внутренних вычислений?

Клиент предоставит только координаты P1 и P2 и попросит тайловую карту, привязку и т. д.

Шилпа


person Community    schedule 13.07.2010    source источник


Ответы (3)


Каждая плитка имеет размер 256 на 256 пикселей.

Уровень масштабирования 0 равен 1 тайлу. (1 х 1)

Уровень масштабирования 1 составляет 4 тайла. (2 х 2)

Уровень масштабирования 2 составляет 16 тайлов. (4 х 4)

Уровень масштабирования 3 составляет 64 тайла. (8 х 8)

Уровень масштабирования 4 составляет 256 плиток (16 x 16).

Счетчики x и y удваиваются для каждого уровня масштабирования. Согласно комментарию 88ad, формула для количества плиток такова (2^увеличение x 2^увеличение).

Надеюсь, вы справитесь с остальными математическими расчетами на 18-м уровне масштабирования. В целях экономии места тайлы океана не сохраняются. Они создаются в ответ на запрос.

При уровне масштабирования 3 плитки нумеруются от 0 до 7 по оси x (долгота) и от 0 до 7 по оси y (широта).

Плитки начинаются на американской стороне около международной линии перемены дат (долгота -180 или +180). Тайл 0,0 начинается примерно на 70 северной широте.

См. статью Википедии Проекция Меркатора, чтобы узнать больше о том, как сфера сопоставляется с плоскостью. Расчеты для преобразования долготы и широты в координаты x и y находятся в статье Википедии.

Вы можете сопоставить любую точку проекции Меркатора с набором фрагментов. Набор плиток — это набор плиток на уровне масштабирования. Вы должны знать уровень масштабирования, чтобы знать, к какому набору плиток обращаться, и вычислять, какую плитку в наборе плиток нужно извлечь и отобразить.

В этом сообщении блога Карты Google приводится формула преобразования (широта, долгота, масштаб ) на (x, y, масштабирование), где x и y представляют плитку из набора масштабирования.

person Community    schedule 13.07.2010
comment
Спасибо, эта информация о количестве плиток на уровень масштабирования оказалась очень полезной. - person paullb; 02.07.2012
comment
Лучшим способом выразить это было бы количество плиток, равное: (2^увеличение * 2^увеличение) - person 88ad; 22.03.2013
comment
Спасибо тебе за это. Какой метод используется для захвата количества плиток, загруженных в представление карты? - person TharakaNirmana; 26.06.2013
comment
Последняя ссылка (dougmelton.com) не работает. - person Alex Essilfie; 25.07.2013
comment
Для преобразования (широта, долгота, масштаб) в (x, y, масштаб) см. также здесь: wiki .openstreetmap.org/wiki/ - person asmaier; 11.05.2015
comment
В JS для расчета количества плиток на уровень масштабирования вам нужно будет использовать Math.pow(2,zoom)*Math.pow(2,zoom) - person sidonaldson; 13.04.2016
comment
Более простой способ представить это будет 4^zoom или Math.pow(4, zoom). - person redbmk; 08.09.2016

Вы можете проверить вики с именами плиток OSM. Они почти такие же, как плитки Google, за исключением направления оси Y. Описание с большим количеством примеров кода находится здесь: http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames

person Community    schedule 22.01.2013
comment
+1. Не могу поверить, что этот ресурс был доступен, и я провел большую часть ночи в поисках, в конце концов написав свой собственный код для этой работы. Жизнь кодера... - person Alex Essilfie; 25.07.2013

Если у вас есть ограничивающая рамка, вы можете использовать эту функцию python для определения уровня масштабирования (или аналогичную функцию в вашем выборе языка программирования):

def level_dic():
    '''
    http://wiki.openstreetmap.org/wiki/Zoom_levels
    '''
    data = {0: 360.0,
        1: 180.0,
        2: 90.0,
        3: 45.0,
        4: 22.5,
        5: 11.25,
        6: 5.625,
        7: 2.813,
        8: 1.406,
        9: 0.703,
        10: 0.352,
        11: 0.176,
        12: 0.088,
        13: 0.044,
        14: 0.022,
        15: 0.011,
        16: 0.005,
        17: 0.003,
        18: 0.001,
        19: 0.0005}

    return data


def getzoom(self):
    data = level_dic()  # our presets
    a, b, c, d = bbox
    r = 3
    dne = abs(round(float(c) - float(a), r))  # ne: North East point
    mylist = [round(i, r) for i in data.values()] + [dne]
    new = sorted(mylist, reverse=True)
    return new.index(dne)

Я использовал эту ссылку. Остальное просто. Вам нужно использовать Slippy_map_tilenames.

person Community    schedule 02.04.2014
comment
Вместо использования dict вы можете использовать list и упростить понимание списка: [round(i, r) for i in data] + [dne] - person beatgammit; 03.12.2014