Город на Глобусе: Визуализация с помощью Python и Basemap

В этой статье мы создадим визуализацию города Москва на глобусе с помощью Python и библиотеки Basemap. Мы будем использовать ортографическую проекцию, чтобы показать город в глобальном контексте.

Библиотеки и Настройка Окружения

Для начала нам потребуются следующие библиотеки Python:

  • Basemap: библиотека для создания картографических проекций и визуализации географических данных.
  • Matplotlib: библиотека для визуализации данных, которая будет использоваться для создания глобуса.
  • Numpy: библиотека для работы с массивами и математическими функциями.

Убедитесь, что эти библиотеки установлены в вашей среде Python.

Определение Координат Москвы

Москва, столица России, имеет следующие географические координаты:

  • Широта (latitude): 55.7558°
  • Долгота (longitude): 37.6173°

Мы будем использовать эти координаты для размещения маркера на глобусе.

Создание Глобуса

Давайте приступим к созданию глобуса с помощью Basemap:

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(7, 6))

# Установка угла обзора
lat_viewing_angle = 55.7558
lon_viewing_angle = 37.6173

# Определение цветовых схем для воды и суши
ocean_map = (plt.get_cmap('ocean'))(210)
cmap = plt.get_cmap('gist_earth')

# Создание карты с ортографической проекцией
m = Basemap(projection='ortho', lat_0=lat_viewing_angle, lon_0=lon_viewing_angle, resolution='l')

Здесь мы устанавливаем размер фигуры для глобуса и определяем угол обзора, соответствующий координатам Москвы. Затем мы выбираем цветовые схемы для воды и суши.

Рисование Карты

Теперь мы можем приступить к рисованию элементов карты:

# Рисование границы карты, заполнение континентов и воды
m.drawmapboundary(fill_color=ocean_map)
m.fillcontinents(color=cmap(200), lake_color=ocean_map)

# Рисование береговой линии и границ стран
m.drawcoastlines()
m.drawcountries()

Мы рисуем границу карты, заполняем континенты и воду соответствующими цветами, а также добавляем береговую линию и границы стран.

Добавление Линей Широты и Долготы

Чтобы сделать карту более информативной, добавим линии широты и долготы:

# Определение диапазона и количества линий широты и долготы
lat_line_range = [-90, 90]
lat_lines = 8
lat_line_count = (lat_line_range[1] - lat_line_range[0]) / lat_lines

merid_range = [-180, 180]
merid_lines = 8
merid_count = (merid_range[1] - merid_range[0]) / merid_lines

# Рисование линий широты и долготы
m.drawparallels(np.arange(lat_line_range[0], lat_line_range[1], lat_line_count))
m.drawmeridians(np.arange(merid_range[0], merid_range[1], merid_count))

Мы определяем диапазон и количество линий широты и долготы, а затем рисуем их на карте.

Отображение Москвы на Глобусе

Теперь добавим маркер, чтобы показать расположение Москвы:

# Отображение маркера в координатах Москвы
x, y = m(lon_viewing_angle, lat_viewing_angle)
m.scatter(x, y, marker='o', color='red', s=100, zorder=10, alpha=0.7, edgecolor='black')

# Добавление аннотации с названием города
plt.annotate('Москва', xy=(x, y), xycoords='data', xytext=(-10, -10), textcoords='offset points',
            color='black', fontsize=12, bbox=dict(facecolor='white', alpha=0.5),
            arrowprops=dict(arrowstyle="->", color='black'), zorder=20)

Мы используем функцию scatter для размещения красного маркера в координатах Москвы. Затем добавляем аннотацию с названием города рядом с маркером.

Отображение и Сохранение Глобуса

Наконец, мы можем отобразить наш глобус и сохранить его в файл:

# Отображение и сохранение глобуса
plt.savefig('moscow_on_globe.png', dpi=150, transparent=True)
plt.show()

Здесь мы сохраняем глобус в файл с именем moscow_on_globe.png с разрешением 150 dpi и прозрачным фоном. Затем мы отображаем глобус с помощью plt.show().

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

Полный код программы

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

# Настройка размера фигуры для глобуса
fig = plt.figure(figsize=(7, 6))

# Определение угла обзора для Москвы
lat_viewing_angle = 55.7558  # Широта Москвы
lon_viewing_angle = 37.6173  # Долгота Москвы

# Определение цветовых схем для воды и суши
ocean_map = (plt.get_cmap('ocean'))(210)
cmap = plt.get_cmap('gist_earth')

# Создание карты с ортографической проекцией
m = Basemap(projection='ortho', lat_0=lat_viewing_angle, lon_0=lon_viewing_angle, resolution='l')

# Рисование границы карты, заполнение континентов и воды
m.drawmapboundary(fill_color=ocean_map)
m.fillcontinents(color=cmap(200), lake_color=ocean_map)

# Рисование береговой линии и границ стран
m.drawcoastlines()
m.drawcountries()

# Определение диапазона и количества линий широты и долготы
lat_line_range = [-90, 90]
lat_lines = 8
lat_line_count = (lat_line_range[1] - lat_line_range[0]) / lat_lines

merid_range = [-180, 180]
merid_lines = 8
merid_count = (merid_range[1] - merid_range[0]) / merid_lines

# Рисование линий широты и долготы
m.drawparallels(np.arange(lat_line_range[0], lat_line_range[1], lat_line_count))
m.drawmeridians(np.arange(merid_range[0], merid_range[1], merid_count))

# Отображение маркера в координатах Москвы
x, y = m(lon_viewing_angle, lat_viewing_angle)
m.scatter(x, y, marker='o', color='red', s=100, zorder=10, alpha=0.7, edgecolor='black')

# Добавление аннотации с названием города
plt.annotate('Москва', xy=(x, y), xycoords='data', xytext=(-10, -10), textcoords='offset points',
            color='black', fontsize=12, bbox=dict(facecolor='white', alpha=0.5),
            arrowprops=dict(arrowstyle="->", color='black'), zorder=20)

# Отображение и сохранение глобуса
plt.savefig('moscow_on_globe.png', dpi=150, transparent=True)
plt.show()

Чтобы отразить город Новосибирск на глобусе, вам нужно изменить координаты широты и долготы в коде. Новосибирск имеет следующие географические координаты:

  • Широта (latitude): 55.0281°
  • Долгота (longitude): 82.9236°

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