首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将地理数据转换为X数组数据集?

如何将地理数据转换为X数组数据集?
EN

Stack Overflow用户
提问于 2022-11-10 03:22:00
回答 2查看 58关注 0票数 1

我有一个相对重力数据集,在纬度和经度点上进行了697次测量。我在转换到Xarray数据集时遇到了困难,这样我就可以不可避免地用Xarray.interp_like创建一个内插网格。

我尝试使用以下文章从一个系列和一个Dataframe创建DataArray:https://towardsdatascience.com/basic-data-structures-of-xarray-80bab8094efa

使用级数方法:

代码语言:javascript
运行
复制
idx = pd.MultiIndex.from_arrays(arrays=[lat_grav,long_grav],names=["lat","lon"])
s = pd.Series(data=rel_grav,index=idx)
s
lat        lon        
36.713923  -116.120574   NaN
           -116.120574   NaN
           -116.120574   NaN
36.712458  -116.125034   NaN
           -116.125034   NaN
                          ..
36.703896  -116.116244   NaN
           -116.116244   NaN
36.725249  -116.124976   NaN
           -116.124976   NaN
           -116.124976   NaN

相对重力测量仍然是NaNs,所以我决定使用DataFrame方法:

代码语言:javascript
运行
复制
rel_grav_df = pd.DataFrame({"relativegrav":rel_grav,"lat":lat_grav,"lon":lon_grav})
rel_grav_df = rel_grav_df.reset_index(drop = True)
rel_grav_df
    relativegrav    lat lon
0   979517.368887   36.713923   -116.120574
1   979517.369767   36.713923   -116.120574
2   979517.370685   36.713923   -116.120574
3   979519.096209   36.712458   -116.125034

试图在示例中将表枢轴,我使用了以下代码并获得了错误:

代码语言:javascript
运行
复制
df_pv = rel_grav_df.pivot(index="lat",columns="lon")
Index contains duplicate entries, cannot reshape

这就是我最初尝试reset_index的原因,但这两种方法都不起作用。对于最后的结果,我想使用以下代码将重力插值到与地形网格相同的大小:

代码语言:javascript
运行
复制
gravity_interp = gravity.interp_like(topography,kwargs={"fill_value":None})

任何帮助都将不胜感激!下面是编辑后的,我在数据中找到了重复的,下面是更新的数据:

代码语言:javascript
运行
复制
rel_grav_df = pd.DataFrame({"relativegrav":rel_grav,"lat":lat_grav,"lon":long_grav})

rel_grav_df = rel_grav_df.drop_duplicates(subset=['lat'])
rel_grav_df = rel_grav_df.reset_index(drop = True)
rel_grav_df.to_csv(r'rel_grav_data.txt',sep=' ', mode = 'a')

对于如下所示的数据:

代码语言:javascript
运行
复制
 relativegrav lat lon
0 979517.3688865899 36.7139233 -116.1205735
1 979519.096208526 36.7124585 -116.1250345
2 979518.8915050578 36.71282822 -116.1316972
3 979531.2591178748 36.70126449 -116.1439218
4 979526.3018131296 36.70558774 -116.1420382
5 979524.8843729249 36.70548686 -116.1359999
6 979521.9290486736 36.70901614 -116.1335681
7 979514.2801810974 36.71966692 -116.1100001
8 979528.4878656694 36.72797377 -116.0854069
9 979521.5282591976 36.72430037 -116.0944469
10 979517.7510474161 36.72091093 -116.1030826
11 979515.6928347832 36.7191884 -116.1074014
12 979516.3006383271 36.71579345 -116.1160991

现在创建DataArray:

代码语言:javascript
运行
复制
df_pv = rel_grav_df.pivot(index="lat",columns="lon")
df_pv = df_pv.droplevel(0,axis=1)
da = xr.DataArray(data = df_pv)
da
xarray.DataArraylat: 212lon: 212
array([[nan, nan, nan, ..., nan, nan, nan],
       [nan, nan, nan, ..., nan, nan, nan],
       [nan, nan, nan, ..., nan, nan, nan],
       ...,
       [nan, nan, nan, ..., nan, nan, nan],
       [nan, nan, nan, ..., nan, nan, nan],
       [nan, nan, nan, ..., nan, nan, nan]])
Coordinates:
lat
(lat)
float64
36.69 36.69 36.69 ... 36.76 36.76
lon
(lon)
float64
-116.1 -116.1 ... -116.1 -116.1

由于某些原因,重力值仍未填充DataArray。

EN

Stack Overflow用户

发布于 2022-11-11 18:49:27

在2D中的点态数据和常规的2D网格上的数据之间有一个重要的区别。虽然您可以在xarray中存储和处理点态数据,但xarray的空间操作将不像您预期的那样工作。相反,xarray将把唯一的索引维度"point“作为数据集的唯一维度。所以你的计划,正如你所概述的,是行不通的。

相反,如果您的目标是将数据内插到常规的2D网格上,那么在进入xarray之前,您需要自己进行这种插值。因此,scipy.interpolate是一个很好的地方。我在这里实现了一个快速的最近邻插值--如果你愿意的话,你可以做一些更复杂的事情:

代码语言:javascript
运行
复制
In [18]: interpolator = scipy.interpolate.NearestNDInterpolator(
    ...:     df[['lon', 'lat']].values, df['relativegrav'].values
    ...: )

In [19]: # define your target grid however you'd like
    ...: y = np.linspace(36.7, 36.73, 100)
    ...: x = np.linspace(-116.2, -116, 200)
    ...: # broadcast these against eachother to get every combo of x, y points
    ...: xx, yy = np.meshgrid(x, y)
    ...:
    ...: values = interpolator(xx.flat, yy.flat).reshape(xx.shape)

In [20]: filled = xr.DataArray(values, dims=['lat', 'lon'], coords=[y, x])

现在,您可以在一个完整的2D规则网格上获得数据:

代码语言:javascript
运行
复制
In [23]: filled
Out[23]:
<xarray.DataArray (lat: 100, lon: 200)>
array([[979531.25911787, 979531.25911787, 979531.25911787, ...,
        979528.48786567, 979528.48786567, 979528.48786567],
       [979531.25911787, 979531.25911787, 979531.25911787, ...,
        979528.48786567, 979528.48786567, 979528.48786567],
       [979531.25911787, 979531.25911787, 979531.25911787, ...,
        979528.48786567, 979528.48786567, 979528.48786567],
       ...,
       [979526.30181313, 979526.30181313, 979526.30181313, ...,
        979528.48786567, 979528.48786567, 979528.48786567],
       [979526.30181313, 979526.30181313, 979526.30181313, ...,
        979528.48786567, 979528.48786567, 979528.48786567],
       [979526.30181313, 979526.30181313, 979526.30181313, ...,
        979528.48786567, 979528.48786567, 979528.48786567]])
Coordinates:
  * lat      (lat) float64 36.7 36.7 36.7 36.7 36.7 ... 36.73 36.73 36.73 36.73
  * lon      (lon) float64 -116.2 -116.2 -116.2 -116.2 ... -116.0 -116.0 -116.0
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74383791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档