Yandex.Maps Static API. Пример реализации Python

1. Создадим оконное приложение с использованием модуля PyGame, которое отображает карту по координатам и в масштабе. Затем последовательно добавим возможность увеличения/уменьшения карты и сдвиг карты при помощи стрелок. Результат работы программы показан на рисунке.

Yandex.Maps Static API позволяет фрагмент карты, который в данном примере средствами Python будет сохранен в виде рисунка и размещен на холсте.

Привожу раскомментированный код, выводящий карту, но не реагирующий на управляющие кнопки.

import pygame, requests, sys, os

# Создайте оконное приложение, отображающее карту по координатам и в масштабе, который задаётся программно.

class MapParams(object):
    def __init__(self):
        self.lat = 61.665279  # Координаты центра карты на старте. Задал координаты университета
        self.lon = 50.813492
        self.zoom = 16  # Масштаб карты на старте. Изменяется от 1 до 19
        self.type = "map" # Другие значения "sat", "sat,skl"

    # Преобразование координат в параметр ll, требуется без пробелов, через запятую и без скобок
    def ll(self):
        return str(self.lon)+","+str(self.lat)

# Создание карты с соответствующими параметрами.
def load_map(mp):
    map_request = "http://static-maps.yandex.ru/1.x/?ll={ll}&z={z}&l={type}".format(ll=mp.ll(), z=mp.zoom, type=mp.type)
    response = requests.get(map_request)
    if not response:
        print("Ошибка выполнения запроса:")
        print(map_request)
        print("Http статус:", response.status_code, "(", response.reason, ")")
        sys.exit(1)

    # Запись полученного изображения в файл.
    map_file = "map.png"
    try:
        with open(map_file, "wb") as file:
            file.write(response.content)
    except IOError as ex:
        print("Ошибка записи временного файла:", ex)
        sys.exit(2)
    return map_file
        
def main():
    # Инициализируем pygame
    pygame.init()
    screen = pygame.display.set_mode((600, 450))
    mp = MapParams()
    while True:
        event = pygame.event.wait()
        if event.type == pygame.QUIT:  # Выход из программы
           break
        #Создаем файл
        map_file = load_map(mp)
        # Рисуем картинку, загружаемую из только что созданного файла.
        screen.blit(pygame.image.load(map_file), (0, 0))
        pygame.display.flip()
    pygame.quit()
    # Удаляем файл с изображением.
    os.remove(map_file) 
  
if __name__ == "__main__":
    main()

2. Реализуем теперь возможность изменения масштаба при помощи кнопок PageUp и PageDown.

Для этого добавим вызов метода update при нажатии кнопки:

        elif event.type == pygame.KEYUP:  # Обрабатываем различные нажатые клавиши.
            mp.update(event)

Соответственно в классе MapParams необходимо определить метод update:

    def update(self, event):
        if event.key == 280 and self.zoom < 19:  # Page_UP
            self.zoom += 1
        elif event.key == 281 and self.zoom > 2:  # Page_DOWN
            self.zoom -= 1

3. Зададим теперь перемещение карты. Сначала определим шаг смещения. Я задам одинаковый и для широты, и для долготы.

my_step = 0.008

Теперь в метод update допишем обработку клавиш-стрелочек:

        elif event.key == 276:  # LEFT_ARROW
            self.lon -= my_step * math.pow(2, 15 - self.zoom)
        elif event.key == 275:  # RIGHT_ARROW
            self.lon += my_step * math.pow(2, 15 - self.zoom)
        elif event.key == 273 and self.lat < 85:  # UP_ARROW
            self.lat += my_step * math.pow(2, 15 - self.zoom)
        elif event.key == 274 and self.lat > -85:  # DOWN_ARROW
            self.lat -= my_step * math.pow(2, 15 - self.zoom)    

4. Самостоятельная работа

  • Измените первоначальную карту на свою школу.
  • Добавьте на карту в верхний  левый угол свое имя.
  • Добавьте возможность переключения слоёв карты (схема/спутник/гибрид).
Поделиться:
  • Добавить ВКонтакте заметку об этой странице
  • Мой Мир
  • Facebook
  • Twitter
  • LiveJournal
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • StumbleUpon
  • Technorati
  • БобрДобр
  • Memori.ru
  • МоёМесто.ru

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.