PngImageFile类型的对象不是JSON可序列化的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PngImageFile类型的对象不是JSON可序列化的相关的知识,希望对你有一定的参考价值。

我正在尝试进行图像叠加。我正在使用卫星数据来研究阿根廷的现象,但我真的想通过folium使用交互式地图。到目前为止,在创建图像时,我得到了一个输出。但是,当我尝试将卫星图像覆盖到基本地图上时,我收到一条错误消息:

PngImageFile类型的对象不是JSON可序列化的

我不知道如何解决它。

from PIL import Image

fig.savefig('GS.png', transparent=True)

img = Image.open("GS.png")


import folium
from folium import plugins


m = folium.Map(location=[-31.416016, -64.188929],  tiles = 'Stamen Terrain')

folium.raster_layers.ImageOverlay(img,
                     [[ya.min(), xa.min()], [ya.max(), xa.max()]],
                     opacity=0.5).add_to(mapa)

mapa
答案

folium.raster_layers.ImageOverlay的文档中,image参数必须是“字符串,文件或类似数组的对象”:

image(字符串,文件或类数组对象) - 要在地图上绘制的数据。 *如果是string,它将直接写在输出文件中。 *如果是文件,它的内容将被转换为嵌入在输出文件中。 *如果是数组,它将转换为PNG base64字符串并嵌入输出中。

在你的代码中,你传递了一个PIL Image

img = Image.open("GS.png")

并且Image不是JSON可序列化的。

尝试将路径传递给图像文件:

import os
img = os.path.abspath("GS.png")

folium.raster_layers.ImageOverlay(
                     img,
                     [[ya.min(), xa.min()], [ya.max(), xa.max()]],
                     opacity=0.5).add_to(mapa)

或者,如果你真的需要PIL Image,并且因为你已经有了numpy(因为它是folium的依赖),你也可以在传递给Image之前将ImageOverlay转换为numpy数组:

img = Image.open("GS.png")

folium.raster_layers.ImageOverlay(
                     numpy.array(img),
                     [[ya.min(), xa.min()], [ya.max(), xa.max()]],
                     opacity=0.5).add_to(mapa)

以上是关于PngImageFile类型的对象不是JSON可序列化的的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:预期的 str、bytes 或 os.PathLike 对象,而不是 Streamlit Web 应用程序中的 PngImageFile

如何解析包含多个相同类型的 JSON 对象(不是数组)的 JSON 对象

QuerySet 类型的对象不是 JSON 可序列化的 Django

“Mycart”类型的对象在 Django 中不是 JSON 可序列化的

TypeError:mappingproxy 类型的对象不是 JSON 可序列化的

Python 错误:TypeError:'Timestamp' 类型的对象不是 JSON 可序列化的'