Как нарисовать круг или эллипс на карте (через matplotlib и Cartopy)?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как нарисовать круг или эллипс на карте (через matplotlib и Cartopy)?

Сообщение Anonymous »

Я пытаюсь построить траекторию тропического циклона (тайфун Саола, 2023 г.), используя matplotlib и Cartopy. Лучшие данные трека предоставлены Японским метеорологическим агентством (JMA) и хранятся в файле CSV. Нанесение маршрута, включая линию и центральные точки местоположения, было в порядке, но мне было трудно нанести на карту поля ураганного и штормового ветра, что потребовало бы нанесения на карту круга (или эллипса, если поле ветра асимметрично). Проблема в том, что круги/эллипсы не отображаются на карте.
Я попробовал использовать для этой задачи matplotlib.patches.Circle и matplotlib.patches.Ellipse, где центр задается как Значения широты и долготы центра тропического циклона и радиуса/большой полуоси/малой полуоси указаны в морских милях на основе лучших данных пути. Но круг/эллипс на карте не нанесен. Видны только следы тропических циклонов, линии сетки и береговые линии.
Это мой код:

Код: Выделить всё

# Program for extracting TC track data from a comma-separated values (CSV) file
# esp. JMA best track data

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import cartopy.crs as ccrs

def angle(direction):
if direction == 'N':
return 0
elif direction == 'NE':
return 45
elif direction == 'E':
return 90
elif direction == 'SE':
return 135
elif direction == 'S':
return 180
elif direction == 'SW':
return 225
elif direction == 'W':
return 270
elif direction == 'NW':
return 315

# Importing TC best track data from a CSV file
saola_besttrack = pd.read_csv('C:/Users/Brian/Desktop/saola_track.csv')

# Setting the latitude and longitude values of the PAR region
PAR_longitudes = [120, 135, 135, 115, 115, 120, 120]
PAR_latitudes = [25, 25, 5, 5, 15, 21, 25]

for i in range(len(saola_besttrack)):
# Taking a subset of the entire data from start to current
subset = saola_besttrack.iloc[:i+1]

# Taking additional subsets based on wind intensity
TD_track = subset[subset['Wind (kt)'] = 34) & (subset['Wind (kt)'] = 48) & (subset['Wind (kt)'] = 64) & (subset['Wind (kt)'] = 100]

# Initializing the map
fig = plt.figure(figsize=(25., 25.), dpi=250)
ax = plt.axes(projection=ccrs.PlateCarree())
ax.set_extent([115, 130, 10, 25], ccrs.PlateCarree())

# Adding gridlines
gridlines = ax.gridlines(draw_labels=True, xlocs=np.arange(-180, 181, 2),
ylocs=np.arange(-90, 91, 2), color='gray',
linestyle='--')
gridlines.top_labels = False
gridlines.right_labels = False
gridlines.xlabel_style = {'size': 20}
gridlines.ylabel_style = {'size': 20}

# Adding the coastlines
ax.coastlines('10m', edgecolor='black', linewidth=2.5)

# Plotting the PAR boundary
ax.plot(PAR_longitudes, PAR_latitudes, color='black', linewidth=6,
transform=ccrs.PlateCarree(), linestyle='-.')

# Plotting the gale-force wind field
if pd.isna(subset.loc[i, 'Direc. of Major Gale Axis']):
pass
elif subset.loc[i, 'Direc. of Major Gale Axis'] == 'symmetric':
gale_windfield = patches.Circle((subset.loc[i, 'Long.'], subset.loc[i, 'Lat.']),
subset.loc[i, 'Radius of Major Gale Axis (nm)'] * 1.852,
edgecolor='yellow', facecolor='none', linestyle='-',
transform=ccrs.PlateCarree())
ax.add_patch(gale_windfield)
else:
major_axis_angle = angle(subset.loc[i, 'Direc. of Major Gale Axis'])
gale_windfield = patches.Ellipse((subset.loc[i, 'Long.'], subset.loc[i, 'Lat.']),
2 * subset.loc[i, 'Radius of Major Gale Axis (nm)'] * 1.852,
2 * subset.loc[i, 'Radius of Minor Gale Axis (nm)'] * 1.852,
angle=major_axis_angle, edgecolor='yellow',
facecolor='none', linestyle='-',
transform=ccrs.PlateCarree())
ax.add_patch(gale_windfield)

# Plotting the storm-force wind field
if pd.isna(subset.loc[i, 'Direc.  of Major Storm Axis']):
pass
elif subset.loc[i, 'Direc. of Major Storm Axis'] == 'symmetric':
storm_windfield = patches.Circle((subset.loc[i, 'Long.'], subset.loc[i, 'Lat.']),
subset.loc[i, 'Radius of Major Storm Axis (nm)'] * 1.852,
edgecolor='red', facecolor='none', linestyle='-',
transform=ccrs.PlateCarree())
ax.add_patch(storm_windfield)
else:
major_axis_angle = angle(subset.loc[i, 'Direc. of Major Storm Axis'])
storm_windfield = patches.Ellipse((subset.loc[i, 'Long.'], subset.loc[i, 'Lat.']),
2 * subset.loc[i, 'Radius of Major Storm Axis (nm)'] * 1.852,
2 * subset.loc[i, 'Radius of Minor Storm Axis (nm)'] * 1.852,
angle=major_axis_angle, edgecolor='red',
facecolor='none', linestyle='-',
transform=ccrs.PlateCarree())
ax.add_patch(storm_windfield)

