使用空间插值python填充shapefile中的缺失数据

Posted

技术标签:

【中文标题】使用空间插值python填充shapefile中的缺失数据【英文标题】:Filling Missing data in shapefile using spatial interpolation python 【发布时间】:2022-01-11 20:14:24 【问题描述】:

这是我的第一个问题。我是python新手,所以请多多包涵。 我有一个包含如下数据的 shapefile。

ID   Data  geometry
111  0.1   POINT(X,Y)
112  0.2   POINT(X,Y)
113  0.5   POINT(X,Y)
114  NaN   POINT(X,Y)
115  0.3   POINT(X,Y)
116  NaN   POINT(X,Y)
117  NaN   POINT(X,Y)

我想使用空间插值填充“数据”列中的缺失值。 我已经尝试过本教程https://www.youtube.com/watch?v=OfC3KpL4PRw,但它为我的数据添加了很多额外的坐标。有没有更简单的方法来使用空间插值来填补那些缺失的点?

【问题讨论】:

Scipy 有一个 2D 插值模块。但是堆栈溢出不适用于库推荐。您需要(几乎)工作代码和特定问题。您可能会在 gis.stackexchange.com 上得到更好的回复 【参考方案1】: 您可以计算出完整的距离矩阵并使用它来查找最近点的值 我不希望这会扩展到大量点 已模拟一些数据,因为问题是抽象的
import geopandas as gpd
import pandas as pd
from scipy.spatial import distance
import numpy as np
import shapely.geometry

gdf = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres")).set_crs("EPSG:4326")

# get some points - UK boundary
gdf = gdf.loc[gdf["iso_a3"].eq("GBR"), "geometry"].apply(lambda g: g.geoms).explode().apply(
    lambda g: g.exterior.coords
).explode().apply(shapely.geometry.Point).reset_index(drop=True).to_frame().assign(
    data=lambda d: np.arange(0, len(d))
)
gdf = gpd.GeoDataFrame(gdf)

# randomly set 10 values to NaN
gdf.loc[gdf.sample(20).index, "data"] = np.nan

# build matrix of distances...
d = pd.DataFrame(distance.cdist(*[np.stack(gdf.geometry.apply(lambda x: [x.x, x.y]))] * 2))

# take mean of nearest 3 co-ordinates
gdf["data_i"] = gdf.apply(
    lambda r: gdf.loc[d[r.name].sort_values().index, "data"].dropna().head(3).mean()
    if np.isnan(r["data"])
    else r["data"],
    axis=1,
)

gdf.plot(column="data")
gdf.plot(column="data_i")

【讨论】:

以上是关于使用空间插值python填充shapefile中的缺失数据的主要内容,如果未能解决你的问题,请参考以下文章

如何用python读取arcgis中shapefile文件的属性表

数据分析缺失值处理(Missing Values)——删除法填充法插值法

Python / Pandas:按顺序填充 NaN - 线性插值 --> ffill --> bfill

如何在 Python 中使用克里金法对 2D 空间数据进行插值?

Shapefile属性操作之增

Shapefile属性操作之增