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

2024-04-28 19:51:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 数据对象方法路径温度感兴趣xarraygeopandas
2条回答

由于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

主要的事情是决定你想在哪一点取样,或者取样多少点,等等

请注意,geodataframe中的几何体对象也有插值方法,如果您希望沿轨迹在特定点绘制值:

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

相关问题 更多 >