# Plotting the TC track
ax.plot(subset['Long.'], subset['Lat.'], '-k', transform=ccrs.PlateCarree(),
linewidth=5)
ax.plot(TD_track['Long.'], TD_track['Lat.'], 'o', color='blue',
transform=ccrs.PlateCarree(), markersize=25)
ax.plot(TS_track['Long.'], TS_track['Lat.'], 'o', color='green',
transform=ccrs.PlateCarree(), markersize=25)
ax.plot(STS_track['Long.'], STS_track['Lat.'], 'o', color='orange',
transform=ccrs.PlateCarree(), markersize=25)
ax.plot(TY_track['Long.'], TY_track['Lat.'], 'o', color='red',
transform=ccrs.PlateCarree(), markersize=25)
ax.plot(STY_track['Long.'], STY_track['Lat.'], 'o', color='purple',
transform=ccrs.PlateCarree(), markersize=25)

plt.show()

# End of program
А это содержимое файла saola_track.csv:

Год, Месяц, День ,Час,Широта,Долгота,Ветер (уз),Порыв (уз),Направл. оси большого шторма, радиус оси большого шторма (миль), радиус оси малого шторма (миль), Direct. оси главного шторма, радиус оси большого шторма (нм), радиус оси малого шторма (нм)
2023,8,22,0,18.8,128.3,0,0,, ,,,,
2023,8,22,6,18.6,127.5,0,0,,,,,,,
2023,8 ,22,12,18.5,126.8,0,0,,,,,,
2023,8,22,18,18.5,126.5,0,0,,,,,,
2023,8,23,0,18.5,126.2,0,0,,,,,,,
2023,8,23,6 ,18.6,125.9,0,0,,,,,,
2023,8,23,12,18.8,125.6,0,0,,,,,,,
2023,8,23,18,19.5,125.3,0,0,,,,,,
2023,8,24,0,20,125.1,0 ,0,,,,,,
2023,8,24,6,20.5,124.8,35,0,,,,SE,150,90
2023,8,24,12,20.2,124.5,35,0,,,,SE,150,90
2023,8,24,18,20.1,124.3 ,40,0,,,,SE,150,90
2023,8,25,0,19.9,124,45,0,,,,SE,150,90
2023,8,25,6,19.8,123.8,50,0,,,,SE,150,90
2023,8,25, 12,19.6,123.6,65,0,симметричный,30,30,SE,150,90
2023,8,25,18,19.2,123.4,70,0,симметричный, 40,40,SE,150,90
2023,8,26,0,18.5,123.2,75,0,симметричный,40,40,SE,150,90
2023,8,26,6,18,123.2,85,0,симметричный,50,50,SE,150,90
2023,8,26, 12,17.6,123,90,0,симметричный,50,50,SE,150,90
2023,8,26,18,17.2,122.9,95,0,симметричный, 50,50,SE,150,90
2023,8,27,0,16.8,122.9,95,0,симметричный,50,50,SE,150,90
2023,8,27,6,16.5,123,95,0,симметричный,50,50,SE,150,90
2023,8, 27,12,16.2,123.2,95,0,симметричный,50,50,SE,150,90
2023,8,27,18,16,123.7,85,0,симметричный, 40,40,SE,150,90
2023,8,28,0,16.8,124.4,80,0,симметричный,40,40,SE,150,90
2023,8,28,6,17.5,124.2,85,0,симметричный,40,40,симметричный,120,120
2023,8,28, 12,17.9,124,85,0,симметричный,40,40,симметричный,120,120
2023,8,28,18,18.3,123.8,85,0,симметричный,40, 40,симметричный,120,120
2023,8,29,0,18.5,123.5,85,0,симметричный,40,40,симметричный,120,120
2023,8,29,6,18.9,123.1,90,0,симметричный,40,40,симметричный,120,120
2023,8,29,12,19.3,122.7, 95,0,симметричный,50,50,СЗ,150,120
2023,8,29,18,19.9,121.9,100,0,симметричный,50,50,СЗ,150,120< /p>
2023,8,30,0,20.1,121,105,0,симметричный,50,50,СЗ,150,120
2023,8,30, 6,20.4,120.3,105,0,симметричный,50,50,СЗ,150,120
2023,8,30,12,20.7,119.6,105,0,симметричный,50, 50,N,150,120
2023,8,30,18,20.9,118.7,105,0,симметричный,50,50,N,150,120
2023,8,31,0,21.1,118.2,105,0,симметричный,50,50,NE,150,120
2023,8,31,6,21.2,117.8, 105,0,симметричный,50,50,СВ,150,120
2023,8,31,12,21.5,117.3,100,0,симметричный,50,50,СВ,150,120< /p>
2023,8,31,18,21.6,116.8,95,0,симметричный,50,50,NE,150,120
2023,9, 1,0,21.9,116.2,95,0,симметричный,50,50,NE,150,120


Подробнее здесь: https://stackoverflow.com/questions/791 ... nd-cartopy
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему маним создает круг для набора точек, образующих эллипс?
    Anonymous » » в форуме Python
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Как заставить круг деформироваться по проекции в cartopy
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Matplotlib, Как нарисовать заштрихованный круг в три четверти или дугу?
    Anonymous » » в форуме Python
    0 Ответы
    46 Просмотры
    Последнее сообщение Anonymous
  • Обновите плитку/изображение на основе экстента с помощью Cartopy и Matplotlib FuncAnimation.
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Шов, где долгота оборачивается в проекции matplotlib/cartopy Mollweide
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»