我想将新插入的网格保存在CSV文件中,其结构如下:纬度、经度、值。
到目前为止,我编写的代码如下所示:
import numpy as np
from pykrige.ok import OrdinaryKriging
from pykrige.kriging_tools import write_asc_grid
import pykrige.kriging_tools as kt
def get_data(df):
return {
"lons": np.array([6.47, 4.8, 1.94]),
"lats": np.array([46.37, 43.9, 47.83]),
"values": np.array([-29.5, -27.6, -32.5]),
}
def extend_data(data):
return {
"lons": np.concatenate([np.array([lon-360 for lon in data["lons"]]), data["lons"], np.array([lon+360 for lon in data["lons"]])]),
"lats": np.concatenate([data["lats"], data["lats"], data["lats"]]),
"values": np.concatenate([data["values"], data["values"], data["values"]]),
}
def generate_grid(data, basemap, delta=1):
grid = {
'lon': np.arange(-180, 180, delta),
'lat': np.arange(np.amin(data["lats"]), np.amax(data["lats"]), delta) # dont extrapolate towards the poles
}
grid["x"], grid["y"] = np.meshgrid(grid["lon"], grid["lat"])
grid["x"], grid["y"] = basemap(grid["x"], grid["y"])
return grid
def interpolate(data, grid):
Ok = OrdinaryKriging(
data["lons"],
data["lats"],
data["values"],
variogram_model='exponential',
)
return Ok.execute("grid", grid["lon"], grid["lat"])
def inter_todf(interpolation, grid):
dfl = pd.DataFrame({
'latitude': grid['x'].reshape(-1),
'longitude': grid['y'].reshape(-1),
'value': interpolation.reshape(-1)
});
return(dfl)
base_data = get_data()
grid = generate_grid(base_data, basemap, 1)
extended_data = extend_data(base_data)
interpolation, interpolation_error = interpolate(extended_data, grid)
dfl = inter_todf(interpolation, grid)
dfl.to_csv('foo')
使用这段代码,我可以得到以下输出(print(dfl)):
latitude longitude value
0 5.650097e+06 8.681598e+05 -7.094071
1 5.713078e+06 8.681598e+05 -7.099389
2 5.776060e+06 8.681598e+05 -7.104715
3 5.839042e+06 8.681598e+05 -7.110051
4 5.902023e+06 8.681598e+05 -7.115394
... ... ... ...
57235 2.684171e+07 1.687378e+07 -8.435601
57236 2.689803e+07 1.687378e+07 -8.449231
57237 2.695434e+07 1.687378e+07 -8.462931
57238 2.701066e+07 1.687378e+07 -8.476702
57239 2.706697e+07 1.687378e+07 -8.490544
但是,值得注意的是,纬度或经度值太高了。例如,纬度值应该只在+90度和-90度之间,经度值应该在+180度和-180度之间。我做错了什么?
示例我的“解决方案”基于:Is there a way to save interpolated values to a python dataframe?
1条答案
按热度按时间3phpmpom1#
全局变量
grid
对于grid["x"]
和grid["y"]
具有不同的大小。这是因为genareate_grid
中的data["lats"]
不一定跨越最小值和最大值之间相差360的值。我怀疑你的
inter_todf
并没有做它应该做的事情。你最想要的是每一条“线”都包含一个在x-y中的位置和相应的值。这需要像这样的东西:您尝试打印的内容是: