python - 同时在点几何和其他列上合并 GeoDataFrames
问题描述
如何同时在几何和任意其他列GeoDataFrame
上合并两个 s ?Point
我意识到这项任务对于所有其他几何形状都是模棱两可的,而不是Point
因为直线和多边形的“平等”没有得到很好的定义,但仍然如此。
如果我简单地尝试,以下 MWE 会引发错误gdf2.merge(gdf)
,正确地抱怨
不可散列的类型:“点”。
如何解决这个问题?
import geopandas as gpd
import pandas as pd
from io import StringIO
import shapely
df = pd.read_csv(StringIO('''
Name Value x y
'a' 1.5 0. 0.
'b' 22 0. 1.
'c' 0.2 0. 1.
'''),sep=r"\s*",engine='python')
df2 = pd.read_csv(StringIO('''
Name OtherValue x y
'a' 9.9 0. 0.
'b' 4.5 0. 1.
'c' 2e3 1. 1.
'''),sep=r"\s*",engine='python')
def dataframe_to_geodataframe(df):
geometry = [shapely.geometry.Point(xy) for xy in zip(df.x, df.y)]
df = df.drop(['x','y'], axis=1)
gdf = gpd.GeoDataFrame(df, geometry=geometry)
return gdf
gdf = dataframe_to_geodataframe(df)
gdf2 = dataframe_to_geodataframe(df2)
gdf.merge(gdf2,how='left')
理想情况下,输出类似于
Name Value geometry OtherValue
0 'a' 1.5 POINT (0 0) 9.9
1 'b' 22.0 POINT (0 1) 4.5
2 'c' 0.2 POINT (0 1) NaN
(当然取决于how
关键字)。
(我确实意识到这可以在转换回普通的 pandas DataFrames 后轻松完成,但我觉得应该有一种方法可以做到这一点而无需来回转换。)
解决方案
一种(可能是肮脏的)方法是通过扩展类来使哈希可Point
散列shapely.geometry.Point
:
class HPoint(shapely.geometry.Point):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def __hash__(self):
return hash(tuple(self.coords))
这是基于这样一个事实,即Point
(通过父类提供BaseGeometry
)的相等运算符仅比较坐标元组。
然后你可以使用这个类:
def dataframe_to_geodataframe(df):
geometry = [HPoint(xy) for xy in zip(df.x, df.y)]
df = df.drop(['x','y'], axis=1)
gdf = gpd.GeoDataFrame(df, geometry=geometry)
return gdf
gdf = dataframe_to_geodataframe(df)
gdf2 = dataframe_to_geodataframe(df2)
print(gdf2.merge(gdf, how='right'))
产生:
Name OtherValue geometry Value
0 'a' 9.9 POINT (0 0) 1.5
1 'b' 4.5 POINT (0 1) 22.0
2 'c' NaN POINT (0 1) 0.2
推荐阅读
- post-redirect-get - 如果您提交 HTML 片段,则需要发布/重定向/获取?
- wpf - WPF Update count of item when button is pushed
- powershell - 用于从组的文本文件中获取名称、职务、部门、经理姓名和经理电子邮件的 Powershell 脚本
- c - 在 C 中扫描不同的数据类型
- angular - 升级到 firebase js sdk v8 后,在“firebase”中找不到导出“firestore”(导入为“firebase”)
- c++ - 调整抽象类中嵌套类对象的向量大小
- html - 是否可以将图像放置在不影响滚动条的窗口边缘?
- mysql - 如何编写一个对行进行分组的 sql 查询,然后对其中一列进行一些计算?
- java - 从 txt 文件或变量中读取数据更快?
- c# - c#如何最好地将数组或列表放入也有名称的类中?