【发布时间】:2020-09-14 19:41:56
【问题描述】:
我在常规的 stackoverflow 而不是 stackexchange GIS 上问这个问题,因为我的问题更多是 scikit-learn,而不是任何与 GIS 相关的库。
我有一个包含多边形的 GeoDataFrame(一个 Pandas GeoDataFrame,但具有额外的几何功能),我想计算它们之间的成对距离。我也在与 scikit-learn 合作,似乎他们为此有一些很好的优化函数,而且您似乎也可以指定一个可调用函数来进行实际距离计算,这很好,因为我可以(我认为)输出距离矩阵时,只需使用 Shapely 的.distance() 方法即可获取多边形之间的距离。该方法计算两个几何之间的几何距离。
但是,我不知道如何实现自定义可调用函数。这是我目前所拥有的:
import geopandas as gpd
from random import uniform
from shapely.geometry import Point
from sklearn.metrics import pairwise_distances
# Define polygon to polygon distance callable
def poly_distance(poly1, poly2):
return poly1.distance(poly2)
# Make some points and buffer them into polygons
geoms = [Point(uniform(0, 100), uniform(0, 100)) for i in range(100)]
gdf = gpd.GeoDataFrame(geoms, columns=["geometry"], geometry="geometry")
gdf[gdf.geometry.name] = gdf.buffer(1)
X = gdf[gdf.geometry.name].to_numpy()
result = pairwise_distances(X, poly_distance)
我认为这会起作用,因为我正在指定一个函数,该函数将从生成的 numpy 数组 (X) 中获取两个元素并返回它们之间的浮点距离。但它抱怨:
TypeError: float() argument must be a string or a number, not 'Polygon'
docs 确实说:
callable 应该将来自 X 的两个数组作为输入,并返回一个指示它们之间距离的值。
但我不知道如何将其转换为函数所需的格式。我还尝试了X的以下定义:
X = np.array([gdf[gdf.geometry.name].to_numpy()])
X = np.transpose(np.array([gdf[gdf.geometry.name].to_numpy()]))
但他们都没有工作。
【问题讨论】:
标签: python scikit-learn geopandas