微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 geopandas multilinestring 从 xarray 数据集中提取值

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

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

解决方法

将线分成点然后提取点实际上非常简单!

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
,

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

xr.Dataset.from_dataframe(df)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。