Интерполяция значений данных в сетке - python - PullRequest
3 голосов
/ 30 января 2020

Вопрос: Есть ли способ повторной выборки значений в сетке из geodataframe для построения более гладкой карты?

Подробности: Я работаю с 24x24 сетка с именем gdf. Каждый 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

Как вы можете видеть, на графике очень сильно sh происходят изменения значений от одной ячейки к другой, и я хотел бы сгладить это.

Есть ли способ разделить каждую ячейку на 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()

1 Ответ

1 голос
/ 31 января 2020

В дополнение к моему комментарию, другой способ - просто рассмотреть вашу сетку как изображение и использовать библиотеку 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)

Вы также можете использовать различные методы интерполяции, Чтобы вернуть ваши данные в pandas фрейм данных:

# 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
...