微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Geopandas + rasterio:将矢量隔离为 png

如何解决Geopandas + rasterio:将矢量隔离为 png

我试图将城市的边界隔离为 png 的单个部分。我的目标是将此 png 叠加到非常旧的卫星照片上。

为此,我收集了一个复制照片尺寸的光栅文件一个带边界的矢量文件。然后,我使用了光栅:

import Rasterio
from Rasterio.plot import show

src = Rasterio.open("my_raster.tiff")

和 geopandas 的等价物:

import geopandas as gpd

GDF = gpd.read_file("boundary.shp")

我检查了 src 和 GDF 之间的坐标参考系统完全相同,然后我使用 matplotlib 正确放置了边界:

import matplotlib.pyplot as plt

fig,ax = plt.subplots(figsize=(20,10))
show(src.read(),transform=src.transform,ax=ax)
GDF.plot(ax=ax,color='white')
plt.show()

显示

Rasterio + vector boundary

效果很好,但我无法使用 savefig() 仅保存 png 中的边界。我试图将 ax 分开,用 ax1 表示光栅,用 ax2 表示矢量,但没有用...

我可以只保存图的这一部分吗?

解决方法

好的,经过一些搜索,我将我的情节保存如下:

import matplotlib.pyplot as plt

fig,ax = plt.subplots(figsize=(20,10))
show(src.read(),transform=src.transform,ax=ax)
GDF.plot(ax=ax,color='#fff')
ax.set_axis_off()
fig.savefig("test.png",dpi=220,bbox_inches = 'tight')
plt.show()

然后,我在一个小函数中使用了 PIL :

from PIL import ImageTk,Image

def only_boundary(image):
    # first,convert picture as RGBA
    with Image.open(image).convert("RGBA") as img:
        pixels = img.load()
        for i in range(img.size[0]):
            for j in range(img.size[1]):
                # if a pixel is not white...
                if pixels[i,j] != (255,255,255):
                    #it becomes transparent
                    pixels[i,j] = (0,0)
    # then the loops are over,we save
    im = img.save(image)

and only_boundary("test.png") 保存了好结果!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。