使用 geopandas multilinestring 从 xarray 数据集中提取值

Extract values from xarray dataset using geopandas multilinestring

我有几百条 geopandas 多线串沿着感兴趣的对象进行追踪(几年内每周一条线追踪墨西哥湾流),我想使用这些线从一些对象中提取值其他 xarray 个数据集,每周了解海面温度、叶绿素-a 和沿此路径的其他变量。

我不确定如何使用这些 geopandas 行从 xarray 数据集中提取值。我考虑过将它们分解成点并在每个点获取数据集值,但这似乎有点麻烦。有什么简单的方法可以做这个操作吗?

由于 GeoPandas 使用与 Pandas 相同的约定,最好的方法是在处理数据时统一数据类型。您可以在 xarray 中执行此操作:

xr.Dataset.from_dataframe(df)

将线打散成点,然后提取点其实很简单!

import geopandas as gpd
import numpy as np
import shapely.geometry as sg
import xarray as xr

# Setup an example DataArray:
y = np.arange(20.0)
x = np.arange(20.0)

da = xr.DataArray(
    data=np.random.rand(y.size, x.size),
    coords={"y": y, "x": x},
    dims=["y", "x"],
)

# Setup an example geodataframe:
gdf = gpd.GeoDataFrame(
    geometry=[
        sg.LineString([(0.0, 0.0), (5.0, 5.0)]),
        sg.LineString([(10.0, 10.0), (15.0, 15.0)]),
    ]
)

# Get the centroids, and create the indexers for the DataArray:
centroids = gdf.centroid
x_indexer = xr.DataArray(centroids.x, dims=["point"])
y_indexer = xr.DataArray(centroids.y, dims=["point"])

# Grab the results:
da.sel(x=x_indexer, y=y_indexer, method="nearest")
<xarray.DataArray (point: 2)>
array([0.80121949, 0.34728138])
Coordinates:
    y        (point) float64 3.0 13.0
    x        (point) float64 3.0 13.0
  * point    (point) int64 0 1

主要是决定你想采样哪个点,或者多少个点等等

请注意,地理数据框中的几何对象也有插值方法,如果您想在沿轨迹的特定点绘制值:

https://shapely.readthedocs.io/en/stable/manual.html#object.interpolate

这种情况下,.apply就可以派上用场了:

gdf.geometry.apply(lambda geom: geom.interpolate(3.0))

0      POINT (2.12132 2.12132)
1    POINT (12.12132 12.12132)
Name: geometry, dtype: geometry