Это плохая практика иметь более 1 столбца геометрии в GeoDataFrame? - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь создать GeoDataFrame с двумя почтовыми индексами на строку, расстояния между которыми я хочу сравнить. Я взял список из примерно 220 почтовых индексов и запустил на них комбинацию itertools, чтобы получить все комбо, затем распаковал кортежи в два столбца

code_combo = list(itertools.combinations(df_with_all_zip_codes['code'], 2))
df_distance_ctr = pd.DataFrame(code_combo, columns=['first_code','second_code'])

Затем я сделал несколько стандартных слияний панд и переименовал столбец, чтобы получитьстолбец многоугольника / геометрии из исходного геодатафрейма в этот новый, рядом с соответствующими столбцами почтового индекса. Проблема в том, что я не могу заставить столбцы многоугольника считываться как геометрию, даже после 1.) попытки преобразовать данные в геоданные - AttributeError: Данные геометрии еще не заданы , 2.)применение wkt.loads к столбцу геометрии - AttributeError: у объекта 'MultiPolygon' нет атрибута 'encode'. Я пытался найти способ преобразования серии в геосерию, но ничего не могу найтина так ни документации. Может кто-нибудь указать, где я, вероятно, иду не так?

1 Ответ

0 голосов
/ 08 октября 2019

Если посмотреть на __init__ метод GeoDataFrame в https://github.com/geopandas/geopandas/blob/master/geopandas/geodataframe.py,, похоже, что GDF может иметь только один столбец за раз. Другие созданные вами столбцы должны по-прежнему содержать геометрические объекты.

Поскольку у вас все еще есть геометрические объекты в каждом столбце, вы можете написать метод, использующий метод Shapely distance, например:

import pandas as pd
import geopandas
from shapely.geometry import Point
import matplotlib.pyplot as plt

lats = [-34.58, -15.78, -33.45, 4.60, 10.48]
lons = [-58.66, -47.91, -70.66, -74.08, -66.86]
df = pd.DataFrame(
    {'City': ['Buenos Aires', 'Brasilia', 'Santiago', 'Bogota', 'Caracas'],
     'Country': ['Argentina', 'Brazil', 'Chile', 'Colombia', 'Venezuela'],
     'Latitude': lats,
     'Longitude': lons})

df['Coordinates'] = list(zip(df.Longitude, df.Latitude))
df['Coordinates'] = df['Coordinates'].apply(Point)

df['Coordinates_2'] = list(zip(lons[::-1], lats[::-1]))
df['Coordinates_2'] = df['Coordinates_2'].apply(Point)

gdf = geopandas.GeoDataFrame(df, geometry='Coordinates')


def get_distance(row):
    distance = row.Coordinates.distance(row.Coordinates_2)
    print(distance)
    return distance

gdf['distance'] = gdf.apply(lambda row: get_distance(row), axis=1)

Что касается AttributeError: 'MultiPolygon' object has no attribute 'encode'. MultiPolygon - класс геометрии Shapely. encode обычно является методом для строковых объектов, поэтому вы, вероятно, можете удалить вызов wkt.loads.

...