сохранить только экстент карты, используя matplotlib python - PullRequest
1 голос
/ 14 июля 2020

Я использую matplotlib вместе с базовой картой со следующим кодом

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap,cm

#Map Center
core = (151.35,-23.92)

LAT = core[1]
LON = core[0]
zoom_scale = 5/111
#create a bounding box from the central co=ordinates
bbox = [LAT-zoom_scale,LAT+zoom_scale, LON-zoom_scale,LON+zoom_scale]

#create an instance of the basemap object
m = Basemap(epsg=4326,llcrnrlat=bbox[0],urcrnrlat=bbox[1],\
                 llcrnrlon=bbox[2],urcrnrlon=bbox[3],resolution='i')

#Add and arcgis basemap
m.arcgisimage(service="World_Imagery", xpixels=7000, verbose=False)   
t = Bbox.from_extents(151.324,-23.9414,151.357,-23.9117)

#save the image
plt.savefig(plotOutDir+'/'+ "new", bbox_inches = t,pad_inches = 0)

Это результат Образец изображения

Однако это сохраняет всю карту как изображение. Есть ли способ сохранить лишь небольшой экстент этой карты в формате png, передав объект экстента в качестве одного из аргументов в методе plt.savefig? или есть другой способ добиться этого?

1 Ответ

0 голосов
/ 14 июля 2020

Хм, вот несколько окольный вариант решения этой проблемы. Вы можете обрезать объект PIL Image, указав пиксели для обрезки следующим образом: { ссылка }. Обрезанное изображение затем можно сохранить на диск с Image.save(). Вы также можете преобразовать matplotlib figure в PIL Image следующим образом: { ссылка }.

Объединение этих идей дает следующее, которое вы можете вставить в существующий код. Вам нужно будет преобразовать ваш bbox из дюймов в пиксели.

# Import PIL
from PIL import Image

# Grab current figure object
fig = plt.gcf()

# Use code snippet from 2nd link to convert matplotlib fig to PIL Image
def fig2img(fig):
    """Convert a Matplotlib figure to a PIL Image and return it"""
    import io
    buf = io.BytesIO()
    fig.savefig(buf)
    buf.seek(0)
    img = Image.open(buf)
    return img

img = fig2img(fig)

# Use code from 1st link to crop and save
# Note: Fill in your bbox area in pixels here!!
area = (400, 400, 800, 800)
cropped_img = img.crop(area)
cropped_img.save(plotOutDir+'/'+ "new")
...