提取几何(形状)内的数据
Extract data within a geometry (shape)
我有一个 NetCDF 数据集,我通常使用 xarray 函数调用它。我最近一直在对数据集进行一些横断面分析,看起来像这样(水平蓝线之间的区域是要分析的横断面):
目前,我只能提取落在垂直或水平样带内的数据(因为它们很容易提取。
但现在我想 select 数据集中的某个形状,我想对其进行分析。这些形状可能不对称或不在一条直线上。一些示例如下所示:
基本上,这些形状可以是不规则的(每个点的坐标已知)。
是否可以提取 dataset/values(带坐标),特别是只针对感兴趣的区域?
只需使用 ARCMaps 裁剪功能或 Google Earth Engine 裁剪功能即可轻松执行这些步骤。但我无法在 python 中使用它(因为我只想在所有步骤中使用 python)。有人可以提供一些建议吗? 如果有人知道任何与 xarray 有很好集成的包,那就太好了。
我使用了一个 rioxarray
包,它似乎与 xarray 集成得很好,而且很容易实现。
import xarray as xr
import rioxarray as rx
Treecover = xr.open_rasterio('/home/chandra/data/Treecover_MOD44B_2000_250m_AMAZON.tif')
[Output]:
<xarray.DataArray (band: 1, y: 32093, x: 20818)>
[668112074 values with dtype=float64]
Coordinates:
* band (band) int64 1
* y (y) float64 13.71 13.71 13.71 13.71 ... -58.35 -58.35 -58.36 -58.36
* x (x) float64 -81.38 -81.37 -81.37 -81.37 ... -34.63 -34.63 -34.62
Attributes:
transform: (0.002245788210298804, 0.0, -81.37613580017715, 0.0, -0.0022...
crs: +init=epsg:4326
res: (0.002245788210298804, 0.002245788210298804)
is_tiled: 0
nodatavals: (nan,)
geometries = [
{
'type': 'Polygon',
'coordinates': [[
[-46.23140155225633, -21.53505449239459],
[-44.91304217725633, -20.221175092759253],
[-70.22554217725633, 1.5816072875439455],
[-71.36812030225633, 0.5271132528460204]
]]
}
]
Treecover_clipped = Treecover.rio.clip(geometries, Treecover.rio.crs)
[Output]:
<xarray.DataArray (band: 1, y: 10293, x: 11779)>
array([[[nan, nan, ..., nan, nan],
[nan, nan, ..., nan, nan],
...,
[nan, nan, ..., nan, nan],
[nan, nan, ..., nan, nan]]])
Coordinates:
* band (band) int64 1
* y (y) float64 1.58 1.578 1.575 1.573 ... -21.53 -21.53 -21.53
* x (x) float64 -71.37 -71.36 -71.36 ... -44.92 -44.92 -44.91
spatial_ref int64 0
Attributes:
transform: (0.0022457882102988043, 0.0, -71.36665774687539, 0.0, -0.0...
_FillValue: nan
grid_mapping: spatial_ref
我有一个 NetCDF 数据集,我通常使用 xarray 函数调用它。我最近一直在对数据集进行一些横断面分析,看起来像这样(水平蓝线之间的区域是要分析的横断面):
目前,我只能提取落在垂直或水平样带内的数据(因为它们很容易提取。
但现在我想 select 数据集中的某个形状,我想对其进行分析。这些形状可能不对称或不在一条直线上。一些示例如下所示:
基本上,这些形状可以是不规则的(每个点的坐标已知)。
是否可以提取 dataset/values(带坐标),特别是只针对感兴趣的区域?
只需使用 ARCMaps 裁剪功能或 Google Earth Engine 裁剪功能即可轻松执行这些步骤。但我无法在 python 中使用它(因为我只想在所有步骤中使用 python)。有人可以提供一些建议吗? 如果有人知道任何与 xarray 有很好集成的包,那就太好了。
我使用了一个 rioxarray
包,它似乎与 xarray 集成得很好,而且很容易实现。
import xarray as xr
import rioxarray as rx
Treecover = xr.open_rasterio('/home/chandra/data/Treecover_MOD44B_2000_250m_AMAZON.tif')
[Output]:
<xarray.DataArray (band: 1, y: 32093, x: 20818)>
[668112074 values with dtype=float64]
Coordinates:
* band (band) int64 1
* y (y) float64 13.71 13.71 13.71 13.71 ... -58.35 -58.35 -58.36 -58.36
* x (x) float64 -81.38 -81.37 -81.37 -81.37 ... -34.63 -34.63 -34.62
Attributes:
transform: (0.002245788210298804, 0.0, -81.37613580017715, 0.0, -0.0022...
crs: +init=epsg:4326
res: (0.002245788210298804, 0.002245788210298804)
is_tiled: 0
nodatavals: (nan,)
geometries = [
{
'type': 'Polygon',
'coordinates': [[
[-46.23140155225633, -21.53505449239459],
[-44.91304217725633, -20.221175092759253],
[-70.22554217725633, 1.5816072875439455],
[-71.36812030225633, 0.5271132528460204]
]]
}
]
Treecover_clipped = Treecover.rio.clip(geometries, Treecover.rio.crs)
[Output]:
<xarray.DataArray (band: 1, y: 10293, x: 11779)>
array([[[nan, nan, ..., nan, nan],
[nan, nan, ..., nan, nan],
...,
[nan, nan, ..., nan, nan],
[nan, nan, ..., nan, nan]]])
Coordinates:
* band (band) int64 1
* y (y) float64 1.58 1.578 1.575 1.573 ... -21.53 -21.53 -21.53
* x (x) float64 -71.37 -71.36 -71.36 ... -44.92 -44.92 -44.91
spatial_ref int64 0
Attributes:
transform: (0.0022457882102988043, 0.0, -71.36665774687539, 0.0, -0.0...
_FillValue: nan
grid_mapping: spatial_ref