Имеется Geo pandas GeoDataFrame с несколькими геометрическими столбцами: Как рассчитать расстояния до основного геометрического столбца? - PullRequest
0 голосов
/ 25 февраля 2020

Чтобы сделать мою проблему понятной, я сначала строю два простых GeoDataFrames с одним столбцом каждый для точечной геометрии, расширяю первый на столько столбцов, сколько есть во втором, и заполняю его соответствующими значениями второй.

df_1 = pd.DataFrame(
    {"geometry":["POINT (4601713.002 3161641.211)",
                 "POINT (4596192.207 3241423.174)",
                 "POINT (4572005.011 3257270.689)"]})
df_1['geometry'] = df_1['geometry'].apply(wkt.loads)
gdf_1 = gp.GeoDataFrame(df_1,
                        geometry="geometry",
                        crs={'init': 'epsg:' + str(3035)})

df_2 = pd.DataFrame(
    {'geometry':["POINT (4627355.438 3211988.792)",
                 "POINT (4599267.641 3220442.514)",
                 "POINT (4557279.752 3237223.279)"]})
df_2['geometry'] = df_2['geometry'].apply(wkt.loads)
gdf_2 = gp.GeoDataFrame(df_2, 
                        geometry="geometry",
                        crs={'init': 'epsg:' + str(3035)})

gdf_2 = gdf_2.assign(Name = lambda x: 'gdf2_' + (gdf_2.index.astype(str)))
gdf_1 = gdf_1.assign(**dict.fromkeys(gdf_2.Name))

# Loop through df_1:
columnsOfInterest = gdf_1.columns[gdf_1.columns.str.startswith("gdf2_")]

for i in columnsOfInterest:
    # get the geometry from gdf_1: (works!)
    gdf_1[i]= list(gdf_1[columnsOfInterest==i].geometry)*len(gdf_1)
gdf_1

DataFrame_gdf_1

Теперь у меня проблемы с вычислением расстояния. Поскольку в исходных наборах данных у меня много точечных данных, мне нужно решение, которое позволило бы мне рассчитать расстояния за один шаг. До сих пор я пытался провести l oop через новые столбцы df_1, но вычисление расстояния, похоже, не работает на серии. Я получаю AttributeError: «Объект« Series »не имеет атрибута« distance »»).

# Loop through df_1:
columnsOfInterest = gdf_1.columns[gdf_1.columns.str.startswith("gdf2_")]

for i in columnsOfInterest:
    # get the geometry from gdf_1: (works!)
    gdf_1[i]= list(gdf_1[columnsOfInterest==i].geometry)*len(gdf_1)
    # distance calculation: (does not work!)
    gdf_1[i]=gdf_1[i].distance(gdf_1.geometry)
gdf_1

Кто-нибудь знает решение проблемы?

1 Ответ

0 голосов
/ 26 февраля 2020
keys = [c for c in gdf_1 if c.startswith('gdf2_')]
gdf1_melted = pd.melt(gdf_1, id_vars=['geometry','Name'], value_vars=keys, value_name='TargetPointCoo')

gdf1_melted['dist_km'] = gdf1_melted.apply(lambda r: round(r['geometry'].distance(r['TargetPointCoo'])/1000,1), axis=1)
gdf1_melted.drop('TargetPointCoo', axis=1, inplace=True)  

pivoted = gdf1_melted.pivot(index = "Name", columns = "variable", values = "dist_km").reset_index()
pivoted

joined = pivoted.join(copyFromPreviousGdf_1.set_index('Name'), on='Name')
print(joined)
...