Как оптимизировать повторную проверку, если точка находится в многоугольнике - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть MultiPolygon, представляющий дорогу, и я хотел бы выяснить, находятся ли некоторые точки GPS на расстоянии х от дороги.Мой geo_buf ниже road.buffer(x).Повторное использование geo_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)]

1 Ответ

0 голосов
/ 27 ноября 2018

Это может быть полезно:

Есть ли способ оптимизировать скорость вызова shapely.geometry.shape.contains (a_point)?

https://gis.stackexchange.com/questions/102933/more-efficient-spatial-join-in-python-without-qgis-arcgis-postgis-etc/165413#165413

(не проверено). Я считаю, что самый быстрый способ сделать это - разделить ваш Polygon на множество меньших Polygon с, затем использовать geopandas.tools.sjoin.

...