我有一个代表道路的MultiPolygon
,想知道是否有一些GPS点落在距离道路x距离内。我下面的geo_buf
是road.buffer(x)
。使用repeatedgeo_buf.contains(Point)
非常慢,如下面的分析所示(大部分时间都花在运行第297行上)。
如何优化速度?在
from line_profiler import LineProfiler
from shapely.geometry import Point as shapely_Point
Line # Hits Time Per Hit % Time Line Contents
==============================================================
151 def filter_gps(gps_row, geo_buf):
152 606446 62042960.0 102.3 83.3 pot = shapely_Point(gps_row['longitude'], gps_row['latitude'])
153 606446 12433530.0 20.5 16.7 return geo_buf.contains(pot)
Line # Hits Time Per Hit % Time Line Contents
==============================================================
294 1232 11850.0 9.6 0.0 if len(df_gps.index) > 1:
295 geo_buf = shape(json.loads(srg_row['srg_buf']))
296 # filter the GPS points
297 1232 98465688.0 79923.4 68.4 df_filter = df_gps[df_gps.apply(lambda row: filter_gps(row, geo_buf), axis=1)]
这些可能有帮助:
Is there way to optimize speed of shapely.geometry.shape.contains(a_point) call?
https://gis.stackexchange.com/questions/102933/more-efficient-spatial-join-in-python-without-qgis-arcgis-postgis-etc/165413#165413
(未测试)我相信最快的方法是将你的
Polygon
分成许多更小的Polygon
,然后使用geopandas.tools.sjoin
。在相关问题 更多 >
编程相关推荐