Почему я не могу добавить изображение поверх моей карты Matplotlib / Cartopy? - PullRequest
0 голосов
/ 28 августа 2018

Я работаю над проектом, который предполагает нанесение данных на карту с помощью Cartopy.

До сих пор все работало, но я проводил рефакторинг кода, чтобы другие функции могли вызывать другие функции. Для этого у меня есть одна функция, которая добавляет мой фон на карту, и другая, которая добавляет метку-указатель в указанном широте / долготе. Очевидно, я хочу метку над фоном, но не могу заставить ее работать.

В качестве фона я хочу использовать стоковые изображения Cartopy или плитки веб-карты. Проблема та же в любом случае, поэтому я использую фон Cartopy для текущего тестирования. Вот эта функция:

def custom_background(self, source_point):
    cartmap = self.plot
    source_point = source_point.split(" ")
    source_point = (float(source_point[0]), float(source_point[1]))
    dx = 2.5
    dy = 5
    pad = 0.5
    lon_min, lon_max = source_point[0]-dx, source_point[0]+dx
    lat_min, lat_max = source_point[1]-dy, source_point[1]+dy
    area = 4*dx*dy
    zoom = self.get_zoom(area) ##only relevant when using a map tile
    cartmap.set_extent([lat_min-pad, lat_max+pad, lon_min-pad, lon_max+pad])
    #~ cartmap.add_image(self.tile, zoom)
    cartmap.add_feature(cartopy.feature.LAND, zorder=1)
    return cartmap

Вот функция метки:

def add_point_icon(self, x, y, cartmap):
    src_point = np.array(Image.open('icons/icon63.png'))
    im = OffsetImage(src_point, zoom=1, alpha=1.0, zorder=3)
    ab = AnnotationBbox(im, (x,y), xycoords='data', frameon=False)
    cartmap.add_artist(ab)

Оба они называются один за другим, например:

    cartmap = self.custom_background(mysrc)
    #~ cartmap=self.plot
    self.add_point_icon(x1, y1, cartmap)

Результаты:

Если я запускаю код как есть, карта выглядит так:

map with background

Если я изменю его на (то есть, обходя функцию, которая рисует фон):

    #~ cartmap = self.custom_background(mysrc)
    cartmap=self.plot
    self.add_point_icon(x1, y1, cartmap)

Тогда я получаю:

enter image description here

Почему я не могу получить красный знак "плюс", который будет отображаться в верхней части карты? Я попытался установить параметр "zorder" для различных объектов, и он, похоже, ничего не делает. Я сейчас в полной растерянности. Спасибо за любую помощь, спасибо.

Редактировать: возможно, я должен также включить строки, которые создают подзаговор:

def __init__(self, mylevs):
    self.fig, self.header, self.footer, self.plot, self.legend = 
        self.create_spec()

def create_spec(self):
    """Define layout of figure"""

    #left column: header, footer, plt
    fig = plt.figure(figsize=(12,10))
    layout = 1
    if layout == 1: #Default
        widths = [8,1]
        heights = [2, 10, 3]
        column_border = 0.75
        pad = 0.1
        colorbar_width = 0.05
        spec = gridspec.GridSpec(ncols=1, nrows=3, width_ratios = [1], height_ratios=heights, left=0.1, right = column_border)
        #right column: colorbar
        spec2 = gridspec.GridSpec(ncols=1, nrows=1, width_ratios = [1], height_ratios=[1], left=column_border+pad, right=column_border+pad+colorbar_width)

        header = plt.subplot(spec[0,0])
        footer = plt.subplot(spec[2,0])
        plot = plt.subplot(spec[1,0], projection=cimgt.OSM().crs)
        legend = plt.subplot(spec2[0,0])

    return fig, header, footer, plot, legend

1 Ответ

0 голосов
/ 29 августа 2018

Проблема заключалась в том, что при переключении обратно на фоновый рисунок Cartopy из фрагментов карты я забыл переключить проекцию с ccrs.OSM () обратно на ccrs.PlateCarree (). В проекции плитки карты метка выводилась за пределы окна просмотра.

...