对于具有经度和纬度列的pyspark数据框,查看点(经度和纬度)是否位于多边形内的最佳做法是什么?

时间:2018-10-26 20:58:11

标签: dataframe pyspark shapely.geometry

查看点(经度和纬度)是否位于多边形内的最佳实践是什么?我有一个带有列-ID,纬度,经度的pyspark数据框。

df_event = sc.parallelize([
['a',33.765557,-84.369011],
['b',33.765526, -84.368416],
['c',33.766233, -84.364824]
]).toDF(('id', 'latitude','longitude'))

下面是多边形

v0 = [33.765499, -84.368708]   
v1 = [33.765489, -84.368043]  
v2 = [33.764821, -84.368053]  
v3 = [33.764816, -84.368729]  
lats_vect = np.array([v0[0],v1[0],v2[0],v3[0]])  
lons_vect = np.array([v0[1],v1[1],v2[1],v3[1]])  
lons_lats_vect = np.column_stack((lons_vect, lats_vect))  
polygon = Polygon(lons_lats_vect)

有没有办法使用它来查看pyspark数据框的经度和纬度位于此多边形内。我可以匀称使用吗?我在下面有一个函数,但会引发错误ImportError:没有名为shapely.geometry.point

的模块
def isInBoundingBox(x,y,Polygon):
    try:
    x = float(x); y = float(y); OK = 1
    except ValueError:
        OK = 0
    if OK == 1:
        point = Point(float(x), float(y));
    return Polygon.contains(point)

我可以使用以下代码将pyspark数据框转换为pandas数据框,并且可以正常工作,但是对于庞大的数据集而言,这将非常缓慢。我想坚持使用pyspark数据框,而不要将其转换为熊猫。

df_events_pandas = df_event.toPandas()
df_events_pandas["geometry"] = df_events_pandas.apply(lambda row: 
Point(row["_longitude"], row["_latitude"]), axis=1)
df_events_pandas["polygon"] = polygon
df_events_pandas["inPolygon"] = df_events_pandas.apply(lambda row: 
(row["geometry"].within(row["polygon"])), axis = 1) 

0 个答案:

没有答案