python-xarray:如何将多个波段和日期的单波段栅格数据转换为xarray-Dataset或DataArray?

时间:2018-01-11 00:40:12

标签: python raster satellite-image xarray rasterio

我想拍摄栅格(卫星图像)数据,并构建DatasetDataArray,以加快我的图像处理速度(我必须处理多频段,多日期)卫星图像很多)。

数据作为每个图像日期的单独波段,我理解如何将每个波段日期转换为xarray - DataArray。我认为每个频段都有一个变量是最合理的,每个频段内都有空间(x,y)和时间尺寸。

但是,我无法弄清楚如何做到这一点。

我一直在使用一些虚设乐队来试图解决这个问题,因此将包含这些以澄清我的数据是什么以及我正在尝试做什么。

# Set up dummy 3 x 3 array
dA = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# Create 4 dummy images; 2 bands for each of 2 dates (using bands 4 and 5,
# because they're useful for vegetation measures)
d1_b4 = xr.DataArray((dA + 140),
    coords={'x': ['1', '2', '3'], 'y': ['a', 'b', 'c']}, dims=('x', 'y'))
d1_b5 = xr.DataArray((dA + 150),
    coords={'x': ['1', '2', '3'], 'y': ['a', 'b', 'c']}, dims=('x', 'y'))
d2_b4 = xr.DataArray((dA + 240),
    coords={'x': ['1', '2', '3'], 'y': ['a', 'b', 'c']}, dims=('x', 'y'))
d2_b5 = xr.DataArray((dA + 250),
    coords={'x': ['1', '2', '3'], 'y': ['a', 'b', 'c']}, dims=('x', 'y'))
     # dummy values designed so I can keep track of which array is going
     # where while I learn this

然后我想将这些组合成一个DataArray,带有两个变量(Band4和Band5),每个变量包含两个图像日期......但不知道如何继续。

创建/导入数组时,是否需要添加更多坐标或尺寸,然后沿这些尺寸添加concat

1 个答案:

答案 0 :(得分:1)

正如jhamman所提到的,很大程度上取决于数据的来源,以确定如何组合它。这是组合您提出的数据的一种方式,但还有其他方法。

组合这些数据需要多个步骤。首先,将每个DataArrays命名为您希望它最终输入的变量的名称。

d1_b4.name = 'band4'
d1_b5.name = 'band5'
d2_b4.name = 'band4'
d2_b5.name = 'band5'

然后使用xr.merge将它们放入xarray.Dataset s。 Dataset包含多个xarray.DataArray,可以共享部分或全部维度。

d1 = xr.merge([d1_b4, d1_b5])
d2 = xr.merge([d2_b4, d2_b5])

<xarray.Dataset>
Dimensions:  (x: 3, y: 3)
Coordinates:
  * x        (x) <U1 '1' '2' '3'
  * y        (y) <U1 'a' 'b' 'c'
Data variables:
    band4    (x, y) int64 241 242 243 244 245 246 247 248 249
    band5    (x, y) int64 251 252 253 254 255 256 257 258 259

最后,结合来自不同日期的数据。我们需要一个新维度time,其中包含每个日期的坐标值。我们可以使用xr.concat一步完成此操作。

xr.concat([d1, d2], dim=pd.Index([1990, 1991], name='time'))

<xarray.Dataset>
Dimensions:  (time: 2, x: 3, y: 3)
Coordinates:
  * x        (x) <U1 '1' '2' '3'
  * y        (y) <U1 'a' 'b' 'c'
  * time     (time) int64 1990 1991
Data variables:
    band4    (time, x, y) int64 141 142 143 144 145 146 147 148 149 241 242 ...
    band5    (time, x, y) int64 151 152 153 154 155 156 157 158 159 251 252 ...