在 GeoDataFrame 中有超过 1 个几何列是不好的做法吗?
Is it bad practice to have more than 1 geometry column in a GeoDataFrame?
我正在尝试创建一个每行有 2 个邮政编码的 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'])
然后我进行了一些标准的 pandas 合并和列重命名,以将 polygon/geometry 列从原始地理数据框中获取到这个新的地理数据框中,就在各自的邮政编码列旁边。
问题是我似乎无法将多边形列读取为几何,即使在 1.) 尝试将数据框转换为地理数据框 - AttributeError: No geometry data set yet , 2.) 将 wkt.loads 应用于几何列 - AttributeError: 'MultiPolygon' object has no attribute 'encode'
.
我试图寻找一种将系列转换为地理系列的方法,但在 SO 和文档中找不到任何内容。谁能指出我可能哪里出错了?
查看 https://github.com/geopandas/geopandas/blob/master/geopandas/geodataframe.py 处 GeoDataFrame 的 __init__
方法,看起来 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
是一个匀称的几何体 class。 encode
通常是字符串对象的一种方法,因此您可以删除对 wkt.loads
.
的调用
我正在尝试创建一个每行有 2 个邮政编码的 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'])
然后我进行了一些标准的 pandas 合并和列重命名,以将 polygon/geometry 列从原始地理数据框中获取到这个新的地理数据框中,就在各自的邮政编码列旁边。 问题是我似乎无法将多边形列读取为几何,即使在 1.) 尝试将数据框转换为地理数据框 - AttributeError: No geometry data set yet , 2.) 将 wkt.loads 应用于几何列 - AttributeError: 'MultiPolygon' object has no attribute 'encode' . 我试图寻找一种将系列转换为地理系列的方法,但在 SO 和文档中找不到任何内容。谁能指出我可能哪里出错了?
查看 https://github.com/geopandas/geopandas/blob/master/geopandas/geodataframe.py 处 GeoDataFrame 的 __init__
方法,看起来 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
是一个匀称的几何体 class。 encode
通常是字符串对象的一种方法,因此您可以删除对 wkt.loads
.