【问题标题】:Sort GeoPandas by Name Of Line And By Geographic Location按线路名称和地理位置对 GeoPandas 进行排序
【发布时间】:2018-06-07 02:14:53
【问题描述】:

我有一个从 shapefile 创建的 geopandas 数据框。

我想根据列对我的数据框进行排序:“名称”,并且行块也应按地理位置排序,以便将所有附近具有相同名称的块组合在一起。

我怎样才能进行这种排序?

我尝试过的: 1.我计算每个线串的平均坐标:

df['mean_coord'] = df.geometry.apply(lambda g: [np.mean(g.xy[0]),np.mean(g.xy[1])])
  1. 我根据“名称”列对数据框进行分组,并根据平均坐标对生成的数据框进行排序:

    grouped=df.sort_values(['mean_coord'],ascending=False).groupby('name')

但我不确定这是否是最好/最优雅甚至正确的方法。除此之外,我不知道如何从分组元素返回熊猫数据框?

【问题讨论】:

  • 这一点我怎么强调都不为过:您需要将一些有代表性的数据集硬编码到您的问题中,就像我在这里回答我所做的那样:stackoverflow.com/a/47972529/1552748
  • (这意味着链接到一些随机的shapefile)

标签: python python-3.x geopandas multilinestring


【解决方案1】:

首先,我将向您展示我已硬编码并假定为具有代表性的数据集。这确实是您应该在问题中提供的内容,但这个假期我感觉很慷慨:

from shapely.geometry import Point, LineString
import geopandas

line1 = LineString([
    Point(0, 0),
    Point(0, 1),
    Point(1, 1),
    Point(1, 2),
    Point(3, 3),
    Point(5, 6),
])

line2 = LineString([
    Point(5, 3),
    Point(5, 5),
    Point(9, 5),
    Point(10, 7),
    Point(11, 8),
    Point(12, 12),
])

line3 = LineString([
    Point(9, 10),
    Point(10, 14),
    Point(11, 12),
    Point(12, 15),
])

gdf = geopandas.GeoDataFrame(
    data={'name': ['A', 'B', 'A']},
    geometry=[line1, line2, line3]
)

所以现在我要计算每条线的质心的 x 和 y 坐标,对其进行平均,按平均值和线名排序,然后删除中间列。

output = (
    gdf.assign(x=lambda df: df['geometry'].centroid.x)
       .assign(y=lambda df: df['geometry'].centroid.y)
       .assign(rep_val=lambda df: df[['x', 'y']].mean(axis=1)) 
       .sort_values(by=['name', 'rep_val']) 
       .loc[:, gdf.columns] 
)

print(output)

  name                                       geometry
0    A      LINESTRING (0 0, 0 1, 1 1, 1 2, 3 3, 5 6)
2    A         LINESTRING (9 10, 10 14, 11 12, 12 15)
1    B  LINESTRING (5 3, 5 5, 9 5, 10 7, 11 8, 12 12)

【讨论】:

    猜你喜欢
    • 2017-05-23
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2021-07-06
    • 1970-01-01
    • 2019-01-04
    相关资源
    最近更新 更多