Как рисовать прямоугольники на базовой карте

Я ищу способ нарисовать заполненные прямоугольники на Basemap. Я мог бы легко рисовать прямоугольники с помощью метода drawgreatcircle, но я не могу найти способ фактически заполнить эти прямоугольники (указав цвет и альфа).

Ответ 1

Вы можете добавить matplotlib.patches.Polygon() прямо к своим осям. Вопрос в том, хотите ли вы, чтобы ваши прямоугольники определяли координаты участка (прямые линии на графике) или в координатах карты (большие круги на графике). В любом случае вы указываете вершины в координатах карты, а затем преобразуете их в график координат, вызывая экземпляр Basemap (m() в приведенном ниже примере), самостоятельно создавайте Polygon и добавляйте его вручную к отображаемым осям.

Для прямоугольников, определенных в графических координатах, здесь приведен пример:

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

def draw_screen_poly( lats, lons, m):
    x, y = m( lons, lats )
    xy = zip(x,y)
    poly = Polygon( xy, facecolor='red', alpha=0.4 )
    plt.gca().add_patch(poly)

lats = [ -30, 30, 30, -30 ]
lons = [ -50, -50, 50, 50 ]

m = Basemap(projection='sinu',lon_0=0)
m.drawcoastlines()
m.drawmapboundary()
draw_screen_poly( lats, lons, m )

plt.show()

Для прямоугольников, определенных в координатах карты, используйте тот же подход, но интерполируйте свою линию в пространстве карты перед преобразованием в график графика. Для каждого сегмента линии вам нужно будет:

lats = np.linspace( lat0, lat1, resolution )
lons = np.linspace( lon0, lon1, resolution )

Затем преобразуем эти координаты карты для построения координат (как указано выше, с помощью m()) и снова создаем многоугольник с координатами графика.

Ответ 2

Аналогичный ответ выше, но более простой код:

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

map = Basemap(projection='cyl')

map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='coral',lake_color='aqua')
map.drawcoastlines()

x1,y1 = map(-25,-25)
x2,y2 = map(-25,25)
x3,y3 = map(25,25)
x4,y4 = map(25,-25)
poly = Polygon([(x1,y1),(x2,y2),(x3,y3),(x4,y4)],facecolor='red',edgecolor='green',linewidth=3)
plt.gca().add_patch(poly)

plt.show()