在 geopandas 的 LINESTRING Z 中访问 Z 坐标?

Access Z coordinate in a LINESTRING Z in geopandas?

我有一个带有 LINESTRING Z 几何图形的 GeoDataFrame,其中 Z 是我 lat/long 的高度。 (为了便于共享,我删除了数据框中的其他列,但在显示结果轨迹时是相关的)

    TimeUTC Latitude    Longitude   AGL geometry
    0   2021-06-16 00:34:04+00:00   42.835413   -70.919610  82.2    LINESTRING Z (-70.91961 42.83541 82.20000, -70...

我想在该线串中找到最大 Z 值,但我无法找到访问它的方法或无法以可以确定线串之外的最大值的方式提取 x、y、z 值线串.

line.geometry.bounds 仅 returns x,y min/max.

我能想出的最佳解决方案是将所有点变成元组列表:

points = line.apply(lambda x: [y for y in x['geometry'].coords], axis=1)

然后求第三个元素的最大值:

from operator import itemgetter
max(ft2,key=itemgetter(2))[2]

希望有更好的解决方案。

谢谢。

您可以采用 lambda 函数方法并更进一步:

import numpy as np
line['geometry'].apply(lambda geom: np.max([coord[2] for coord in geom.coords]))

这是一个从头到尾完全可重现的示例:

import shapely
import numpy as np
import geopandas as gpd

linestring = shapely.geometry.LineString([[0,0,0],
                                          [1,1,1],
                                          [2,2,2]])

gdf = gpd.GeoDataFrame({'id':[1,2,3],
                        'geometry':[linestring,
                                    linestring,
                                    linestring]})

gdf['max_z'] = (gdf['geometry']
                .apply(lambda geom: 
                       np.max([coord[2] for coord in geom.coords])))

在上面的示例中,我创建了一个名为“max_z”的新列,用于存储每一行​​的最大 Z 值。

重要提示

此解决方案仅在您 独占 具有 LineString 几何图形时才有效。例如,如果您有 MultiLineStrings,则必须调整我编写的函数来处理它。