<p>您将列的新名称与名称geometry混合使用,这是错误的原因:(名称转换并不总是完成)</p>
<pre><code> data1 = """
node x_coord y_coord
0 0 258
1 0 259
2 0 260
3 0 261
4 0 230
"""
data2 = """
node x_coord y_coord
0 0 288
1 0 249
2 0 210
3 0 259
4 0 232
"""
df1 = pd.read_csv(pd.compat.StringIO(data1), sep='\s+')
df2 = pd.read_csv(pd.compat.StringIO(data2), sep='\s+')
df1['Coordinates1'] = list(zip(df1.x_coord, df1.y_coord))
df1['Coordinates1'] = df1['Coordinates1'].apply(Point)
df2['Coordinates2'] = list(zip(df2.x_coord, df2.y_coord))
df2['Coordinates2'] = df2['Coordinates2'].apply(Point)
outer = gpd.GeoDataFrame(df1, geometry='Coordinates1')
inner = gpd.GeoDataFrame(df2, geometry='Coordinates2')
from shapely.ops import nearest_points
pts3 = inner.geometry.unary_union #you could use inner.Coordinates2.unary_union
def near(point, pts=pts3):
#you could use inner.Coordinates2
nearest = inner.geometry == nearest_points(point, pts)[1]
return inner[nearest].node.get_values()[0]
# apply or lambda doesnt translate geometry to Coordinates1
outer['Nearest'] = outer.apply(lambda row: near(row.Coordinates1), axis=1)
print(outer)
</code></pre>
<p>输出:</p>
^{pr2}$
<p>之后,如果您有大量的要点,我建议您使用<a href="https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.cKDTree.html" rel="nofollow noreferrer">cKDTree</a>:</p>
<pre><code>from scipy.spatial import cKDTree
def ckdnearest(gdA, gdB, bcol):
nA = np.array(list(zip(gdA.geometry.x, gdA.geometry.y)))
nB = np.array(list(zip(gdB.geometry.x, gdB.geometry.y)))
btree = cKDTree(nB)
dist, idx = btree.query(nA, k=1)
df = pd.DataFrame.from_dict({'distance': dist.astype(int),
'bcol': gdB.loc[idx, bcol].values})
return df
df = ckdnearest(outer, inner, 'node')
print(df)
</code></pre>
<p>输出:</p>
<pre><code> distance bcol (bcol equal node of inner
0 1 3
1 0 3
2 1 3
3 2 3
4 2 4
</code></pre>