<p>如果我正确理解你的问题,街区和餐馆的规模可能会有很大的不同。因此,尝试通过重新编制索引强制转换为表格式可能是一种不好的方法。</p>
<p>我只需绕着街区走一圈,就可以得到到餐馆的最小距离(就像@shongololo建议的那样)。</p>
<p>我将稍微更一般一点(因为我已经写下了这段代码)并做点到线的距离,但是相同的代码应该在点到点或从多边形到多边形之间工作。我将从点的<code>GeoDataFrame</code>开始,并创建一个新列,该列与直线的距离最小。</p>
<pre><code>%matplotlib inline
import matplotlib.pyplot as plt
import shapely.geometry as geom
import numpy as np
import pandas as pd
import geopandas as gpd
lines = gpd.GeoSeries(
[geom.LineString(((1.4, 3), (0, 0))),
geom.LineString(((1.1, 2.), (0.1, 0.4))),
geom.LineString(((-0.1, 3.), (1, 2.)))])
# 10 points
n = 10
points = gpd.GeoSeries([geom.Point(x, y) for x, y in np.random.uniform(0, 3, (n, 2))])
# Put the points in a dataframe, with some other random column
df_points = gpd.GeoDataFrame(np.array([points, np.random.randn(n)]).T)
df_points.columns = ['Geometry', 'Property1']
points.plot()
lines.plot()
</code></pre>
<p><a href="https://i.stack.imgur.com/IhShO.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/IhShO.png" alt="enter image description here"/></a></p>
<p>现在获取点到线的距离,并且只保存每个点的最小距离(请参见下面的apply版本)</p>
<pre><code>min_dist = np.empty(n)
for i, point in enumerate(points):
min_dist[i] = np.min([point.distance(line) for line in lines])
df_points['min_dist_to_lines'] = min_dist
df_points.head(3)
</code></pre>
<p>它给予</p>
<pre><code> Geometry Property1 min_dist_to_lines
0 POINT (0.2479424516236574 2.944916965334865) 2.621823 0.193293
1 POINT (1.465768457667432 2.605673714922998) 0.6074484 0.226353
2 POINT (2.831645235202689 1.125073838462032) 0.657191 1.940127
</code></pre>
<p>----编辑----</p>
<p>(取自github问题)使用<code>apply</code>更好,也更符合您在<code>pandas</code>中的做法:</p>
<pre><code>def min_distance(point, lines):
return lines.distance(point).min()
df_points['min_dist_to_lines'] = df_points.geometry.apply(min_distance, df_lines)
</code></pre>
<p>编辑:至少从2019年10月4日起,熊猫的变化似乎需要在最后一个代码块中使用<code>args</code>参数输入不同的内容:</p>
<pre><code>df_points['min_dist_to_lines'] = df_points.geometry.apply(min_distance, args=(df_lines,))
</code></pre>