使用Geopandas,如何选择不在多边形内的所有点?

16

我有一个包含芝加哥地址的DataFrame,我已经将它们转换成了纬度和经度值,然后又通过Point对象将DataFrame转换为GeoDataFrame。其中一小部分地址被错误地编码为位于芝加哥之外的LatLong值。我有一个关于芝加哥边界的形状文件(GeoDataFrame),我想选择所有点坐标在芝加哥边界多边形之外的行。

通过geopandas的sjoin函数可以轻松选择多边形内的所有点,但是我还没有找到一种好的方法来选择不在多边形内的点。是否存在这样一种方法呢?

1个回答

19

如果您将芝加哥边界GeoDataFrame转换为单个多边形,例如:

chicago = df_chicago.geometry.unary_union

然后您可以使用布尔过滤器和within运算符来选择芝加哥内外的点:

within_chicago = df[df.geometry.within(chicago)]
outside_chicago = df[~df.geometry.within(chicago)]

使用~来反转布尔条件。

另外,你也可以使用disjoint空间谓词:

outside_chicago = df[df.geometry.disjoint(chicago)]

1
我不知道为什么执行 df[~df.geometry.within(chicago)] 会得到所有点都在多边形外面的结果(顺便提一下,我的多边形是一个单一的多边形),而 df[df.geometry.disjoint(chicago)] 给出了我期望的结果(在我的情况下,所有点都在多边形外面,所以我的 outside_chicago 是空的)。 - umbe1987
@umbe1987 你的 dfdf_chicago 是否拥有相同的坐标参考系?如果它们的 CRS 不同,那么一个点可以是用度量表示的,而另一个点可能是从(0,0)开始以米为单位量化的,这将导致一个点远离另一个点的边界多远。您可以通过 df.crsdf_chicago.crs 进行检查,如果它们不同,则可以通过 df_chicago = df_chicago.to_crs(df.crs) 更新其中一个的几何图形。 - MattTriano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接