【发布时间】:2021-06-03 20:06:24
【问题描述】:
我有一个常规的 pandas 数据框,我像这样一次性转换为 geopandas
from shapely.geometry import Polygon, Point
import geopandas
geo_df = geopandas.GeoDataFrame(input_df, geometry=geopandas.points_from_xy(input_df.Longitude, input_df.Latitude))
我还有一个坐标列表,我可以将其转换为 Shapely Polygon,如下所示:
grid_polygon = Polygon(shape_coordinates)
然后我想过滤geo_df 中不在形状多边形grid_polygon 范围内的所有行。
我目前的方法是:
geo_df['withinPolygon'] = ""
withinQlist = []
for lon,lat in zip(geo_df['longitude'], geo_df['latitude']):
pt = Point(lon, lat)
withinQ = pt.within(grid_polygon)
withinQlist.append(withinQ)
geo_df['withinPolygon'] = withinQlist
geo_df = geo_df[geo_df.withinPolygon==True]
但这是非常低效的。我认为有一种方法可以在不遍历每一行的情况下做到这一点,但我能够找到的大多数解决方案都不使用形状多边形进行过滤。有什么想法吗?
谢谢
【问题讨论】:
-
使用
geo_df.apply()应该比 for 循环稍快,但除非Point构造函数/检查可以向量化,否则您必须遍历所有行。 -
谢谢 - 是的 apply 是一种选择,但我认为有一种更原生的方式来做到这一点 - 我相信这里的 Point 转换实际上是不必要的 - 必要的信息应该已经由 points_from_xy 编码在 geopandas df 的初始化中。我目前正在尝试使用逻辑 df[df.geometry.within(polygon)] 但仍在测试。
标签: python pandas geospatial geopandas shapely