网格数据值的插值-python

问题描述 投票:3回答:1

问题:是否可以从geodataframe重新采样网格化值以绘制更平滑的图?

详细信息:我正在使用名为gdf的24x24网格。网格的每个cell都有一个value和一个id作为属性:

#gdf.head()

    id      values      geometry
0   1       52.390119   POLYGON ((653179.710 6859158.392, 653179.710 6...
1   2       52.390119   POLYGON ((653179.710 6858908.392, 653179.710 6...
2   3       52.390119   POLYGON ((653179.710 6858658.392, 653179.710 6...
3   4       49.592331   POLYGON ((653179.710 6858408.392, 653429.710 6...
4   5       52.390119   POLYGON ((653429.710 6858408.392, 653179.710 6...

这是绘制地图时得到的地图类型:

Initial gridded data

如您所见,在图中从一个单元格到另一个单元格的值存在非常严峻的变化,我希望对此进行平滑处理。

是否有一种方法可以将每个像元分为2个或3个子像元(水平和垂直)以获得更高分辨率的网格,然后对这些值进行插值以获得平滑的梯度,而不是这种方法? 知道我正在尝试将数据保留为geodataframe,因为稍后需要将它们转换为shapefile


[我找到了一种方法,可以通过plt.imshow()进行操作,因为有interpolation选项;这将完全满足我的需求,但这仅提供图像作为输出,我无法直接用它来修改gdf

grid = np.array(file.data).reshape(-1, 24)[::-1]

fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(20, 20), subplot_kw={'xticks': [], 'yticks': []})

for ax, interp_method in zip(axs.flat, methods):
    ax.imshow(grid, interpolation='lanczos', cmap='RdYlGn_r')

plt.tight_layout()
plt.show()
python interpolation geopandas
1个回答
0
投票

为了补充我的评论,另一种方法就是将网格视为图像并使用PIL库:

import numpy as np
from PIL import Image

image = PIL.Image.from_array(grid)
w, h = image.size
ratio = 4
image = image.resize((w*ratio, h*ratio), Image.BILINEAR)
image.show()
grid = np.array(image)

您也可以使用different interpolation方法。要将您的数据恢复到熊猫数据框中:

# flatten your grid and get your values back into a column
pd.DataFrame(grid.flatten(), columns=['values'])

# add an id column that starts a 1
df['id'] = df.index + 1
© www.soinside.com 2019 - 2024. All rights reserved.